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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 42, средняя оценка - 4.81
eddilou
3 / 3 / 0
Регистрация: 21.11.2010
Сообщений: 194
#1

Структуры: Списки студентов - C++

26.03.2011, 21:23. Просмотров 5188. Ответов 88
Метки нет (Все метки)

всем привет
вот такое задание мне дано:
Описать массив структур, содержащих информацию о результатах сессии: {фамилия; группа; дисциплина; оценка}. Распечатать фамилии студентов, не имеющих оценок ниже «хорошо».

делаю на Borland c++ 3.1 т.к. его пока изучаем
вот мой код
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
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#define cherta printf("-----------------------------------------------------------------\n")
 
 
struct card
       { struct card *list;
    char *f_name;
    char *group;
    char *dp;
    char *rating;
       }*list;
 
void main()
{clrscr();     struct card **list;
int i=1, N=1;
do{
   for(; i<=N; i++)
   {
    cherta;
    printf("Number karti: %d\n", i);
    printf("Firstname: ");
    gets(list[i]->f_name);
    printf("Number Group: ");
    gets(list[i]->group);
    printf("Dicsipline: ");
    gets(list[i]->dp);
    printf("Rating: ");
    gets(list[i]->rating);
    cherta;
    printf("Nazhmite ENTER esli hotite prodolzhit spisok ili ESC dlya vihoda\n");
    if(getch()==13) N++;
   }
  }while(getch()!=27);
 
  clrscr();
  printf("Spisok studentov u kotorih ocenki 'horosho' i 'otlocno':\n");
 for(i=1; i<=N; i++)
 {
  if(list[i]->rating=="horosho" && list[i]->rating=="otlochno" && list[i]->rating=="4" && list[i]->rating=="5")
   {
    printf("Firstname: %s", list[i]->f_name);
    printf("Number Group: %s", list[i]->group);
    printf("Dicsipline: %s", list[i]->dp);
    printf("Rating: %s", list[i]->rating);
    cherta;
   }
 }
 getch();
}
пояснте, что не так? почему он не хочет сравнивать? и что не так в моем коде?
жду советов, поравки и замечаний, хочу понять и научиться..
заранее спасибо
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IrineK
Заблокирован
26.03.2011, 22:11     Структуры: Списки студентов #2
list[i]->rating=="horosho"
Так две строки не сравниваются.
Нужно использовать strcmp() http://www.cplusplus.com/reference/c...string/strcmp/
eddilou
3 / 3 / 0
Регистрация: 21.11.2010
Сообщений: 194
26.03.2011, 22:36  [ТС]     Структуры: Списки студентов #3
Цитата Сообщение от IrineK Посмотреть сообщение
list[i]->rating=="horosho"
Так две строки не сравниваются.
Нужно использовать strcmp() http://www.cplusplus.com/reference/c...string/strcmp/
попробовал, все равно не работает вот я переделал

C++
1
2
3
4
5
6
7
8
9
 char ocenka1[]="horosho";
  char ocenka2[]="otlichno";
  char ocenka3[]="4";
  char ocenka4[]="5";
  clrscr();
  printf("Spisok studentov u kotorih ocenki 'horosho' i 'otlocno':\n");
 for(i=1; i<=N; i++)
 {
  if(strcmp(list[i]->rating,ocenka1)!=0 && strcmp(list[i]->rating,ocenka2)!=0 && strcmp(list[i]->rating,ocenka3)!=0 && strcmp(list[i]->rating,ocenka4)!=0)
не канает так же ведет как и в первом случае...
IrineK
Заблокирован
26.03.2011, 22:39     Структуры: Списки студентов #4
strcmp() в случае равенства возвращает 0. Читайте внимательнее.
eddilou
3 / 3 / 0
Регистрация: 21.11.2010
Сообщений: 194
26.03.2011, 23:59  [ТС]     Структуры: Списки студентов #5
Цитата Сообщение от IrineK Посмотреть сообщение
strcmp() в случае равенства возвращает 0. Читайте внимательнее.
в англише не оч силен поэтому ссори
даже если я везде поставил ==0 вместо !=0 все равно та же история
он при !=1 иногда срабатывает и то НЕ правильно т.к. он почему то дублирует а не выводит сравниваемые т.е. совподающие с условием т.е. хорошо отлично 4 и 5

Добавлено через 1 час 4 минуты
еще одна проблема, то что он не перечисляет структуру а печатает лишь последнюю вводимую
как сделать чтоб был правильный массив структур и чтоб можно было перебирать...
подскажите плиз..
IrineK
Заблокирован
27.03.2011, 03:01     Структуры: Списки студентов #6
C++
1
if(strcmp(list[i]->rating,ocenka1)==0 || strcmp(list[i]->rating,ocenka2)==0 || strcmp(list[i]->rating,ocenka3)==0 || strcmp(list[i]->rating,ocenka4)==0)
eddilou
3 / 3 / 0
Регистрация: 21.11.2010
Сообщений: 194
27.03.2011, 07:52  [ТС]     Структуры: Списки студентов #7
Цитата Сообщение от IrineK Посмотреть сообщение
C++
1
if(strcmp(list[i]->rating,ocenka1)==0 || strcmp(list[i]->rating,ocenka2)==0 || strcmp(list[i]->rating,ocenka3)==0 || strcmp(list[i]->rating,ocenka4)==0)
спасибо, теперь проверка работает норм, НО почему то коряво работает сама структура к примеру f_name иногда после проверки и вывод пишет null или тупо каракули, что не так? разве места ему надо выделять? как?
и еще проблема к примеру я написал 3 или 4 фамилии и тд
при проверки он почему то проверяет только последнию.. куда остальные то деваются? у меня правильно реализован массив структур? и нужно ли под него место как то выделять? если да, то как? а то что то в книжке не нашел..
поэтому прошу помощи у знающих..
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
27.03.2011, 08:10     Структуры: Списки студентов #8
А ничего, что gets происходит по не инициализированному указателю?
Тут не то, что кракозябрам удивляться надо, а тому, что программа с криками не падает.

Создания списка list я тоже не вижу.

Добавлено через 1 минуту
Цитата Сообщение от eddilou Посмотреть сообщение
у меня правильно реализован массив структур?
Нет. Массива структур в программе вообще нет. Есть не инициализированный указатель на указатель.

Добавлено через 5 минут
Цитата Сообщение от eddilou Посмотреть сообщение
разве места ему надо выделять? как?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
cont int N = 10; // а не 1, как в коде
card list[N];
for( int i = 0; i < N; ++i )
{
     list->f_name = new char[32];
     ...
}
...
 
for( int i = 0; i < N; ++i )
{
     delete[] list->f_name;
}
Добавлено через 2 минуты
Или по заданию нужно реализовать односвязный список, а не массив? Структура card это узел односвязного списка.

Добавлено через 29 секунд
Оценку можно ханить в виде числа, а не строки.
eddilou
3 / 3 / 0
Регистрация: 21.11.2010
Сообщений: 194
27.03.2011, 08:37  [ТС]     Структуры: Списки студентов #9
cont int N = 10; // а не 1, как в коде

насчет этого, если внимательнее прочитать то можно заметить, что N увеличивается после нажатия ENTER а именно код вот if(getch()==13) N++; это спец сделал если пользователь нажимает энтер и он хочет продолжит создавать список то нажимает энтер и соотв создает дальше
разве это не канает???...
насчет задания:
нужно создать список к примеру
Иванов
500
Математика
5
-------------
Сидоров
400
Русский
3
-----------
Дьяков
420
Химия
4
---------
вывести на экран только тех у кого не ниже 4 а именно
Иванов
500
Математика
5
-------------
Дьяков
420
Химия
4
---------
еще проблема такая я сделал вместо *f_name заменил f_name[100] он глючит намного чаще чем первый самое странное что глючит именно он а не остальные элементы типа чар
насчет почему я сделал группу и оценки типа char а не int как пологается, да потому что в int не читается символ тире к примеру группа 450-2 а оценку могут написать словом к примеру хорошо или отлично и тд
так как же сделать чтоб было много списка а потом можно было искать в нем да и еще чтоб запомнил в памяти эт списки чтоб потом ковыряться в них..
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
27.03.2011, 08:48     Структуры: Списки студентов #10
Цитата Сообщение от eddilou Посмотреть сообщение
если внимательнее прочитать то можно заметить
Что невменяемый цикл for можно заменить на do...while( getch()==13 );

Добавлено через 1 минуту
Цитата Сообщение от eddilou Посмотреть сообщение
почему я сделал группу типа char а не int как пологается
Оценка и группа - разные слова

Добавлено через 2 минуты
Цитата Сообщение от eddilou Посмотреть сообщение
так как же сделать
Сперва определись, нужен ли тебе массив фиксированной длины, массив переменной длины или список?
Для первого варианта я уже код привёл.
Для второго варианта тебе нужно будет массив увеличивать и элементы копировать.
Третий вариант - не массив, а список. А по заданию "Описать массив структур".
eddilou
3 / 3 / 0
Регистрация: 21.11.2010
Сообщений: 194
27.03.2011, 09:15  [ТС]     Структуры: Списки студентов #11
Цитата Сообщение от Deviaphan Посмотреть сообщение
Для первого варианта я уже код привёл.
Для второго варианта тебе нужно будет массив увеличивать и элементы копировать.
Третий вариант - не массив, а список. А по заданию "Описать массив структур".
поясни пож-та как понимать описать массив структур, что и как сделать? разве у меня не правильно сделано? и как сделать динамическую т.е. не фиксированную к примеру list[100]
а именно чтоб после нажатия энтер как говорится если пользователь захочет занести данные еще то увеличивается а если нет то нет а не так чтоб уже фиксир было типа 100



все работает после того как я изменил таким образом
C++
1
2
3
4
5
6
7
8
typedef struct 
{ 
  char f_name[50];
  char group[10];
  char dp[50];
  char rating[20];
}card;
card list[100];
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
27.03.2011, 09:23     Структуры: Списки студентов #12
Лучше ограничь максимум студентов до 100.)

Цитата Сообщение от eddilou Посмотреть сообщение
разве у меня не правильно сделано?
Вот сравни "card list[100];" и "card ** list;". Потому и не работало.
eddilou
3 / 3 / 0
Регистрация: 21.11.2010
Сообщений: 194
27.03.2011, 09:33  [ТС]     Структуры: Списки студентов #13
Цитата Сообщение от Deviaphan Посмотреть сообщение
Лучше ограничь максимум студентов до 100.)


Вот сравни "card list[100];" и "card ** list;". Потому и не работало.
спасибо, да это я понял уже)))
еще один прикол
при list[1] он все равно заполняет его дальше)))) т..е. с помощью i увеличвается и запоминает))
так что, у меня уже действительно массив структур как сказано в задании описать массив структур или нет?
и еще такой вопрос, каким образом можно отсортировать список в алфавитном порядке по фамилии? с помощью qsort? но как? там слишком замудренные аргументы в функцию нужны
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
27.03.2011, 09:45     Структуры: Списки студентов #14
Цитата Сообщение от eddilou Посмотреть сообщение
при list[1] он все равно заполняет его дальше))))
Это называется выход за границы массива.) Не радуйся.)

Добавлено через 3 минуты
card list[100]; - массив структур фиксированной длины, да.

Скорее всего, стандартные алгоритмы сортировки использовать вам низя, преподы вредные. Лучше уточни. В соседних темах рассматриваются разные алгоритмы реализации сортировки.
eddilou
3 / 3 / 0
Регистрация: 21.11.2010
Сообщений: 194
27.03.2011, 09:57  [ТС]     Структуры: Списки студентов #15
Цитата Сообщение от Deviaphan Посмотреть сообщение
Это называется выход за границы массива.) Не радуйся.)
но так можно делать? ведь работает и причем без сбоев и косяков же
вот думаю методом перебора можно ли тут, а то боюсь что оон начнет тупит в плане того что если в массиве обычном сравниваются поэлементно т.е. 1 массив и второй ассив и затем поэлементно поганяется то как тут тогда?
я как то пробовал просто вывести на экран list[i].f_name[0] или даже 1 он тупо игнорит и выводит каракули
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
27.03.2011, 10:02     Структуры: Списки студентов #16
Цитата Сообщение от eddilou Посмотреть сообщение
но так можно делать? ведь работает и причем без сбоев и косяков же
Это не так. Добавь после массива int list[1]; ещё что-нибудь. Запиши данные в list[2] и проверь содержимое добавленного объекта.
Программа не сбоила по ошибке.
eddilou
3 / 3 / 0
Регистрация: 21.11.2010
Сообщений: 194
27.03.2011, 10:14  [ТС]     Структуры: Списки студентов #17
это как? я что то недопонял...
каким образом куда добваить и что проверить? если я допустим делаю список из 3 студентов то он норм проверяет и выводит
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
27.03.2011, 10:25     Структуры: Списки студентов #18
C++
1
2
3
4
int list[1];
int a = 123;
list[1].чтото = 654;
cout << a;
Да пофиг.) Не выходи за границы массива. Никогда.
eddilou
3 / 3 / 0
Регистрация: 21.11.2010
Сообщений: 194
27.03.2011, 12:30  [ТС]     Структуры: Списки студентов #19
не подскажите что не так? пытаюсь отсортировать и вернуть указатель на list т.е. массив структур
вот код
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
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#define cherta printf("-----------------------------------------------------------------\n")
 
typedef struct
       {
    char surname[50];
    char group[10];
    char dp[50];
    char rating[20];
       }card;
card list[1], temp;
 
struct list SORT (card *list, int N)
{
 for(int i=1; i<=N; i++)
  {
   for(int j=i; j<=N; j++)
    {
     char *temp1, *temp2;;
     strcpy(temp1,list[i].surname);
     strcpy(temp2,list[j].surname);
     for(int k=0; k<=strlen(temp1); k++)
      {
       for(int p=0; p<=strlen(temp2); p++)
       { if(temp1[k]>temp2[p])
      { char tmpsn[50];
        strcpy(tmpsn, list[i].surname);
        char tmpgr[10];
        strcpy(tmpgr, list[i].group);
        char tmpdp[50];
        strcpy(tmpdp, list[i].dp);
        char tmprat[20];
        strcpy(tmprat, list[i].rating);
 
        strcpy(list[j].surname, tmpsn);
        strcpy(list[j].group, tmpgr);
        strcpy(list[j].dp, tmpdp);
        strcpy(list[j].rating, tmprat);
 
      }
       }
      }
    }
  }
 return (*list);
}
 
 
void main()
{
 clrscr();
 int i=1, N=1;
 do{
    for(; i<=N; i++)
    {
     cherta;
     printf("Surname: ");
     gets(list[i].surname);
     printf("Number Group: ");
     gets(list[i].group);
     printf("Dicsipline: ");
     gets(list[i].dp);
     printf("Rating: ");
     gets(list[i].rating);
     cherta;
     printf("Nazhmite ENTER esli hotite prodolzhit spisok ili ESC dlya vihoda\n");
     if(getch()==13) N++;
    }
   }while(getch()!=27);
  SORT(list, N);
  char *ocenka[]={"horosho", "otlichno", "4", "5"};
  clrscr();
  printf("Spisok studentov y kotorih ocenki 'horosho' i 'otlocno':\n");
  cherta;
  for(i=1; i<=N; i++)
  {
   if(strcmp(list[i].rating,ocenka[0])==0
      || strcmp(list[i].rating,ocenka[1])==0
      || strcmp(list[i].rating,ocenka[2])==0
      || strcmp(list[i].rating,ocenka[3])==0)
    {
     printf("Surname: %s\n", list[i].surname);
     printf("Number Group: %s\n", list[i].group);
     printf("Dicsipline: %s\n", list[i].dp);
     printf("Rating: %s\n", list[i].rating);
     cherta;
    }
  }
 getch();
}
он выдает ошибку cannot convert 'card' to 'list' в том месте где return(*list)

Добавлено через 19 минут
внес код в майн он вообще не сортирует тупит, что не так то в коде сортировке?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.03.2011, 12:43     Структуры: Списки студентов
Еще ссылки по теме:

Структуры. Списки C++
C++ Создание структуры Список студентов
Перевести L студентов с 1-й группы в другую (списки) C++
C++ Список студентов (структуры)

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

Или воспользуйтесь поиском по форуму:
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
27.03.2011, 12:43     Структуры: Списки студентов #20
card list[1]
Цитата Сообщение от Deviaphan Посмотреть сообщение
Не выходи за границы массива. Никогда.
Я же сказал.)

Добавлено через 1 минуту
Нет такого типа list, чтобы вернуть его из функции.

Добавлено через 1 минуту
Вместо
C++
1
2
3
4
5
6
7
typedef struct
       {
        char surname[50];
        char group[10];
        char dp[50];
        char rating[20];
       }card;
пиши
C++
1
2
3
4
5
6
7
struct card
       {
        char surname[50];
        char group[10];
        char dp[50];
        char rating[20];
       };
Это не Си, не нужно в стиле их писать. Там было оправдано, в С++ - нет.

Добавлено через 1 минуту
Самая главная ошибка в "if(getch()==13) N++;". Ты выходишь за границу массива. Остальное не имеет значения уже.
Yandex
Объявления
27.03.2011, 12:43     Структуры: Списки студентов
Ответ Создать тему
Опции темы

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