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

Сведения о студенте - C++

Войти
Регистрация
Восстановить пароль
 
Olk@
 Аватар для Olk@
0 / 0 / 0
Регистрация: 03.05.2009
Сообщений: 9
06.05.2009, 21:05     Сведения о студенте #1
привет всем!
может кто то поможет найти ошибку в коде? задача такая: Сведения о студенте: фамилия (строка), курс, шифр группы (строка), адрес (строка), дата рождения. По текущей дате и сведениям о некотором количестве (не более N) студентов получить список студентов данной группы, отсортированных по возрастанию расстояний до их ближайших дней рождения. Если студентов данной группы нет, выдать соответствующее сообщение.
по месяцам сортирует, а по дням не хочет
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
101
102
103
#include <iostream>
#include <fstream>
#include <string.h>
using namespace std;
 
const int dfio=80, c=50;
 
struct date
{
        int d,m,g;
};
struct student
{
 char fio[dfio];
 int kurs;
 char grup[5];
 char adres[100];
 date dr;
};
 
ifstream fin;
ofstream fout;
 
 
// сортировка по дате
void sort(student st[], int u, date td) 
{int i, j;
for (i=u-1; u>0; u--)
  for (j=0; j<i; j++)  
  {int a, b;
   if (td.m>=st[j].dr.m) 
       a=abs(td.m-st[j].dr.m-12);
   else a=abs(td.m-st[j].dr.m);
    if (td.m>=st[j+1].dr.m)
        b=abs(td.m-st[j+1].dr.m-12);
    else b=abs(td.m-st[j+1].dr.m);
      if (a>b)
      swap(st[j],st[j+1]);
      for (int k=0; k<u; k++)
       if (st[k].dr.d>st[k+1].dr.d && st[k].dr.m==st[k+1].dr.m)
         swap(st[k],st[k+1]);
      
      }
}
 
 
 
int main()
{
     
    char gr[5];// номер группы
    cout << "gpuppu "<< endl;
    cin.getline(gr,5);
    
   date tdat; // текущая дата
   cout<<"Vvedite datu "<<endl;
   cin>>tdat.d >> tdat.m >> tdat.g;
    
 
  student st[c], b;
  int u=0;
  char rab[dfio];
 
  //открытие файла
  fin.open("dan.txt");
  if (!fin){cout<< "Oshibka"<<endl;
  return 1;}
 
 
//чтение из файла
  while (fin.getline(b.fio,dfio))
  {
      fin>>b.grup;
      fin>>b.kurs;
      fin>>b.adres;
      fin>>b.dr.d>>b.dr.m>>b.dr.g;
      fin.getline(rab,dfio);
      if (strcmp(b.grup,gr)==0)
        {
            st[u]=b;
            u++;
        }
  }
  //закрытие файла
  fin.close();
 
//открытие нового файла
 
 fout.open("Rez.txt");
  if(!fout){cout<< "Oshibka"<<endl;
  return 1;}
 
  if (u==0){fout<< "net studentov gruppi"<<endl;}
  else { sort(st,u,tdat);
         for (int i=0; i<u; i++)
         {//int a=abs(tdat.m-st[i].dr.m);
             fout << st[i].fio<< "  "<< st[i].dr.d<<" "<<st[i].dr.m <<" "<<st[i].dr.g <<endl;
         }
      }
 
  fout.close();
     return 0;
 }
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
07.05.2009, 08:20     Сведения о студенте #2
Попробуй вынести сортировку по дате в отдельный цикл.
Olk@
 Аватар для Olk@
0 / 0 / 0
Регистрация: 03.05.2009
Сообщений: 9
07.05.2009, 13:27  [ТС]     Сведения о студенте #3
Я уже пробовала! Все равно не работает!
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
07.05.2009, 14:52     Сведения о студенте #4
В смысле еще одну сортировку сделать, только по дате после сортировки по месяцу
C++
1
2
3
4
for (i=u-1; u>0; u--)
   for (int k=0; k<i; k++)
       if (st[k].dr.d>st[k+1].dr.d && st[k].dr.m==st[k+1].dr.m)
          swap(st[k],st[k+1]);
еще можно преобразовать <день.месяц> в <день в году>(т.е. 1 янв = 1, 31 дек = 365) и сортировать уже по этому числу.
Olk@
 Аватар для Olk@
0 / 0 / 0
Регистрация: 03.05.2009
Сообщений: 9
07.05.2009, 19:03  [ТС]     Сведения о студенте #5
первый вариант пробовала, но не получается (правда так и не поняла почему!!!). А вот второй не поняла! Это надо массив заводить?
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2295 / 1665 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
07.05.2009, 19:24     Сведения о студенте #6
Цитата Сообщение от Olk@ Посмотреть сообщение
А вот второй не поняла! Это надо массив заводить?
Вот держи функцию (точнее две), которые будут высчитывать номер дня в году(точнее количество дней прошедших с начала года для какой-либо даты) с учетом високосности:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
bool IsLeapYear(int year)
{
  return !(year % 4) && (!(year % 400) || (year % 100));
}
 
int DayCount(const date& dt)
{
  const int day_in_month[] = {
    31, 28+IsLeapYear(dt.g), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
  };
 
  int day_count = 0;
 
  for(int i = 0; i < dt.m - 1; ++i)
    day_count += day_in_month[i];
 
  return day_count + dt.d;
}
Использование:
C++
1
2
3
4
5
6
7
int main()
{
  date dt = {2, 12, 2008 };
  int day_number = DayCount(dt);
  ...
  return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.05.2009, 20:28     Сведения о студенте
Еще ссылки по теме:

C++ Теоретические сведения
Переделать запись в файл информации о студенте через структуру C++
Вывести информацию о студенте из списка структур C++
C++ Создайте класс Student, который будет содержать информацию о студенте

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Olk@
 Аватар для Olk@
0 / 0 / 0
Регистрация: 03.05.2009
Сообщений: 9
07.05.2009, 20:28  [ТС]     Сведения о студенте #7
спасибо! сейчас попробую!!!
Yandex
Объявления
07.05.2009, 20:28     Сведения о студенте
Ответ Создать тему
Опции темы

Текущее время: 14:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru