3 / 3 / 0
Регистрация: 21.11.2010
Сообщений: 194
1

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

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

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

делаю на 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();
}
пояснте, что не так? почему он не хочет сравнивать? и что не так в моем коде?
жду советов, поравки и замечаний, хочу понять и научиться..
заранее спасибо
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.03.2011, 21:23
Ответы с готовыми решениями:

Вывести списки студентов по группам
Помогите пожалуйста в задаче, во условие: Написать программу формирования сведения об успеваемости...

Перевести L студентов с 1-й группы в другую (списки)
Даны 2 списка, содержащих фамилии студентов 2-х групп. Перевести L студентов с 1-й группы в другую....

Записи: Вывести списки студентов, упорядоченные по возрасту
Описать и вывести массив, содержащий 10 записей следующей структуры: фамилия, возраст, №...

Структуры. Списки
В игре Домино можно приставлять фишки друг к другу концами, имеющими одинаковое число точек....

88
Делаю внезапно и красиво
Эксперт С++
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
01.04.2011, 19:37 61
Author24 — интернет-сервис помощи студентам
Вся функция CREATE_LIST_SES.
Ты создаёшь объект SES, ничего с ним не делая. При этом "заполняешь" объект SES из list, но он не создан, т.е. ты где-то что-то портишь и всё.
Строка 31 приводит к утечке.
Строка 36 - выделяешь блок памяти размером с указатель. malloc и new не надо совместно использовать. malloc не надо использовать.
Строка 59, тоже непонятно что делаешь.
107 - передаёшь не инициализированный SES

Ещё ошибки есть, но мне читать надоело.
0
3 / 3 / 0
Регистрация: 21.11.2010
Сообщений: 194
03.04.2011, 09:21  [ТС] 62
Deviaphan, подскажи плиз, правильно делается ли проверка
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void PRINT_LIST(card *list)
{ int xn=1, x;
 for(int i=1; i<=(list[0].N); i++)
  {
   for(int j=1; j<=list[0].SES[0].PR; j++)
    {
    if((list[i].SES[j].rating==4) || (list[i].SES[j].rating==5)) x=1; // обрати внимание на эту строку 
    else x=0;
    xn*=x;
    }
    if(xn==1)  printf("Surname: %s\n", list[i].surname);
 
  }
}
или наддо && или ^ вместо ||???
потому что если работать со списком то он тупит в плане того что он либо выводи все фамилии либо ничего а отждельно елси создаю неск списков то он тупит а по 1 работает норм
0
Делаю внезапно и красиво
Эксперт С++
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
03.04.2011, 09:36 63
Почему у тебя индексация с 1, а не с 0? И сравнение на <=, а не на <?
Строка 7 правильная, при условии, что в SES корректные данные. Убедись на счёт индексации.
Почему в строке 5 берутся данные первого узла, а не текущего?
В общем, я не знаю, как у тебя список устроен. Проверяй индексацию.
0
3 / 3 / 0
Регистрация: 21.11.2010
Сообщений: 194
03.04.2011, 13:24  [ТС] 64
Цитата Сообщение от Deviaphan Посмотреть сообщение
Почему у тебя индексация с 1, а не с 0? И сравнение на <=, а не на <?
Строка 7 правильная, при условии, что в SES корректные данные. Убедись на счёт индексации.

В общем, я не знаю, как у тебя список устроен. Проверяй индексацию.
если про индексацию i и j то в нулевом хранятся данные о том сколько было создано массивов, я о N и PR
это как понять? какого первого узла? и какой текущий должен то быть?
Почему в строке 5 берутся данные первого узла, а не текущего?
0
Делаю внезапно и красиво
Эксперт С++
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
03.04.2011, 14:21 65
Цитата Сообщение от eddilou Посмотреть сообщение
Почему в строке 5 берутся данные первого узла, а не текущего?
Это я тебя справшиваю.)
C++
1
for(int j=1; j<=list[0].SES[0].PR; j++)
for(int j=1; j<=list[0].SES[0].PR; j++)
Впрочем, я вообще не понимаю, как реализован у тебя список, так что могу странное советовать.)
0
3 / 3 / 0
Регистрация: 21.11.2010
Сообщений: 194
03.04.2011, 21:08  [ТС] 66
я же тебе говорю что в list[0] и SES[0] храниться инфа о том сколько создано массивов поэтому в 0 я храню только это а с 1 использую списки дабы не путаться поэтому я так и сделал что кроме N и PR ничего не используется в нулевом индексе
0
4769 / 2579 / 892
Регистрация: 29.11.2010
Сообщений: 5,581
04.04.2011, 00:15 67
printf в некоторых случаях предпочтительней. Например, когда пишешь на С.
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
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
 
typedef struct Card {
        int  surname;
        int  group;
        int  discipline;
        int  mark;
} Card;
 
void CardInit(struct Card *card, int surname_id, int group_id,
                                 int  discipline_id, int  mark) {
  card->surname = surname_id;
  card->group = group_id;
  card->discipline = discipline_id;
  card->mark = mark;
}
 
void CardPrint(struct Card *card, char *surnames[], char *groups[],
               char *disciplines[]) {
  printf("Surname: %s\nGroup: %s\nDiscipline: %s\nMark: %d\n-----\n",
         surnames[card->surname], groups[card->group],
         disciplines[card->discipline], card->mark);
}
 
typedef struct CardStatistics {
  int surname;
  int group;
  int is_good;
} CardStatistics;
 
void CardStatisticsInit(struct CardStatistics *card_statistics,
                        int surname_id, int group_id) {
    card_statistics->surname = surname_id;
    card_statistics->group = group_id;
    card_statistics->is_good = 1;
}
 
void CardStatisticsCorrect(
       struct CardStatistics card_statistics[],
       struct Card *card) {
  if (card->mark >= 4)
    return;
  size_t result = 0;
  while (!(card_statistics[result].surname == card->surname &&
         card_statistics[result].group == card->group))
    ++result;
  card_statistics[result].is_good = 0;
}
 
 
int main(int argc, char *argv[]) {
  srand(time(NULL));
  char *groups[] = { "101", "201", "301" };
  char *disciplines[] = { "math", "physics", "biology", "history" };
  char *surnames[] = { "Petrov", "Ivanov", "Sidorov", "Kuznetsov" };
  size_t group_count = sizeof(groups) / sizeof(*groups);
  size_t discipline_count = sizeof(disciplines) / sizeof(*disciplines);
  size_t surname_count = sizeof(surnames) / sizeof(*surnames);
 
  size_t card_array_size = group_count * discipline_count * surname_count;
  struct Card cards[card_array_size];
 
  int group_id, discipline_id, surname_id, card_id = 0;
  for (surname_id = 0; surname_id < surname_count; ++surname_id)
    for (group_id = 0; group_id < group_count; ++group_id)
      for (discipline_id = 0; discipline_id < discipline_count; ++discipline_id)
        CardInit(&cards[card_id++], surname_id, group_id,
                 discipline_id, rand() % 3 + 3);
 
  for (card_id = 0; card_id < card_array_size; ++card_id)
    CardPrint(&cards[card_id], surnames, groups, disciplines);
 
  size_t card_statistics_size = group_count * surname_count;
  int card_statistics_id = 0;
  struct CardStatistics card_statistics[card_statistics_size];
  for (surname_id = 0; surname_id < surname_count; ++surname_id)
    for (group_id = 0; group_id < group_count; ++group_id)
      CardStatisticsInit(&card_statistics[card_statistics_id++],
                         surname_id, group_id);
 
  for (card_id = 0; card_id < card_array_size; ++card_id)
    CardStatisticsCorrect(card_statistics, &cards[card_id]);
 
  for (card_statistics_id = 0; card_statistics_id < card_statistics_size;
       ++card_statistics_id) {
    if (card_statistics[card_statistics_id].is_good)
      printf("Student %s of group %s has all marks good.\n",
             surnames[card_statistics[card_statistics_id].surname],
             groups[card_statistics[card_statistics_id].group]);
  }
 
  return 0;
}
0
Делаю внезапно и красиво
Эксперт С++
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
04.04.2011, 06:23 68
Цитата Сообщение от lemegeton Посмотреть сообщение
Например, когда пишешь на С
Не только предпочтительнее, но безальтернативен.) На Си нету потоков.


Цитата Сообщение от eddilou Посмотреть сообщение
я же тебе говорю
Вот я и не могу этого понять, почему так? Зачем себя путать? У тебя один класс выполняет две разные работы, в зависимости от индекса в списке. Тебе виднее, конечно, но я бы так не стал делать.
0
3 / 3 / 0
Регистрация: 21.11.2010
Сообщений: 194
04.04.2011, 14:04  [ТС] 69
Цитата Сообщение от Deviaphan Посмотреть сообщение
Не только предпочтительнее, но безальтернативен.) На Си нету потоков.



Вот я и не могу этого понять, почему так? Зачем себя путать? У тебя один класс выполняет две разные работы, в зависимости от индекса в списке. Тебе виднее, конечно, но я бы так не стал делать.
а как посоветуешь сделать? чтоб все было в одной структуре? тогда надо место для массива выделять типа чар и инт для хранение инфы о сессии да?
а еще препод сказала что надо мол сделать объединение какое тто я прочитал так и не понял как и что там устроено
к примеру производится проверка по фамилии и группы если совпадает то объединить структуры т.е. слить объекты во едино и как бы получается 1 карточка и слить инфу о сессии
к примеру
иванов
450
биология
5

иванов
450
матем
5

должно получиться
иванов
450
биология
5
матем
5

и только затем уже проверять как то по оценкам
0
Делаю внезапно и красиво
Эксперт С++
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
04.04.2011, 14:07 70
Сделай класс List, в котором хранится указатель на card и количество узлов. Соответственно и интерфейс для работы со списком будет в класса List. Ну и т.д.
0
3 / 3 / 0
Регистрация: 21.11.2010
Сообщений: 194
04.04.2011, 14:17  [ТС] 71
lemegeton, прокомпилировал код данный 4 ошибки аргс и аргв никогда не используется и еще ошибки относительно строки 64 и 78

Deviaphan, как понять количество узлов? и как понять "Соответственно и интерфейс для работы со списком будет в класса List. Ну и т.д."
0
Делаю внезапно и красиво
Эксперт С++
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
04.04.2011, 14:21 72
Не количество узлов, чего ты там в узле с индексом 0 хранишь.) Я так и не разбирался с твоим кодом.)
Т.е. храни данные не в нулевом узле, а рядом.
0
3 / 3 / 0
Регистрация: 21.11.2010
Сообщений: 194
04.04.2011, 14:28  [ТС] 73
Цитата Сообщение от Deviaphan Посмотреть сообщение
Не количество узлов, чего ты там в узле с индексом 0 хранишь.) Я так и не разбирался с твоим кодом.)
Т.е. храни данные не в нулевом узле, а рядом.
в list'[0].N храню данные о том сколько карточек или фамилий создано чтоб при проверке не бесконечно проверять а N число
в list[0].SES[0].PR храню число вписанных на фамилию дисциплин и оценок чтоб соотв при проверке оценок не проигрвать бесконечно
по сути дела я использую в нулевых индексах ТОЛЬКО N и PR а в остальных другие не касаясь этих
и как хранить рядом по твоему надо правильно?

может скажешь прямо как и что? направишь в правильное русло а то уже неделю или сколь тут фигней страдаю все никак не могу понять как и тчо делать с ними
0
Делаю внезапно и красиво
Эксперт С++
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
04.04.2011, 14:30 74
Да хоть так
C++
1
2
3
4
5
6
struct List
{
    card * list;
    int N;
    int PR;
};
0
3 / 3 / 0
Регистрация: 21.11.2010
Сообщений: 194
04.04.2011, 14:37  [ТС] 75
Цитата Сообщение от Deviaphan Посмотреть сообщение
Да хоть так
C++
1
2
3
4
5
6
struct List
{
    card * list;
    int N;
    int PR;
};
и как я буду обращаться к данным и к инфе о том создано??
ведь если создам массив структур то инфа утечет же ?
0
Делаю внезапно и красиво
Эксперт С++
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
04.04.2011, 14:45 76
Структура одна. Массив будет card*. Кто куда утечёт? Я вообще ничего не понимаю.(
Вместо list[0].N будет:
C++
1
2
3
4
5
List list;
list.N;
list.list[0];
list.list[1];
и т.д.
Лучше даже написать card*nodes, тогда будет list.node[3];
0
3 / 3 / 0
Регистрация: 21.11.2010
Сообщений: 194
04.04.2011, 14:52  [ТС] 77
Цитата Сообщение от Deviaphan Посмотреть сообщение
Структура одна. Массив будет card*. Кто куда утечёт? Я вообще ничего не понимаю.(
Вместо list[0].N будет:
C++
1
2
3
4
5
List list;
list.N;
list.list[0];
list.list[1];
и т.д.
Лучше даже написать card*nodes, тогда будет list.node[3];
ааа теперь понял но тогда вопрос такой
правильно ли будет так
C++
1
2
3
4
5
6
7
8
9
10
struct List
{
    card * list;
    char surname[50];
    char group[10];
    char dp[20];
    int rating;
    int N;
    int PR;
};
так? но тогда как будет массив для дисц и оценки? ведь дисц не одна будет же
0
Делаю внезапно и красиво
Эксперт С++
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
04.04.2011, 15:04 78
Не могу актуальный код найти.)
В общем, всё что касается студента будет в структуре card, а в List будет указатель на список card, N и PR.
0
3 / 3 / 0
Регистрация: 21.11.2010
Сообщений: 194
04.04.2011, 15:09  [ТС] 79
Цитата Сообщение от Deviaphan Посмотреть сообщение
Не могу актуальный код найти.)
В общем, всё что касается студента будет в структуре card, а в List будет указатель на список card, N и PR.
хм.. т.е. в итоге пришли снова к тому чему пришли т.е. две структуры одна структура содержит указатель на др структуру и N , PR так? вторая surname group dp и rating так? но нужены ли массивы для dp и rating?? иначе будет только одна дисц и 1 оценка так?
0
Делаю внезапно и красиво
Эксперт С++
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
04.04.2011, 15:12 80
Вопрос только в том, чтобы убрать счётчик количества узлов из описания узла. Всё. Остальное без изменений.
0
04.04.2011, 15:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.04.2011, 15:12
Помогаю со студенческими работами здесь

Список студентов (структуры)
Вводится список студентов (Ф.И.О., номер группы, оценка). Найти номер группы, в которой у всех...

Структуры данных: списки
Нужно сделать программу на с++ на тему &quot;структуры данных: списки&quot;, что именно можно придумать?...

Структуры и односвязные списки
Помогите с задачей. Заранее спасибо. &quot;Сформировать список из натуральных чисел. Заменить...

Структуры данных: Списки
Составить программу, которая содержит текущую информацию о книгах в библиотеке. Сведения о книгах...


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru