Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C]найти в файле числа и сделать сортировку 
V
    Опции темы
ddj
Дата 10.5.2008, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 106
Регистрация: 26.2.2008

Репутация: нет
Всего: 1



задание таково:
1. Считать файл
2. Создать двуxсторонний список,которого елементы : строки (%s)
Код

struct dvipElem {
struct dvipElem *perednij;
int duom;
struct dvipElem *obratnyj

3. В двусторонний список записать слова которые состоят только из чисел. ( 12, 23697, 4 )
4. Cделать сортировку по вазрастанию этих чисел.Резултат в другом файле.
~~~~~
Мне совсем непалучилось сделать второй пункт..Но в моей программе много ошибок,
так как я только начинающий,может моглибы мне помоч их исправить.
Буду очень блогодарен.
Вот мой код :
Код

#include <stdio.h>
#include <cstdio>
#include <iostream>

FILE *fp;
char st[100];
int x;
int nn=0 
int sum=0 

void burbble(int dlina, char n[100])
{
      int i, j, temp;
      for (i = 0; i < dlina-1; i++) 
      {
         for (j = 0; j < dlina-1-i; j++)
         if (n[j+1] > n[j]) 
            {
               temp = n[j];  
               n[j] = n[j+1];
               n[j+1] = temp;
            }
      }

}

int main()
{ 
  
  if((fp=fopen("F1.txt","r"))==NULL){
      printf("ERROR,nevozmozhno otkryt' fajl\n");
          exit(1);}

while (!feof(fp))
{
fscanf(fp,"%i", &a);
sum += a;
nn++;                                   // skolko chisel v fajle  
printf("Chisel:","%nn");       //na ekran
}

{
fscanf("%s",&st);
i = 0;
while (st[i] >= '0' && st[i] <- '9') // naxodim chisla 
i++;
}
{ 
  
  if((fp=fopen("rezult.txt","w"))==NULL){
      printf("ERROR\n");
          exit(1);}
      fprintf(fp,"%c",st[i]);             // v fajl
}
{
 void burbble
 //sortiruem vypisanyje cyfry
       
  
  }
   if((fp=fopen("rezult.txt","a"))==NULL){
      printf("ERROR\n");
          exit(1);}
      
    fprintf(fp,"\n%f",st[i]);}          //dobavlajem v fajl posle sortirovki
fclose(fp);

    return 0;   
}



Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  F1.txt 0,06 Kb
--------------------
#iddj
PM MAIL   Вверх
bronislav
Дата 10.5.2008, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 334
Регистрация: 29.1.2008
Где: Украина::Донецк

Репутация: 2
Всего: 3



Что-то не нашел даже намеков на реализацию списка.

Если не занешь, как его реализовать то можешь сделать примерно так:

Код

struct Node
{
  Node* prev;
  Node* next;
  // далее идет секция данных
  // можешь делать эдементы любого типа, какого тебе надо
  // я сделаю int
  int data; 
}


И пишешь функции для работы со списком:
Код


Node* next(Node* el)
{
  return el->next;
}

Node* prev(Node* el)
{
  return el->prev;
}



Ну и т.д.
Пробуй. Что будет не понятно - помогу и подскажу.


--------------------
user posted image
иногда проще и быстрей обойти лужу, даже если кажется что она мелкая и путь напрямик короче - ведь она может скрывать открытый люк (с) mes
PM MAIL   Вверх
ddj
Дата 11.5.2008, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 106
Регистрация: 26.2.2008

Репутация: нет
Всего: 1



А сам мой код ? кто нибудь мог бы исправить ошибки ?
--------------------
#iddj
PM MAIL   Вверх
rrrFer
Дата 11.5.2008, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 11.5.2008
Где: Красноярск

Репутация: 0
Всего: 1



main.cpp:
Код

/************************************************************/
/*-------------------main.cpp-------------------------------*/
/************************************************************/
#include "globals.h"
int main(){ 
    FILE *f=fopen("F1.txt","r");
    int n,i;
    List L;
    char str[30];;
    for(i=0,rewind(f);!feof(f);i++){
        fscanf(f,"%s",str);
        n=find(str);
        if(n) L.add(n);
    }L.out();
    cout<<endl<<"after sort:"<<endl;
    L.sort(); L.out();
    getchar();return 1;
}

файл globals.h
Код

/************************************************************/
/*------------------globals.h-------------------------------*/
/************************************************************/
#include <fstream>
#include <iostream>
using namespace std;
/************************************************************/
class List{
private:
    struct node{
        node *next,*prev;
        int data;
        node(int tdat){                        //конструктор                                    
            data=tdat;
            next=0;prev=0;
        };
        node(const node &N){                //конструктор копирования
            data=N.data;
        };
    };
    node *pbeg,*pend;                        //начало/конец
public:
    List(){pbeg=0;pend=0;};                    //конструктор
    ~List();                                //деструктор
    void add(int tdat);                        //вставка в конец
    void out();                                //вывод
    void sort();
};
int find(char *str);
/************************************************************/
List::~List(){
    if(pbeg!=0){ 
        node *pv=pbeg;
        while(pv){
            pv=pv->next;
            delete pbeg;
            pbeg=pv;
        }
    }
}
void List::add(int tdat){
    node *pv=new node(tdat);            //выделил памить под новый узел
    if(pbeg==0)                            //первый узел в списке
        pbeg=pend=pv;
    else{                                    
        pv->prev=pend;                    //связывание нового с предыдущим
        pend->next=pv;                    //связывание предыдущего с новым
        pend=pv;                        //обновелние указателя на конец
    }
}
void List::out(){
    node *pv=pbeg;
    while(pv){
        cout<<pv->data<<' ';
        pv=pv->next;
    }
}
void List::sort(){
    node *pv,*hpv=pbeg;
    List tL;
    while(hpv){
        pv=hpv->next;
        while(pv){
            if(pv->data<hpv->data){
                pv->data+=hpv->data;
                hpv->data=pv->data-hpv->data;
                pv->data-=hpv->data;
                break;
            }
            pv=pv->next;
        }
        hpv=hpv->next;
    }
}
int find(char *str){
    if(strstr(str,"12")||strstr(str,"23697")||strchr(str,'4'))
        return atoi(str);
    return 0;
}


Это сообщение отредактировал(а) rrrFer - 11.5.2008, 15:36
PM MAIL WWW ICQ   Вверх
bronislav
Дата 11.5.2008, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 334
Регистрация: 29.1.2008
Где: Украина::Донецк

Репутация: 2
Всего: 3



rrrFer, если ты не заметил, то 
ddj нужна реализация списков на C а не на С++ (классов в C нет).



ddj, А что там за ошибки? Если чесно я его практически не смотрел.


--------------------
user posted image
иногда проще и быстрей обойти лужу, даже если кажется что она мелкая и путь напрямик короче - ведь она может скрывать открытый люк (с) mes
PM MAIL   Вверх
rrrFer
Дата 11.5.2008, 19:03 (ссылка)  | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 11.5.2008
Где: Красноярск

Репутация: 0
Всего: 1



ddJ
гыгы ну убери строки public и private а еще слово class замени на struct 
граждане отжигаете ваще

Это сообщение отредактировал(а) rrrFer - 11.5.2008, 19:05
PM MAIL WWW ICQ   Вверх
bronislav
Дата 11.5.2008, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 334
Регистрация: 29.1.2008
Где: Украина::Донецк

Репутация: 2
Всего: 3



rrrFer, ну да а также cin -> scanf, cout -> printf


--------------------
user posted image
иногда проще и быстрей обойти лужу, даже если кажется что она мелкая и путь напрямик короче - ведь она может скрывать открытый люк (с) mes
PM MAIL   Вверх
t_gran
Дата 12.5.2008, 07:13 (ссылка)  | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

Репутация: нет
Всего: 37



rrrFer, так взял бы и переделал.

Цитата

граждане отжигаете ваще

Если для тебя это просто, это ещё не значит, что можно так высказываться.

Добавлено через 3 минуты и 13 секунд
По части кода:
1. Реализацию никогда не пихают в заголовочник.
2. Если пишешь на C++, то пиши до конца и не смешивай его с C.


--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
rrrFer
Дата 12.5.2008, 08:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 11.5.2008
Где: Красноярск

Репутация: 0
Всего: 1



t_gran
Цитата

2. Если пишешь на C++, то пиши до конца и не смешивай его с C.

к чему это?

Это сообщение отредактировал(а) rrrFer - 12.5.2008, 13:20
PM MAIL WWW ICQ   Вверх
ddj
Дата 12.5.2008, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 106
Регистрация: 26.2.2008

Репутация: нет
Всего: 1



rrrFer, огромное спасибо.. так как полностю на С будет выгледеть код ? потому-что на С++ мне ненадо,а на С надо.Спасибо за панимание
--------------------
#iddj
PM MAIL   Вверх
opjox
Дата 12.5.2008, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 17.1.2008

Репутация: 2
Всего: 14



rrrFer, «гражданин, отжигаете ваще» smile
Говоря о переводе кода с С++ на С, вы упомянули только лишь о вершине айсберга, а вот о подводной части...  
user posted image
В Си структуры не могут иметь конструкторы, деструкторы, функции-члены и другой доли возможностей ООП. Функции для работы со списком не будут иметь указатель this, который можно было опускать в коде, и потребуют явный указатель для работы со списком, который придется передавать как параметр функции. 
Помимо этого, в Си также нет ссылок.

На что же это нам (точнее ddj’ю) принесет? Это принесет нужда в правке почти каждой строчки приведенного вами кода. Хорошо, что его немного. 

Цитата(ddj @  10.5.2008,  12:18 Найти цитируемый пост)
Но в моей программе много ошибок


Какие жалобы?
ddj, отформатируй свой код, в данном виде он плохо читаем. Т.е сделай из:

Код

int main()
{ 
  
  if((fp=fopen("F1.txt","r"))==NULL){
      printf("ERROR,nevozmozhno otkryt' fajl\n");
          exit(1);}

while (!feof(fp))
{
fscanf(fp,"%i", &a);
sum += a;
nn++;                                   // skolko chisel v fajle  
printf("Chisel:","%nn");       //na ekran
}

...


Примерно так:

Код

int main()
{ 
  
  if((fp=fopen("F1.txt","r"))==NULL) {
    printf("ERROR,nevozmozhno otkryt' fajl\n");
    exit(1);
  }

  while(!feof(fp)) {
    fscanf(fp,"%i", &a);
    sum += a;
    nn++;                    // сколько чисел в файле  
    printf("Chisel:","%nn");       //на экран
  }

...


В 45 строчке у тебя похоже опечатка, которая бросилась в глаза:
Код

while (st[i] >= '0' && st[i] <- '9')

может так надо? :
Код

while (st[i] >= '0' && st[i] <= '9')

PM MAIL ICQ   Вверх
rrrFer
Дата 12.5.2008, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 11.5.2008
Где: Красноярск

Репутация: 0
Всего: 1



ddj
я думаю что твой код труднее переделать, чем написать заново.
кроме того я раз 10 прочитал твое сообщение, датированное  10.5.2008, 12:18 и не увидел там что надо именно на С а не на С++
все же мне кажется что несложно переписать мой вариант на С, неужели проблема вынести функции члены из структуры?
ну да - еще указатель на список им передать, хотя можно вообще глобальным обьявить(я в курсе что это не хорошо smile)
алогоритм остается тем же.
Кстати, почему такое ограничение(С а не С++)?
PM MAIL WWW ICQ   Вверх
ddj
Дата 12.5.2008, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 106
Регистрация: 26.2.2008

Репутация: нет
Всего: 1



rrrFer, 
Цитата

я раз 10 прочитал твое сообщение, датированное  10.5.2008, 12:18 и не увидел там что надо именно на С а не на С++

заголовок темы же :  . [C]найти в файле числа и сделать сортировку
[C] это и показывает что на С надо написать
Цитата

Кстати, почему такое ограничение(С а не С++)?

праграма на учебку.. а там С а не С++

opjox, 
Код

#include <stdio.h>
#include <cstdio>
#include <iostream>

FILE *fp;
char st[100];
int x;
int nn=0 
int sum=0 

void burbble(int dlina, char n[100])
{
      int i, j, temp;
      for (i = 0; i < dlina-1; i++) 
      {
         for (j = 0; j < dlina-1-i; j++)
         if (n[j+1] > n[j]) 
            {
               temp = n[j];  
               n[j] = n[j+1];
               n[j+1] = temp;
            }
      }

}

int main()
   { 
  
 if((fp=fopen("F1.txt","r"))==NULL){
      printf("ERROR,nevozmozhno otkryt' fajl\n");
          exit(1);
    }

    while (!feof(fp)){
      fscanf(fp,"%i", &a);
      sum += a;
      nn++;                                   // skolko chisel v fajle  
      printf("Chisel:","%nn");     //na ekran
  
    }

   {  
    fscanf("%s",&st);
    i = 0;
    while (st[i] >= '0' && st[i] <='9') // naxodim chisla 
    i++; }

   { 
  
  if((fp=fopen("rezult.txt","w"))==NULL){
      printf("ERROR\n");
          exit(1);}
      fprintf(fp,"%c",st[i]);   // v fajl
    }         


 { 
    void burbble
   //sortiruem vypisanyje cyfry
 }

   if((fp=fopen("rezult.txt","a"))==NULL){
      printf("ERROR\n");
          exit(1);}
      
    fprintf(fp,"\n%f",st[i]);}          //dobavlajem v fajl posle sortirovki
    fclose(fp);

    return 0;   

}



rrrFer, 
Цитата

я думаю что твой код труднее переделать, чем написать заново.


нум может быть, просто я начинающий в этом деле .. Хочу что бы ктонибудь помог мне 
--------------------
#iddj
PM MAIL   Вверх
rrrFer
Дата 12.5.2008, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 11.5.2008
Где: Красноярск

Репутация: 0
Всего: 1



ddjнасчет ошибок:
забыл поставить ; после:
 
Код

int nn=0 
int sum=0 

в первом цикле в main(){...} используешь необьявленную ранее переменную(a):
Код

while (!feof(fp)){
      fscanf(fp,"%i", &a);
      sum += a;
      nn++;
      printf("Chisel:","%nn");
}               

сразу после этого цикла написано:
Код
 
{  
    fscanf("%s",&st);
    i = 0;
    while (st[i] >= '0' && st[i] <='9') // naxodim chisla 
    i++; 
}

убери фигурные скобочки - они не к чему и кроме того, в функцию fscanf(...); забыл передать имя файла первым параметром, т.е. надо так:
Код

    fscanf(fp,"%s",&st);
    i = 0;
    while (st[i] >= '0' && st[i] <='9') // naxodim chisla 
    i++; 

дальше у тебя много где стоят лишние фигурные скобки(или может я не в курсе и в С так обозначались комменты - как в паскале?)
еще т.к. ты используешь один и тот же указатель на файл то неплохобы закрывать файл, перед тем, как очередной раз открыть.
если бы мне дали подобный листинг, я бы никогда не догадался что же должна была делать программа, не думая о том как это должно работать, я подправил код(исправил синтаксические ошибки):
Код

#include <stdio.h>
#include <cstdio>
#include <iostream>
void burbble(int dlina, char n[100]){
    int i, j, temp;
    for (i = 0; i < dlina-1; i++){
        for (j = 0; j < dlina-1-i; j++)
            if (n[j+1] > n[j]){
                temp = n[j];  
                n[j] = n[j+1];
                n[j+1] = temp;
            }
    }
}
int main(){
    FILE *fp;
    char st[100];
    int x,nn=0,sum=0,i,a;
    fp=fopen("F1.txt","r");
    while (!feof(fp)){
        fscanf(fp,"%d", &a);
        sum += a;
        nn++;                                   
        printf("Chisel: %d\n",nn);     
    }
    fscanf(fp,"%s",&st);
    for(i=0;st[i] >= '0'&&st[i]<='9';i++){}
    fclose(fp);
    fp=fopen("rezult.txt","w");
    fprintf(fp,"%c",st[i]);     
    burbble(nn,st);
    fclose(fp);
    fp=fopen("rezult.txt","a");
    for(i=0;i<nn;i++)
        fprintf(fp,"%c ",st[i]);
    getchar();
    fclose(fp);
    return 1;   
}

ну естественно несмотря на отсутствие списка оно не работает как надо
непонятно что ты уже тут пытаешься достичь:  fscanf(fp,"%s",&st);  особенно если заметить что это идет после цикла, на выходе из которого feof(fp), то есть в st считается NULL. И еще по крайней мере надо было написать fscanf(fp,"%s",st); тоесть & не нужен.

Это сообщение отредактировал(а) rrrFer - 12.5.2008, 19:59
PM MAIL WWW ICQ   Вверх
ddj
Дата 12.5.2008, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 106
Регистрация: 26.2.2008

Репутация: нет
Всего: 1



только жалко программа моя эта непаботает :/ 

--------------------
#iddj
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0615 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.