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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Файл&структура 
:(
    Опции темы
Pitc
  Дата 9.5.2005, 13:50 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











В файл записаны структуры (struct {char fm[50]; float money;} people; где fm - ФИО)
Требуется упорядочить структуры в файле по алфавиту. Может кто подскажет как это лучше сделать?Стандартные функции сортировки использовать нельзя. smile
  Вверх
gepard
Дата 9.5.2005, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



В чём проблема-то?
Файл:
Цитата

Лохов Друг Генадиевич 5.00$
Иванов Дмитрий Кропоткович 999.00$

Упорядочивать надо, считывая из файла вв структуру, сравнивая ASCII коды символов(букв)
Вот и всё.


--------------------
Когда начинаются цифровые войны, а траффик разносит моё сознание по бесконечным просторам инета, подобно ветру, разносящему листву по полям, тогда и только тогда я чувствую себя свободным!
© Я, Берсерк, что значит - Неистовый. 
PM MAIL WWW ICQ   Вверх
Lamak
Дата 9.5.2005, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Считать всё из файла в массив,упорядочить как рассказал qepard,и записать обратно в файл.
[quote]Вот и всё.
--------------------
Роботы - это интересно и увлекательно! 
PM MAIL   Вверх
Pitc
Дата 10.5.2005, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



smile Спасибо с сортировкой разобрался. Но теперь возникла другая проблема.
Не могу понять , где допустил ошибку:
Код

void Sort()
{       struct Det {char fm[50];float money;};
        const int N=3;
        FILE *f;
        int i,j,k=0;
        char * fm1[N];
        float money1[N];
        Det people;
        //чтение из файла
        f=fopen("1.txt","r");
            while(1){
                if(feof(f) || k==N) break;
        fscanf(f,"%s",&people.fm);
        cout << people.fm << endl;
        fscanf(f,"%f\n",&people.money);
        cout << people.money << endl;
//--------------------------
        //запись в массив
        cout << "\n\n\n";          //Вроде ошибка где-то здесь ,а вот где именно?
        fm1[k]=people.fm;
        money1[k]=people.money;
        cout << fm1[k] << "\n"<< money1[k];
        cout << fm1[0];           // На экран нечего не выводится
        cout << "\n\n\n";
        ++k;
//---------------------------
        //сортировка
        for (i=0; i<N-1;++i)
        for(j=i+1;j<N;++j)
        if (strcmp(fm1[i], fm1[j])>0)
        {
        char *t=fm1[i];
        fm1[i]=fm1[j];
        fm1[j]=t;
        //......
         }
        }

    }
    fclose(f);

}

Проблема заключается в том, что при выводе массива fm1[] нулевой элемент не отображается.
PM MAIL ICQ   Вверх
gepard
Дата 11.5.2005, 04:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

 fscanf(f,"%s",&people.fm);

Во-первых в char пишёт без знака "&".
Код

fm1[k]=people.fm;

Что это такое? "people.fm" - это один знак "char"?
Код

char * fm1[N];

Тоже не дело.
Надо так:
Код

char* fm1 = new char[N];

Пока что это проверь...


--------------------
Когда начинаются цифровые войны, а траффик разносит моё сознание по бесконечным просторам инета, подобно ветру, разносящему листву по полям, тогда и только тогда я чувствую себя свободным!
© Я, Берсерк, что значит - Неистовый. 
PM MAIL WWW ICQ   Вверх
Pitc
Дата 17.5.2005, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



//Условие задачи такое:

организации подают списки составленные по алфавиту ( не более 50 организаций) в списках указаны фамилия, имя , отчество , доход , количество человек в семье (не более 25 семей в каждом списке ) . Требуется создать список (не более 100 семей) с минимальным доходом . В исходных списках пометить кому была оказана помощь. Вывести списки организаций и список отобранных кандидатов упорядоченный по алфавиту . Стандартные функции для сортировки и всякого токого использовать нельзя.//

Никак не получается ее сделать. Исходник того что пока сделал изложен ниже . Буду благодарен если кто поможет.
Код

#include "stdafx.h"
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <stdlib.h>
//#include <fstream.h>

using namespace std;

struct pi{char fm[20]; int money;int kol;int flag;};
struct peo{
    pi p[25];
    int c;
} people[50],pe[50];
int n,N;

int menu()
{       int n;
        cout << "\nVuberite punkt menu\n";
        cout << "_______________________\n";
        cout << "1-Vvod dannux\n";
        cout << "2-Vuvod dannux\n";
        cout << "3-Sortirovka\n";
        cout << "4-Exit\n";
        cout << "_______________________\n\n";
        cin >> n;
        return n;
}

void Input(void);
void Output(void);
void Sort(void);
void Find(void);

void events(int n)
{       switch(n)
        {
        case 1: Input(); break;
        case 2: Find(); break;
        /*case 2: Output(); break;
        case 3: Sort(); break;*/
        case 4: exit(0);
        default : menu(); break;
        }

}
//---------------------------------------
void Input(void)
{        int i=0,k=0,j=0;
        FILE *f;
    if ((f=fopen("data1.txt", "w"))==NULL)
    {
        cout << "erorr";
        return;
    }
        cout << "\nVvedite colichestvo organizacii :";
        cin >> N;
        for (i=0;i<N;i++)
    {
        cout << "\nVedite colichestvo semei v otcete :" << (i+1) <<":";
        cin >> people[i].c;
        
        for (j=0;j<people[i].c;j++)
        {
        fprintf(f,"%d\n",i+1);
        cout << "\nFIO: ";
        cin >> people[i].p[j].fm;
        fputs(people[i].p[j].fm,f);
        fputc('\n',f);
        cout << "\nMoney: ";
        cin >> people[i].p[j].money;
        fprintf(f,"%d\n",people[i].p[j].money);
        cout << "\nKolichestvo naroda: ";
        cin >> people[i].p[j].kol;
        fprintf(f,"%d\n",people[i].p[j].kol);
        cout << "\n______________\n";
        people[i].p[j].flag=0;
        fprintf(f,"%d\n",people[i].p[j].flag);
    }
    fclose(f);
    events(menu());
}
//------------------------------------------

void Find()
{    int o,i,j,k=0;
    FILE *f;
    if ((f=fopen("data1.txt", "w"))==NULL)
    {
        cout << "erorr";
        return;
    }
    while (1)
    {    if(feof(f)) break;
        for (i=0;i<N;i++)
            for(j=0;j<people[i].c;j++)
            {
                fflush(stdin);
        fgets(pe[i].p[j].fm,20,f);
        fscanf(f,"%d",pe[i].p[j].money);
        fscanf(f,"%d",pe[i].p[j].kol);
        fscanf(f,"%d",pe[i].p[j].flag);
            }
    }
    fclose(f);
    getch();
}

/*
void Sort()
{        int i,j;
    
        for (i=0; i<N;i++)
        for (j=0; j<n;j++)
        if    (strcmp(people[i].p[j].fm, people[i].p[j+1].fm)>0)
        {
        people[i].p[N+1]=people[i].p[j];
        people[i].p[j]=people[i].p[j+1];
        people[i].p[j+1]=people[i].p[N+1];
        }

        events(menu());


}

void Output()
{        int i,j;
        for (i=0; i<N;i++){
            cout << "\nOtobranue kondidatu :" <<"___" <<endl;
            cout << "Spisok :" << (i+1) << endl;
        for (j=0; j<n;j++)
        {
        cout << people[i].p[j].fm << endl;
        cout << people[i].p[j].money << endl;
        cout << people[i].p[j].kol << endl;
        }
        }
        events(menu());
}

/*void Find()
{    While
    for (i=0;i<N;i++)
    for (j=0;j<n;j++)
    if ()
    {
    }
    

}
*/
int main()
{        
events(menu());
return 0;
}


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


Эксперт
****


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

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



Короче жди - скоро напишу...


--------------------
Когда начинаются цифровые войны, а траффик разносит моё сознание по бесконечным просторам инета, подобно ветру, разносящему листву по полям, тогда и только тогда я чувствую себя свободным!
© Я, Берсерк, что значит - Неистовый. 
PM MAIL WWW ICQ   Вверх
Pitc
Дата 18.5.2005, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Всем спасибо программу я уже написал.
Если у кого будет такой курсачь то вот его исходник (вроде работает).
Код

//Курсовая работа
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <conio.h>

using namespace std;

struct x{char * fm;int money;int kol;int flag; int org;} ep[1250],ep1[1250],p[101];
int n,N;
// Меню
int menu()
{       
        system("cls");
        int n;
        cout << "\nVuberite punkt menu\n";
        cout << "_______________________\n";
        cout << "1-Vvod dannux\n";
        cout << "2-Vuvod dannux organizacii\n";
        cout << "3-Vuvod spiska okazania pomochi\n";
        cout << "4-Exit\n";
        cout << "_______________________\n\n";
        cin >> n;
        return n;
}
//Портатип ф-й
void Input(void);
void Output(void);
void Sort(void);
//Обработка событий
void events(int n)
{       
        switch(n)
        {
        case 1: Input(); break;
        case 2: Output(); break;
        case 3: Sort(); break;
        case 4: exit(0);
        default : menu(); break;
        }

}
// Ввод данных
void Input()
{    int i=0;
    char *ch= new char[20];
        for (i=0; i<3/*количество семей*/; i++)
        {
        ep[i].fm= new char[20];
        cout << "Vvedite fm :";
        cin >> ep[i].fm;
        cout << "Vvedite money :";
        cin >> ep[i].money;
        cout << "Vvedite kol :";
        cin >> ep[i].kol;
        cout << "Vvedite nomer organizacii :";
        cin >> ep[i].org;
        ep[i].flag=0;
        ep1[i].fm=new char[20];
    ep1[i]=ep[i];
    n=i;
    }
events(menu());
}
//Сортировка и вывод отобранных семей
void Sort()
{    int j,i;
    for (j=1;j<n+1;j++)
    for (i=0;i<n;i++)
    {
        if (ep[i].money>ep[j].money)
        {
        x z=ep[i];
        ep[i]=ep[j];
        ep[j]=z;
        }
    }
    for (i=0; i<n+1;++i)
  for(j=i+1;j<n+1;++j)
      if (strcmp(ep[i].fm, ep[j].fm)>0)
  {
  x t=ep[i];
  ep[i]=ep[j];
  ep[j]=t;
  }

    cout << "...Spisok semei dlia okazania pomochi..." << endl;
    for (i=0;i<n+1;i++)
    {    if (i>100) break;
        cout << "FIO :     " << ep[i].fm <<endl;
        cout << "Money :   " << ep[i].money <<endl;
        cout << "Kol.Chel.:" << ep[i].kol<<endl;
        cout << "__________________________________"<< endl<< endl;
    }

    for (i=0;i<n+1;i++)
        for(j=0;j<n+1;j++)
        if(strcmp(ep[i].fm,ep1[j].fm)==0)
            ep1[i].flag=1;
    getch();
    events(menu());
}
// Вывод подоваемых списков
void Output()
{    int i,s;
    cout << "....Vvedite nomer org. dlia vuvoda spiska : ...." << endl;
    cin >> s;
    cout << "Spisok organizacii №"<< s <<endl;
    for (i=0; i<n+1; i++)
        if (ep1[i].org==s)
        {
            if (ep1[i].flag>0)
            cout << "Semie okazana pomoch :"<<endl;
            cout << "FIO :     " << ep1[i].fm <<endl;
            cout << "Money :   " << ep1[i].money <<endl;
            cout << "Kol.Chel.:" << ep1[i].kol<<endl;
            cout << "__________________________________"<<endl;

        }
        getch();
        events(menu());
}

int _tmain(int argc, _TCHAR* argv[])
{    
    events(menu());
    return 0;
}


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


Инженер
****


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

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



Pitc, если бы ты еще сдвиги в коде нормально сделал, то он был стал намного понятней. Да и ты бы сам лучше в нем ориентировался.
Например я бы написал не так:
Код

void events(int n)
{       
        switch(n)
        {
        case 1: Input(); break;
        case 2: Output(); break;
        case 3: Sort(); break;
        case 4: exit(0);
        default : menu(); break;
        }

}

а так:
Код

void events(int n)
{       
        switch(n)
        {
                 case 1:
                           Input();
                           break;
                 case 2:
                           Output();
                           break;
                 case 3:
                           Sort();
                           break;
                 case 4:
                           exit(0);
                 default :
                           menu();
                           // break; // оно здесь нужно ???
        }

}

От компактной писанины программа (в результате компилирования) короче не будет!


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0534 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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