Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

26.03.2011, 21:23. Просмотров 5381. Ответов 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();
}
пояснте, что не так? почему он не хочет сравнивать? и что не так в моем коде?
жду советов, поравки и замечаний, хочу понять и научиться..
заранее спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.03.2011, 21:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Структуры: Списки студентов (C++):

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

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

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

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

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

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

88
IrineK
Заблокирован
26.03.2011, 22:11 #2
list[i]->rating=="horosho"
Так две строки не сравниваются.
Нужно использовать strcmp() http://www.cplusplus.com/reference/clibrary/cstring/strcmp/
0
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/clibrary/cstring/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)
не канает так же ведет как и в первом случае...
0
IrineK
Заблокирован
26.03.2011, 22:39 #4
strcmp() в случае равенства возвращает 0. Читайте внимательнее.
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 минуты
еще одна проблема, то что он не перечисляет структуру а печатает лишь последнюю вводимую
как сделать чтоб был правильный массив структур и чтоб можно было перебирать...
подскажите плиз..
0
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)
2
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 фамилии и тд
при проверки он почему то проверяет только последнию.. куда остальные то деваются? у меня правильно реализован массив структур? и нужно ли под него место как то выделять? если да, то как? а то что то в книжке не нашел..
поэтому прошу помощи у знающих..
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 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 секунд
Оценку можно ханить в виде числа, а не строки.
0
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 а оценку могут написать словом к примеру хорошо или отлично и тд
так как же сделать чтоб было много списка а потом можно было искать в нем да и еще чтоб запомнил в памяти эт списки чтоб потом ковыряться в них..
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
27.03.2011, 08:48 #10
Цитата Сообщение от eddilou Посмотреть сообщение
если внимательнее прочитать то можно заметить
Что невменяемый цикл for можно заменить на do...while( getch()==13 );

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

Добавлено через 2 минуты
Цитата Сообщение от eddilou Посмотреть сообщение
так как же сделать
Сперва определись, нужен ли тебе массив фиксированной длины, массив переменной длины или список?
Для первого варианта я уже код привёл.
Для второго варианта тебе нужно будет массив увеличивать и элементы копировать.
Третий вариант - не массив, а список. А по заданию "Описать массив структур".
0
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];
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
27.03.2011, 09:23 #12
Лучше ограничь максимум студентов до 100.)

Цитата Сообщение от eddilou Посмотреть сообщение
разве у меня не правильно сделано?
Вот сравни "card list[100];" и "card ** list;". Потому и не работало.
0
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? но как? там слишком замудренные аргументы в функцию нужны
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
27.03.2011, 09:45 #14
Цитата Сообщение от eddilou Посмотреть сообщение
при list[1] он все равно заполняет его дальше))))
Это называется выход за границы массива.) Не радуйся.)

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

Скорее всего, стандартные алгоритмы сортировки использовать вам низя, преподы вредные. Лучше уточни. В соседних темах рассматриваются разные алгоритмы реализации сортировки.
0
eddilou
3 / 3 / 0
Регистрация: 21.11.2010
Сообщений: 194
27.03.2011, 09:57  [ТС] #15
Цитата Сообщение от Deviaphan Посмотреть сообщение
Это называется выход за границы массива.) Не радуйся.)
но так можно делать? ведь работает и причем без сбоев и косяков же
вот думаю методом перебора можно ли тут, а то боюсь что оон начнет тупит в плане того что если в массиве обычном сравниваются поэлементно т.е. 1 массив и второй ассив и затем поэлементно поганяется то как тут тогда?
я как то пробовал просто вывести на экран list[i].f_name[0] или даже 1 он тупо игнорит и выводит каракули
0
27.03.2011, 09:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.03.2011, 09:57
Привет! Вот еще темы с ответами:

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

Структуры данных: списки - C++
Для каждого файла в каталоге содержатся следующие сведения: • Имя файла; • Дата создания; • Количество обращений к файлу. ...

Структуры данных: Списки - C++
Составить программу, которая содержит текущую информацию о книгах в библиотеке. Сведения о книгах содержат: • Номер УДК; • ...

Создание структуры Список студентов - C++
Нужна помощь. Есть в методичке пример создания Ведомости студентов. Код: #include &lt;iostream.h&gt; #include &lt;stdio.h&gt; #include &lt;conio.h&gt; ...


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

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

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