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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сортировка в файле 
:(
    Опции темы
None
Дата 30.6.2005, 14:35 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











люди !!Помогите добить задачу!
#include<iostream.h>
#include<string.h>
#include<conio.h>
#include<fstream.h>
clrckr();
const int len_File=15; // максимальная длина имени файла
const int lenString=70;
// объявляю структуру, содержащую информацию о студенте
struct student {
char * familiya; //фамилия
};
void printstudent (student&my)// объявляю функцию печати в последующем по алфавиту
// базы данных
{
static int nomer=0;
cout<<++nomer<<my.familiya<<endl;
}
struct record {
student sourse ;
record *before;// завожу указатель на предыдущий элемент
record *next;// указатель на следующий элемент
};
void main()
{
char nam[len_File];
cout<<" vvedite name file: "<<endl;
cin>>nam;
ifstream inFile;// входной файловый поток
inFile.open(nam);// функция по открытию файла "sourse" и связать его с потоком "InFile"
if (!inFile) // проверка правильности введённого файла
{cerr<< "Error open File"<<nam;
exit(1); // выход
}
char string[lenString];
char next;
cout<<"\n text _File:\n\n";
cin.get();
while(1)
{
inFile>>string;// ввод слова из файла до пробела

next=inFile.peek();// проверка следующего слова
if (next==EOF)
break;
}
student sourse[]={string}; // ВОТ ТУТ И ПРИКОЛ не могу поместить это в цикл
//разрыв
char str[20];
record *begin=NULL,
*last=NULL,
*list;
int n=sizeof(sourse)/sizeof(sourse[0]);
for (int i=0;i<n;i++)
{
last=new(record);// создать новую запись
last->sourse.familiya=sourse[i].familiya;
if (begin==NULL)//списка ещё нет
{
last->before=NULL;
begin=last; last->next=NULL;
}
else
{ // список уже существует
list=begin;
while(list)
{
if (strcmp(last->sourse.familiya,list->sourse.familiya)< 0 )
{ // вставить новую запись пред list
if (begin==list)
{
last->before=NULL;
begin=last;
}
else
{ // вставка между записями
list->before->next=last;
last->next=list->before;
}
list->before=last;
last->next=list;
break;
}
if (list->next==NULL)
{ // включить запись в конец списка
last->next=NULL;
last->before=list;
list->next=last;
break; // выйти из цикла
}
list=list->next;
}
}
}
cout<<"vvedite poisk studenta"<<endl;
gets(str);
list=begin;
while(list)// цикл поиска заданного элемента списка
{
if (strcmp(list->sourse.familiya,str)==0)
{
cout<<"naiden"<<endl;
printstudent (list->sourse);
}
list=list->next;
}
list=begin;
cout<<endl;
cout<<"baza po alfavit"<<endl;
while(list) // цикл печати по алфавиту
{
printstudent (list->sourse);
list= list->next;
}
getch();
}

















Код


Код



  Вверх
comcon1
Дата 30.6.2005, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: 12
Всего: 17



Во первых, нужно указать void:
Код

 void clrckr();


Во-вторых: сначала создай массив:
Код

student  *source = new source[400];

а потом уже в цикле пиши внутри цикла..
(и проверь, что у тебя не больше 400 записей в файле)
Код

inFile >> source[i];


И вообще организуй список отдельно и сделай функции добавления в конец. И сразу читай из файла, и пристыковывай к списку. А еще в iostream-е файлы надо открывать с указанием "на чтение" или "на запись"...
Код

inFile.open("filename",ios::in);

А еще хорошо бы приучиться new-отведенную память освобождать.
Добавлено @ 15:41
А во вторых - мы за тебя все не подрядились делать. Выясни, что КОНКРЕТНО не работает. И спрашивай КОНКРЕТНО. Глюков у тебя там навалом еще.

Так что "добить" это не называется. Выкидывай куски и смотри, какие не работают, какие работают. Те, которые не работают, если совсем не понимаешь почему - отправляй сюда. Поможем. Но сначала - сам думай.

А еще отредактируй сообщение и оформи код по человечески, а то я в Vi копировал, чтоб прочитать smile. А еще я G++ запускал, чтобы посмотреть, где ругань. Так что выписывай еще в конце ошибки, которые выдает компилятор, чтобы мы этим не занимались.

Это сообщение отредактировал(а) comcon1 - 30.6.2005, 16:01


--------------------
PM MAIL   Вверх
Earnest
Дата 30.6.2005, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Цитата(comcon1 @ 30.6.2005, 15:37)
А еще в iostream-е файлы надо открывать с указанием "на чтение" или "на запись"...

Ну, в общем, не обязательно - поток объявлен как ifstream - это и так поток ввода.

Цитата
student sourse[]={string}


Это, конечно, не в какие ворота не лезет, хоть внутрь цикла, хоть снаружи пиши.
Сначала нужно выделить память под массив, как сказал common1. Кроме того, student - это структура, а ты пытаешься приравнять ей строку. Не бывает.

И еще один прикол:

Код

struct student {
    char * familiya; //фамилия
};


Ну, допустим, напишешь ты

Код

source->familiya = string;


Угадай, что будет при чтении следующей строки?

Короче, нужно сначала привести эту помойку в порядок, а потом уж ошибки вылавливать.


--------------------
...
PM   Вверх
Guest
Дата 30.6.2005, 18:21 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











А.....Нда... Я когда из файла считываю информацию, там должен ведь быть какой-нибудь буфер обмена данными? Вот. А потом, наверное, с этим буфером работаь-сортировать в нём инфо. Предположем всё снесу и останется
Код

{
char nam[len_File];
cout<<" vvedite name file: "<<endl;
cin>>nam;
ifstream inFile;// входной файловый поток
inFile.open(nam);// функция по открытию файла "sourse" и связать его с потоком "InFile"
if (!inFile) // проверка правильности введённого файла
{cerr<< "Error open File"<<nam;
exit(1); // выход
}
char string[lenString];
char next;
cout<<"\n text _File:\n\n";
cin.get();
while(1)
{
inFile>>string;// ввод слова из файла до пробела

next=inFile.peek();// проверка следующего слова
if (next==EOF)
break;
}



и как мне все слова в массив загнать???
  Вверх
Earnest
Дата 30.6.2005, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Ну, например, для начала объявим структуру student немного по-другому:

Код

struct student {
    char familiya[lenString]; //фамилия
};

// еще объявляем list по-удобнее
struct _list
{
    record *first,*last;
};

// и операцию вставки в список
void insert_to_list(list&,const student&)
{
   // операцию поиска правильного места для вставки тоже нужно выделить в отдельную    функцию
   ...
}



Для чтения из файла достаточно одного элемента student:
Код


_list list;

student item;
while(1)
{
   inFile>>item.familia; // ввод слова из файла до пробела

   // вставляем item в нужное место списка
   insert_to_list(list,item);   // это очень приблизительный синтаксис
   ...
}


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

Это сообщение отредактировал(а) Earnest - 30.6.2005, 19:29


--------------------
...
PM   Вверх
comcon1
Дата 1.7.2005, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: 12
Всего: 17



Люди, оформляйте код, как code=cpp, а не просто code. Так он еще и расскрасится...


--------------------
PM MAIL   Вверх
None
Дата 2.7.2005, 10:20 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Люди, я дурак, согласен, но мне позарез нужна прога,мне некогда с ней сеёчас возиться,
Всё-таки. наверное, через массив будет лучше, а что если использовать ASCI коды, поместить их в массив, а потом сортировать, я просто не очень понимаю, как мне с этими буквами вмассиве возиться .
  Вверх
comcon1
Дата 2.7.2005, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: 12
Всего: 17



Конкретно!
Пишешь в массив. (коряво, конечно, но сойдет)
Код

int i=0;
array = new (char*)[400];
do {
 array[i] = new char[300];
 inFile >> array[i];
 i++;
 if (i = 400) {
   stderr << "Your file is too long!\n";
   exit(1);
 }
} while(inFile.peek() != EOF)
array[i] = NULL; // концовку массива затыкаешь нулем

Теперь массив перехреначиваешь в список. Тебе нужно по алфавиту?? Тогда будем сразу по алфавиту...
Код

 for (int j=0; array[j]; ++j)
   insert_alph(array[i]);  

Теперь напишем две функции: insert и insert_alph вот таким образом. Если твой элемент списка:
Код

struct student {
 student *prev, *next;
 char *data;
}
// тогда процедура вставки:
void insert(student *_prev, student *_nxt, const char *_str) {
 student *_new = new student;
 _new.prev = _prev;
_new.next = _nxt;
_new.data = strdup(_str);
// устанавливаем ссылки на него
_prev->next = _new;
_nxt->prev = _new;
}
// и процедура вставки по алфавиту
void insert_alph(student *_frst, student *_lst, const char *_str) {
 student *cur = _frst;
 do {
 if ( (_str < cur->next->data) && (cur->data > _str) )
    insert(cur, cur->next, _str);
 cur = cur->next;
} while (cur != _lst);
}

Фух. Ну осталось только перегрузить оператор ...
Код

bool operator >(const char *_s1, const char *_s2);

..., который будет на вопрос s1 > s2 выдавать true, если они в алфавитном порядке и false в обратном случае. Но это ты уж сделай сам.


--------------------
PM MAIL   Вверх
Step
Дата 3.7.2005, 00:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5151
Регистрация: 26.9.2002
Где: дурдом.UA

Репутация: 5
Всего: 25



вот работает
Код


#pragma hdrstop
#include <condefs.h>


//---------------------------------------------------------------------------
#pragma argsused

#include <vector>
#include <string>
#include <algorithm>
#include <fstream>
#include <iostream>

using namespace std;
class c_stud{
    friend istream& operator>>(istream& in,  c_stud& c){
        for (int i=0;i<5;i++) {
            c.oc.push_back(0);            
        }    
        istream& rez= in >> c.numbook >> c.famil >> c.oc[0]>> c.oc[1]>> c.oc[2]>> c.oc[3]>> c.oc[4];
        
        return rez;
    }
    friend ostream& operator<<(ostream& out, const c_stud& c){
        return out << c.numbook << '\t' << c.famil << '\t'
            << c.oc[0] <<' '<< c.oc[1]<<' '<< c.oc[2]<<' '<< c.oc[3]<<' '
            << c.oc[4]<<' '<< '\t' << c.GetAverage();
    }
private:
    int numbook;
    string famil;
    vector<int> oc;
public:
    int GetBook(){
        return numbook;
    }
    string GetFamil(){
        return famil;
    }
    double GetAverage()const{
        double avr=0;
        for (int i=0;i<5;i++) {
            avr+=oc[i];
        }
        avr=avr/5;
        return avr;
    }
    char GetOc(int n) const{
        
        return oc[n];
    }
};

bool sortByAZFamil(c_stud c1, c_stud c2)
{
    return c1.GetFamil() < c2.GetFamil();
}
void writeCountry(const c_stud& c1)
{
    cout << c1 << endl;
}
class WriteIfGreaterThan
{
    ostream& out;
    double value;
public:
    WriteIfGreaterThan(ostream& strm, double newValue)
        : value(newValue), out(strm) { }
        void operator()(const c_stud& c)
        { 
            if (c.GetAverage() >= value) 
                out << c << endl;
        }
};
int main(int argc, char* argv[])
{
    vector<c_stud> c;
    c_stud c1;
    ifstream in("group.txt");
    while (in >> c1)
        c.push_back(c1);
    sort(c.begin(), c.end(), sortByAZFamil);
    for_each(c.begin(), c.end(), writeCountry);
    cout << endl;
    for_each(c.begin(), c.end(), WriteIfGreaterThan(cout, 4));
    ofstream outFile("Result.txt");
    for_each(c.begin(), c.end(), WriteIfGreaterThan(outFile, 4));
    cin.get();
    return 0;

}



файл данных
Код

001 Ivanov 5 4 3 2 1
002 Petrov 5 5 4 4 3
003 Sidorov 4 4 3 3 2
004 Kozlov 4 4 4 4 4
005 Bobrov 2 2 2 5 5




может слегка не под твою задачу но работает и не только сортирует а еще и фильтрует по среднему балу


--------------------
- Дурак учится на своих ошибках, умный на чужих.
 - умные учатся у дураков
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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