Сортировка

  • Автор темы Adm1n
  • Дата начала
A

Adm1n

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

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
 

Вложения

  • 301 байт Просмотры: 74