Сортировка

Тема в разделе "C/C++/C#", создана пользователем Adm1n, 19 ноя 2012.

  1. Adm1n

    Adm1n Гость

    Написал прогу по считыванию данных с файла и вывод на экран человека, месяц которого мы вводим с клавиатуры. Вообщем прошу помочь с сортировкой. Задание заключается в следующем: записи должны быть упорядочены по знакам зодиака. Файл с текстом прикрепил(откуда идет считывание). Спасибо заранее.

    Код (C++):
    #include <iostream>
    #include <iomanip>
    #include <cstring>

    using namespace std;

    struct ZNAK // объявление структуры ZNAK
    {
    char l_name[100]; // имя и фамилия
    char l_zodiak[15]; // знак зодиака
    int l_bday[3]; // дата рождения
    };

    int main()
    {

    setlocale ( LC_ALL, "Russian" );

    const int size_array = 8; // количество записей ( должно быть 8 )
    ZNAK book[size_array];
    int counter_rec = 0; // счётчик записей

    char buf[100];

    FILE*file=fopen("C:\\7.5\\7.5\\123.txt","r");

    for (int counter_rec = 0; counter_rec < size_array; counter_rec++)
    {
    fgets(book[counter_rec].l_name,100,file);
    fgets(book[counter_rec].l_zodiak,15,file);
    fgets(buf,100,file);
    book[counter_rec].l_bday[0]=atoi(buf);
    fgets(buf,100,file);
    book[counter_rec].l_bday[1]=atoi(buf);
    fgets(buf,100,file);
    book[counter_rec].l_bday[2]=atoi(buf);
    }

    cout << endl;
    for (int counter_rec = 0; counter_rec < size_array; counter_rec++)
    {
    cout << book[counter_rec].l_name; // имя и фамилия
    cout << book[counter_rec].l_zodiak; // знак зодиака
    cout << book[counter_rec].l_bday[0] << "." << book[counter_rec].l_bday[1] << "." << book[counter_rec].l_bday[2] << endl << endl; // дата рождения
    }


    cout << endl;
    int month = 0;
    cout << "Введите порядковый номер месяца: ";
    cin >> month;
    if (month < 1 || month > 12)
    {
    cout << "Месяц указан не корректно!" << endl;
    //return 0;
    }
    else
    {
    // печать записей, месяц которых совпадает с введённым
    cout << endl;
    bool no_records = false; // переменная-флаг, отвечающая за существование записей, месяц которых равен введённому
    for (int counter_rec = 0; counter_rec < size_array; counter_rec++)
    {
    if (book[counter_rec].l_bday[1] == month) // если совпадает номер месяца в записи с введённым с клавиатуры
    {
    no_records = true;
    cout << book[counter_rec].l_name; // имя и фамилия
    cout << book[counter_rec].l_zodiak; // знак зодиака
    cout << book[counter_rec].l_bday[0] << "." << book[counter_rec].l_bday[1] << "." << book[counter_rec].l_bday[2] << endl << endl; // дата рождения
    }
    }
    if (!no_records) cout << "Нет людей родившихся " << month << " месяца." << endl;
    }



    system("pause");
    return 0;
    }
    Добавлено: Вот та же прога, ввод данных с клавиатуры(а мне надо чтение с файла)

    Код (C++):
    #include <iostream>
    #include <iomanip>
    #include <cstring>

    using namespace std;

    int getIntZodiak(char * str); // прототип функции, которая возвращает порядковый номер знака зодиака

    struct ZNAK // объявление структуры ZNAK
    {
    char l_name[50]; // имя и фамилия
    char l_zodiak[12]; // знак зодиака
    int l_bday[3]; // дата рождения
    };

    const char *sign_zodiak[12] = {"Oven", "Telec", "Bliznec", "Rak" , "Lev", "Deva",
    "Vesy", "Scorpion", "Strelec", "Kozerog", "Vodoley", "Ryby" }; // порядок следования знаков зодиака

    int main()
    {

    setlocale ( LC_ALL, "Russian" );

    const int size_array = 2; // количество записей ( должно быть 8 )
    ZNAK book[size_array]; // объявляем массив структур
    int counter_rec = 0; // счётчик записей

    cout << "Сортировать будем в следующей последовательности: " << endl;
    cout << " 1. Oven (Овен)" << ' ' << "       2. Telec (Телец) " << ' ' << "   3. Bliznec (Близнецы) " << endl
    << " 4. Rak (Рак) "<< ' ' << "       5. Lev (Лев) " << ' ' << "         6. Deva (Дева) " << endl
    << " 7. Vesy (Весы)"<< ' ' << "     8. Scorpion (Скорпион) " << ' ' << " 9. Strelec (Стрелец) " << endl
    << " 10. Kozerog (Козерог)"<< ' ' << " 11. Vodoley (Водолей) " << ' ' << " 12. Ryby (Рыбы) " << endl;


    while (counter_rec < size_array) // пока не внесено 8 записей
    {
    cout << "Введите имя и фамилию через пробел: ";
    cin.getline(book[counter_rec].l_name, 50);
    cout << "Введите знак зодиака: ";
    cin.getline(book[counter_rec].l_zodiak, 12);

    bool exist = false;

    for (int counter = 0; counter < 12; counter++)
    {
    if (!strcmp(sign_zodiak[counter], book[counter_rec].l_zodiak))
    exist = true;
    }
    if (exist)
    {
    cout << "Введите дату рождения в формате (дд.мм.гггг) ";
    cin >> (book[counter_rec].l_bday[0]); // считать первые два символа, т.е. день
    cin.ignore(); // пропустить символ точки
    if (book[counter_rec].l_bday[0]<1 || book[counter_rec].l_bday[0]>31)
    {
    cout << "Вы ввели неверное число дд. ! " << endl;
    system("pause");
    return 0;
    }
    else
    {
    cin >> book[counter_rec].l_bday[1]; // считать следующие два символа, т.е. месяц
    cin.ignore(); // пропустить символ точки
    if (book[counter_rec].l_bday[1]<1 || book[counter_rec].l_bday[1]>12)
    {
    cout << "Вы ввели неверное число мм. ! " << endl;
    system("pause");
    return 0;
    }
    else
    {
    cin >> book[counter_rec].l_bday[2]; // считать четыре символа, т.е. год
    cin.get(); // считываем символ новой строки '\n'

    counter_rec++; // инкремент счётчика записей
    }
    }
    }
    else
    return 0;
    }

    // сортировка записей в массиве структур
    for (int ctr1 = 0; ctr1 < size_array; ctr1++)
    {
    for (int ctr2 = ctr1 + 1; ctr2 < size_array; ctr2++)
    {
    if (getIntZodiak(book[ctr1].l_zodiak) > getIntZodiak(book[ctr2].l_zodiak)) // если порядок не правильный, то поменять местами записи
    {
    char temp_name[50]; // временная переменная для перестановки строк: имя и знак зодиака

    // перестановка имён
    strcpy(temp_name, book[ctr1].l_name); // копирование из book[ctr1].l_name в temp_name
    strcpy(book[ctr1].l_name, book[ctr2].l_name); // копирование из book[ctr2].l_name в book[ctr1].l_name
    strcpy(book[ctr2].l_name, temp_name); // копирование из temp_name в book[ctr2].l_name

    // перестановка знака зодиака
    strcpy(temp_name, book[ctr1].l_zodiak); // копирование из book[ctr1].l_zodiak в temp_name
    strcpy(book[ctr1].l_zodiak, book[ctr2].l_zodiak); // копирование из book[ctr2].l_zodiak в book[ctr1].l_zodiak
    strcpy(book[ctr2].l_zodiak, temp_name); // копирование из temp_name в book[ctr2].l_zodiak

    int temp_data[3] = {book[ctr1].l_bday[0], book[ctr1].l_bday[1], book[ctr1].l_bday[2]}; // временный массив, для обмена д.р.

    // перестановка дат рождения
    book[ctr1].l_bday[0] = book[ctr2].l_bday[0];
    book[ctr1].l_bday[1] = book[ctr2].l_bday[1];
    book[ctr1].l_bday[2] = book[ctr2].l_bday[2];
    book[ctr2].l_bday[0] = temp_data[0];
    book[ctr2].l_bday[1] = temp_data[1];
    book[ctr2].l_bday[2] = temp_data[2];

    }

    }

    }  

    cout << endl;
    for (int counter = 0; counter < size_array; counter++)
    {
    cout << book[counter].l_name << endl; // имя и фамилия
    cout << book[counter].l_zodiak << endl; // знак зодиака
    cout << book[counter].l_bday[0] << "." << book[counter].l_bday[1] << "." << book[counter].l_bday[2] << endl; // дата рождени
    }


    cout << endl;
    int month = 0;
    cout << "Введите порядковый номер месяца: ";
    cin >> month;
    if (month < 1 || month > 12)
    {
    cout << "Месяц указан не корректно!" << endl;
    //return 0;
    }
    else
    {
    // печать записей, месяц которых совпадает с введённым
    cout << endl;
    bool no_records = false; // переменная-флаг, отвечающая за существование записей, месяц которых равен введённому
    for (int counter = 0; counter < size_array; counter++)
    {
    if (book[counter].l_bday[1] == month) // если совпадает номер месяца в записи с введённым с клавиатуры
    {
    no_records = true;
    cout << book[counter].l_name << endl; // имя и фамилия
    cout << book[counter].l_zodiak << endl; // знак зодиака
    cout << book[counter].l_bday[0] << "." << book[counter].l_bday[1] << "." << book[counter].l_bday[2] << endl; // дата рождения
    }
    }
    if (!no_records) cout << "Нет людей родившихся " << month << " месяца." << endl;
    }



    system("pause");
    return 0;
    }

    int getIntZodiak(char *str) // функция возвращает порядковый номер знака зодиака
    {
    for (int counter = 0; counter < 12; counter++)
    {
    if (!strcmp(str ,sign_zodiak[counter])) // если знаки зодиака совпадают, то вернуть порядковый номер
    return counter;
    }
    return 0; // возвращаемое значение, в случае, если имя передоваемое как параметр не совпало ни с одним знаком зодиака
    }
    Добавлено: Вот помогли на другом форуме,но сортировка тоже не работает

    Код (C++):
    #include <iostream>
    #include <iomanip>
    #include <cstring>

    using namespace std;


    struct ZNAK // объявление структуры ZNAK
    {
    char l_name[100]; // имя и фамилия
    char l_zodiak[15]; // знак зодиака
    int l_bday[3]; // дата рождения

    };

    int main()
    {

    setlocale ( LC_ALL, "Russian" );

    const int size_array = 8; // количество записей ( должно быть 8 )
    ZNAK book[size_array];
    int counter_rec = 0; // счётчик записей

    cout << "Сортировать будем в следующей последовательности: " << endl;
    cout << " 1. Oven (Овен)" << ' ' << "       2. Telec (Телец) " << ' ' << "   3. Bliznec (Близнецы) " << endl
    << " 4. Rak (Рак) "<< ' ' << "       5. Lev (Лев) " << ' ' << "         6. Deva (Дева) " << endl
    << " 7. Vesy (Весы)"<< ' ' << "     8. Scorpion (Скорпион) " << ' ' << " 9. Strelec (Стрелец) " << endl
    << " 10. Kozerog (Козерог)"<< ' ' << " 11. Vodoley (Водолей) " << ' ' << " 12. Ryby (Рыбы) " << endl;

    char buf[100];

    FILE*file=fopen("C:\\7.5\\7.5\\123.txt","r");

    for (int counter_rec = 0; counter_rec < size_array; counter_rec++)
    {
    fgets(book[counter_rec].l_name,100,file);
    fgets(book[counter_rec].l_zodiak,15,file);
    fgets(buf,100,file);
    book[counter_rec].l_bday[0]=atoi(buf);
    fgets(buf,100,file);
    book[counter_rec].l_bday[1]=atoi(buf);
    fgets(buf,100,file);
    book[counter_rec].l_bday[2]=atoi(buf);
    }



    const char *sign_zodiak[12] = {"Oven", "Telec", "Bliznec", "Rak" , "Lev", "Deva",
    "Vesy", "Scorpion", "Strelec", "Kozerog", "Vodoley", "Ryby" }; // порядок следования знаков зодиака

    // сортировка записей в массиве структур
    for (int ctr1 = 0; ctr1 < size_array; ctr1++)
    {
    for (int ctr2 = ctr1 + 1; ctr2 < size_array; ctr2++)
    {
    int i=0,j=0;
    for(;i<12;i++) if (!strcmp(book[ctr1].l_zodiak ,sign_zodiak[i])) break;
    for(;j<12;j++) if (!strcmp(book[ctr2].l_zodiak ,sign_zodiak[j])) break;
    if(i<12 && j<12){ if(i<j){
    ZNAK t;
    memcpy(&t,&book[ctr1],sizeof(book[ctr1]));
    memcpy(&book[ctr1],&book[ctr2],sizeof(book[ctr1]));
    memcpy(&book[ctr2],&t,sizeof(book[ctr1]));
    }   }
    }

    }  


    cout << endl;
    for (int counter_rec = 0; counter_rec < size_array; counter_rec++)
    {
    cout << book[counter_rec].l_name; // имя и фамилия
    cout << book[counter_rec].l_zodiak; // знак зодиака
    cout << book[counter_rec].l_bday[0] << "." << book[counter_rec].l_bday[1] << "." << book[counter_rec].l_bday[2] << endl << endl; // дата рождени
    }


    cout << endl;
    int month = 0;
    cout << "Введите порядковый номер месяца: ";
    cin >> month;
    if (month < 1 || month > 12)
    {
    cout << "Месяц указан не корректно!" << endl;
    //return 0;
    }
    else
    {
    // печать записей, месяц которых совпадает с введённым
    cout << endl;
    bool no_records = false; // переменная-флаг, отвечающая за существование записей, месяц которых равен введённому
    for (int counter_rec = 0; counter_rec < size_array; counter_rec++)
    {
    if (book[counter_rec].l_bday[1] == month) // если совпадает номер месяца в записи с введённым с клавиатуры
    {
    no_records = true;
    cout << book[counter_rec].l_name; // имя и фамилия
    cout << book[counter_rec].l_zodiak; // знак зодиака
    cout << book[counter_rec].l_bday[0] << "." << book[counter_rec].l_bday[1] << "." << book[counter_rec].l_bday[2] << endl << endl; // дата рождения
    }
    }
    if (!no_records) cout << "Нет людей родившихся " << month << " месяца." << endl;
    }



    system("pause");
    return 0;
    }
    Добавлено: Вот файл,откуда будем считывать Посмотреть вложение 123.txt
     
Загрузка...

Поделиться этой страницей