Форум программистов, компьютерный форум CyberForum.ru

Написать структуру типа 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(); подробнее

Показать сообщение отдельно
Asker
114 / 102 / 11
Регистрация: 18.12.2010
Сообщений: 378
17.01.2013, 19:58  [ТС]     Написать структуру типа STUDENT, создать динамический массив
УУУУУУУУУРАААААА!!! ВСЕ РАБОТАЕТ!

Я писал эту программу для электронной тестирующей системы (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;
}
 
Текущее время: 22:53. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru