Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Показать сообщение отдельно
Asker
116 / 104 / 29
Регистрация: 18.12.2010
Сообщений: 378
17.01.2013, 19:58  [ТС]

Написать структуру типа STUDENT, создать динамический массив - C++

17.01.2013, 19:58. Просмотров 1891. Ответов 3
Метки (Все метки)

УУУУУУУУУРАААААА!!! ВСЕ РАБОТАЕТ!

Я писал эту программу для электронной тестирующей системы (http://informatics.mccme.ru), которая довольно жестко относится к формату ввода/вывода. Поэтому тут есть примочки, которые рядового юзера не особо волнуют

Итак, задача звучала так:

Однажды, неловкая секретарша перепутала личные дела учащихся. Теперь их снова необходимо упорядочить сначала по классам, а внутри класса по фамилиям

Формат входного файла

В первой строке дано число N (1 ≤ N ≤ 1000) – количество личных дел. Далее для каждого из N учащихся следующие данные (каждое в своей строке): фамилия и имя, класс, дата рождения. Фамилия и имя – строки не более чем из 20 символов, класс – строка состоящая из числа (от 1 до 11) и латинской буквы (от "A" до "Z" ), дата рождения – дата в формате "ДД.ММ.ГГ" . Гарантируется, что внутри одного класса нет однофамильцев.


Формат выходного файла

В выходной файл требуется вывести N строк, в каждой из которых записаны данные по одному учащемуся. Строки должны быть упорядочены сначала по классам, а затем по фамилиям.


Я долго с ней мучался Ошибка заключалась в том, что scanf неверно распознавал ведущий нуль, и после этого в целочисленный тип дня/месяца/года записывал ASCII-номер символа точки. отсюда и билебирда Поэтому я переписал программу для iostream и реализовал чтение ведущего нуля...решил выложить сюда, может, кому пригодится

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
// НАПИСАНО НА visual c++ 2008
 
#include <iostream>
#include <windows.h>
#include <string>
 
using namespace std;
 
struct STUDENT // структура STUDENT
{
string Name, Surname; // имя, фамилия
char Letter;          // буква класса
short int Class;      // Номер класса
int Day, Month, Year; // дата рождения
};
 
/*Перегруженный оператор сравнения двух студентов.
Студент a считается большим студента b, если
полная лексикографическая запись a (номер класса,
буквы класса, фамилии и имени) стоит раньше, чем 
полная лекс. запись b*/
bool operator>(const STUDENT &a, const STUDENT &b)
{
bool res=false; 
if (a.Class>b.Class) res=true;
 else if (a.Class==b.Class) 
    if (a.Letter>b.Letter) res=true;
    else if (a.Letter==b.Letter)
        if (a.Surname>b.Surname) res=true;
        else if (a.Surname==b.Surname)
            if (a.Name>b.Name) res=true;
return res;
};
 
/*Функция обмена местами структур типа STUDENT*/
void swap(STUDENT &a, STUDENT &b)
{
STUDENT temp;
temp=a;
a=b;
b=temp;
}
 
/*Функция сканирует дату строго в формате DD.MM.YY,
(обязательно с ведущим нулём!), никакой защиты от 
ошибок и неправильного ввода не предусмотрено. Это 
можно потом доработать, и будет гуд*/
void scandate(int &day, int &month, int &year)
{
string temp;
std::cin >> temp;
day   = atoi(temp.substr(0,2).c_str());
month = atoi(temp.substr(3,2).c_str());
year  = atoi(temp.substr(6,2).c_str());
}
 
/*Функция выводит на экран число с ведущим нулём,
  если оно однозначное, в остальных случаях просто
  само число */
void z(int k)
{
if (k>9) cout << k;
else cout << "0" << k; 
}
 
// ------ MAIN ------------
 
int main()
{
unsigned int n;
cin >> n;
STUDENT *a = new STUDENT [n]; // создали массив из n учащихся
 
for (unsigned int i=0; i<n; i++) 
    {
    cin >> a[i].Surname >> a[i].Name >> a[i].Class >> a[i].Letter; // Вводим фамилию, имя, класс
    scandate(a[i].Day, a[i].Month, a[i].Year); // Дата рождения у нас - отдельный случай ;)
    }
 
for (unsigned int k=2; k<=n; k++) // сортировка пузырьком
    for (unsigned int i=0; i<=n-k; i++) 
        if (a[i]>a[i+1]) swap(a[i], a[i+1]); 
// сравниваем студентов и при необходимости меняем их местами
                                            
for (unsigned  int i=0; i<n; i++) 
// выводим в формате [класс][буква] [имя] [фамилия] [дата рожд.в формате DD.MM.YY]
    {cout << a[i].Class << a[i].Letter << " " << a[i].Surname << " " << a[i].Name << " ";
    z(a[i].Day);
    cout << "."; 
    z(a[i].Month); 
    cout << ".";
    z(a[i].Year);
    cout << endl;}
    
delete [] a; // освобождаем память
 
system("pause");
 
return 0;
}
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.01.2013, 19:58
Темы с ответами и решениями для C++ Написать структуру типа STUDENT, создать динамический массив:

Создать класс Matrix, реализующий двухмерный динамический массив типа int
Здравствуйте! Задание: Создать класс Matrix, реализующий двухмерный ...

Создать структуру с именем Student с полями
Не знаю даже примерно как нужно сделать, не шарю. Отчет надо сдать (( ...

Как создать динамический массив типа string? Как создать класс такого массива?
Как создать динамический массив типа string? Как создать класс такого массива? ...

Посмотрите объявление вектора и попытайтесь создать динамический массив, содержащий элементы типа char
#include &lt;iostream&gt; #include &lt;vector&gt; using namespace std; int main() {...

0
Написать структуру типа STUDENT, создать динамический массив C++    
Другие темы раздела
C++ Вычислить значение выражения b = (1+1/2+1/2^2+1/2^3+...+1/2^n)^n http://www.cyberforum.ru/cpp-beginners/thread764433.html
Вычислить значение выражения b = (1+1/2+1/2^2+1/2^3+...+1/2^n)^n .Где n ввести с клавиатуры.
C++ Чем отличаются указатели от ссылок? Как я понимаю указатель,он хранит адрес переменной,а ссылка просто берёт значение переменной?Привидите примерчик какой=) http://www.cyberforum.ru/cpp-beginners/thread764407.html
Найти корень уравнения 2x^3-x-10=0 C++
заранее благодарен
C++ Написать программу на языке С + + которая реализует конструктор который инициализирует исходные данные класса
#include <vcl.h> #include <iostream.h> #include <conio.h> struct Phone { char prizviche; char imya; char po_batkovi;
C++ транспонировать матрицу А [1 7 6 ] [0 2 3] [9 5 0 ]. заранее благодарен http://www.cyberforum.ru/cpp-beginners/thread764396.html
транспонировать матрицу А
C++ не выводится строка в Visual Studio #include <cstdlib> #include <iostream> using namespace std; int main(int argc, char *argv) { string s="Press the enter key to continue ..."; cout << s; cin.get(); подробнее
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru