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

Как правильно объявить структуру - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.63
OverDozero
 Аватар для OverDozero
98 / 98 / 6
Регистрация: 07.04.2011
Сообщений: 517
05.07.2014, 16:35     Как правильно объявить структуру #1
Всем доброго времени суток.Есть задача:Составить программу формирования данных об успеваемости студентов по дисциплине: фамилия И.О., 5 оценок по контрольным мероприятиям. Организовать вычисление итоговых оценок: если студент набрал 80% и более от максимально возможного балла – оценка 5, от 60% до 79% – 4; от 40% до 59% -3, менее 40% - 2
Необходимо использовать структуры.
Задумка такая:
Задаем количество студентов с клавиатуры.
Количество студентов=количеству структур.
1:вводим количество студентов
Заполнение структуры:
1.Вводим фио студента.
2.Водим количество предметов,которые есть у данного студента
3.Вводим конкретный предмет
4.Указываем максимальный балл по этому предмету
5.Указываем оценки по по конкретному предмету
Например:
1 студент
-Иванов И.И
-2 предмета у студента
-2.1 - математика
-2.1.1-максимальный бал по предмету =100
-2.1.1.1.-вводим баллы по предмету математика
После ввода баллов вводим 2 предмет и аналогичные действия пунктам 2.1-2.1.1.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
#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <stdlib.h>
#include <alloc.h>
 struct stud{
    char FIO[256];//ÔÈÎ
    char pred [256];//ïðåäìåò
    int ozp [5];//îöåГ*ГЄГЁ
    int maxball;
    int kolpred[99];
      };
 
int percent=0;//ñêîëüêî ïðîöåГ*ГІ Г*Г*ГЎГ°Г*Г« ñòóäåГ*ГІ
int sumball=0;//Г±ГіГ¬Г* ГЎГ*ëëîâ
//int maxball=0;//Г¬Г*ГЄГ±ГЁГ¬Г*ëüГ*ûé ГЎГ*ëë ГЇГ® Г¤Г*Г*Г*îìó ïðåäìåòó
//int kolpred=0;//êîëè÷åñòâî ïðåäìåòîâ Гі ñòóäåГ*ГІГ*
int kolvostud=0;//êîëè÷åñòâî Г±ГіГІГҐГ¤Г*òîâ
//percent=(sumball*100)/maxball
 
 int main ()
  {
      struct stud std[999]
     printf("Vvedite loli4estvo studentov:");
     scanf("%d",&kolvostud);
 
    for (int i=0;i<kolvostud;++i){//1 on I
     printf("Vvedite FIO studenta(4erez probel):");
     scanf("%s",std[i].FIO);
     
     printf("Vvedite koli4estvo predmetov u studenta:");
     scanf("%d",&std[i].kolpred);   
         for (int j=0;j<std[i].kolpred;++j){//2 on J
     
             printf("Vvedite nazvanie '%d' predmeta:",j+1);
             scanf("%s",std[i].pred);
              
               printf("Vvedite max.ball po predmetu: %s",std[i].pred);
             scanf("%d",std[i].maxball);
               for (int k=0;k<5;++j){//3 on K
                 printf("Vvedite ocenku В№:%d",k+1);
             scanf("%d",std[i].ozp);
               }//3 off K
                   }//2 off J 
                         }//1 off I
Вот попытался что-то объявить,но тут явно проблема в объявлении структуры.
Прошу помощи с этой задачей.Спасибо!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
05.07.2014, 16:41     Как правильно объявить структуру #2
Цитата Сообщение от OverDozero Посмотреть сообщение
Структура в C++
С++ - это другой язык, и раздел для него есть соответствующий. Но поскольку код на С больше похож, всё-таки уточню: на каком языке нужно решение?
OverDozero
 Аватар для OverDozero
98 / 98 / 6
Регистрация: 07.04.2011
Сообщений: 517
05.07.2014, 20:59  [ТС]     Как правильно объявить структуру #3
Выбор языка реализации не важен.С++ или С.Без разницы.Я сам потом уже переделаю.Мне важно понять сам принцип решения.
P.S.Разделом ошибся
Учусь писать в MinGW

Добавлено через 4 часа 5 минут
Ребят,подскажите пожалуйста с реализацией данной структуры.Не получается написать так,как расписано в примере.
korvin_
 Аватар для korvin_
1327 / 1098 / 160
Регистрация: 28.04.2012
Сообщений: 3,926
06.07.2014, 00:47     Как правильно объявить структуру #4
Цитата Сообщение от OverDozero Посмотреть сообщение
Вот попытался что-то объявить,но тут явно проблема в объявлении структуры.
С чего ты взял, что там проблема? Всё работает.
Vtulhu
06.07.2014, 12:25
  #5

Не по теме:

stud - это "жеребец" по-английски. А когда я вижу имена переменных типа "kolpred", то понимаю, что надо возвращать в школы практику порки розгами. Это жестоко, но иначе это ЕГЫГЫ-поколение уже не спасти.

OverDozero
 Аватар для OverDozero
98 / 98 / 6
Регистрация: 07.04.2011
Сообщений: 517
06.07.2014, 13:13  [ТС]     Как правильно объявить структуру #6
Мне надо к каждому КОНКРЕТНОМУ студенту привязать конкретные предметы,максимальные баллы по этому предмету и оценки.
Пример:
Студент: Иванов
Количество предметов у студента:2
Предмет 1:Математика
Макс.балл по математике:100
Оценки по математике:20,20,20,20,20(ввод оценок)
Предмет 2:Физика
Макс.балл по физике:50
Оценки по физике:10,10,10,10,10(ввод оценок)

Вывод результата:
ФИО студента: Иванов
Количество предметов у студента:2
Предмет 1:Математика
Макс.балл по математике:100
Оценки по математике:20,20,20,20,20(вывод оценок)
Предмет 2:Физика
Макс.балл по физике:50
Оценки по физике:10,10,10,10,10(вывод оценок)

Мне к студенту Иванов надо привязать определенное количество предметов,и к каждому предмету привязать свой максимальный балл и свои оценки
Допустим будет 3 структуры:Иванов,Петров,Сидоров
И к каждой из структур привязано свое количество предметов,а к каждому предмету свой максимальный балл и свои оценки
ВОПРОС:Как объявить такую структуру,чтоб можно было использовать алгоритм решения,описанный выше.
Или нужно объявлять несколько структур?
P.S.Я не прошу за меня решать задачу и писать код.Подскажите объявление структуры для описанного алгоритма

Добавлено через 2 минуты
Цитата Сообщение от Vtulhu Посмотреть сообщение
Не по теме:
stud - это "жеребец" по-английски. А когда я вижу имена переменных типа "kolpred", то понимаю, что надо возвращать в школы практику порки розгами. Это жестоко, но иначе это ЕГЫГЫ-поколение уже не спасти.
Уважаемый Vtulhu-я пишу так,как удобно мне.Если вам есть что-то дополнить по данной теме-пишите.Если нет-прошу набивать рейтинг сообщений в другом месте
uglyPinokkio
325 / 228 / 41
Регистрация: 30.05.2014
Сообщений: 682
06.07.2014, 14:01     Как правильно объявить структуру #7
Цитата Сообщение от OverDozero Посмотреть сообщение
Мне к студенту Иванов надо привязать определенное количество предметов,и к каждому предмету привязать свой максимальный балл и свои оценки
Допустим будет 3 структуры:Иванов,Петров,Сидоров
И к каждой из структур привязано свое количество предметов,а к каждому предмету свой максимальный балл и свои оценки
Очевидно - завести структуру "студент", в которой завести массив структур "предмет" с баллами и оценками.
В чем проблема то?

C++
1
2
3
4
5
6
7
8
9
10
11
12
struct Subject
{
   std::string name_;
   int max_val_;
   std::vector<int> values_;
};
 
struct Student
{
    std::string name_;
    std::vector<Subject> subjects_;
};
Vtulhu
369 / 375 / 96
Регистрация: 12.08.2011
Сообщений: 1,610
06.07.2014, 14:52     Как правильно объявить структуру #8
Уважаемый Vtulhu-я пишу так,как удобно мне.
И это Ваша главная проблема.

Если вам есть что-то дополнить по данной теме-пишите.
Есть, есть. Только я не скажу, потому что я не люблю людей с синдромом Даннинга-Крюгера. Когда захотите учиться - обращайтесь. С удовольствием помогу. Именно учиться. Потому что научить кого-то - невозможно. Можно только помочь научиться. Но для этого надо, как минимум, чтобы человек осознал свою неученость. Между прочим, "Недоросль" Фонвизина списан с реального человека. И тот, когда увидел пьесу, понял это (хоть на это ума хватило!), и так это его проняло, что он начал учиться как проклятый. В результате он стал ученым. В истории науки он следа особого не оставил, но по меркам своего времени был довольно образованным человеком.
OverDozero
 Аватар для OverDozero
98 / 98 / 6
Регистрация: 07.04.2011
Сообщений: 517
06.07.2014, 15:38  [ТС]     Как правильно объявить структуру #9
Вроде разобрался с вложенными структурами.Теперь проблема в выводе:строка 56-pred[i].kolpred не объявлена в этой области.Cоздание массива структур по количеству предметов происходит после создания массива структур студентов,так как к каждому студенту привязывается свое количество предметов
Как объявить структуру pred,чтобы она была видна в выводе?
В строках 36-39 правильно сделано создание массива структур по предметам?И присваивание элементу структуры pred.[0].kolpred количества предметов для конкретного студента?
Кликните здесь для просмотра всего текста
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
#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <stdlib.h>
#include <alloc.h>
/*ÑîñòГ*ГўГЁГІГј ïðîãðГ*ììó ôîðìèðîâГ*Г*ГЁГї Г¤Г*Г*Г*ûõ îá ГіГ±ГЇГҐГўГ*åìîñòè ñòóäåГ*òîâ ГЇГ® äèñöèïëèГ*ГҐ:
ГґГ*ìèëèÿ Г€.ГЋ., 5 îöåГ*îê ГЇГ® ГЄГ®Г*òðîëüГ*ûì ìåðîïðèÿòèÿì.
ÎðãГ*Г*èçîâГ*ГІГј âû÷èñëåГ*ГЁГҐ èòîãîâûõ îöåГ*îê: åñëè ñòóäåГ*ГІ Г*Г*ГЎГ°Г*Г« 80% ГЁ áîëåå îò Г¬Г*ГЄГ±ГЁГ¬Г*ëüГ*Г® âîçìîæГ*îãî ГЎГ*ëëГ* – îöåГ*ГЄГ* 5,
îò 60% äî 79% – 4; îò 40% äî 59% -3, ìåГ*ГҐГҐ 40% - 2*/
 
 struct predmet{
    char predm [256];//ïðåäìåò
    int ozp [5];//îöåГ*ГЄГЁ
    int maxball;
    int kolpred;//êîëè÷åñòâî ïðåäìåòîâ 
 };
 struct students{
    char FIO[256];//ÔÈÎ
    struct predmet pred;
  };
int percent=0;//ñêîëüêî ïðîöåГ*ГІ Г*Г*ГЎГ°Г*Г« ñòóäåГ*ГІ
int sumball=0;//Г±ГіГ¬Г* ГЎГ*ëëîâ
int kolvostud=0;//êîëè÷åñòâî Г±ГіГІГҐГ¤Г*òîâ
int pr=0;
 
 int main ()
  {
      
     printf("Vvedite loli4estvo studentov:");
     scanf("%d",&kolvostud);
         students study/*èìÿ ïåðåìåГ*Г*îé ñòðóêòóðû*/ [kolvostud];
      for (int i=0;i<kolvostud;i++){//1 on I
     printf("Vvedite FIO studenta(4erez probel):");
     scanf("%s",study[i].FIO);
          
         printf("Vvedite koli4estvo predmetov u studenta:");
         scanf("%d",&pr);
         predmet pred[pr];
         pred[0].kolpred=pr;
                        for (int j=0;j<pr;j++){//2 on J
     
             printf("Vvedite nazvanie %d predmeta:",j+1);
             scanf("%s",pred[j].predm);
              
               printf("Vvedite max.ball po predmetu %s: ",pred[j].predm);
             scanf("%d",&pred[j].maxball);
               for (int k=0;k<5;++k){//3 on K
                 printf("Vvedite ocenku %d:",k+1);
             scanf("%d",&pred[j].ozp[k]); }//3 off K
                   }//2 off J 
                         }//1 off I
      
      //âûâîä
      for (int i=0;i<kolvostud;i++){//1 on I
      printf("FIO studenta %s:\n",study[i].FIO);
      printf("Koli4estvo predmetov u studenta %s %d:\n",study[i].FIO,pred[i].kolpred);
                  for (int j=0;j<pred[j].kolpred;j++){//2 on J
                  printf("Predmet:%s\n",pred[j].predm);
                  printf("Max.ball po predmetu %s: \n",pred[j].maxball);
                  printf("Bally studenta po predmetu %d:");
                   for (int k=0;k<5;++k){//3 on K
                    
                 printf("%d",pred[j].ozp[k]);
                 printf("/n");
              }//3 off K
                   }//2 off J 
                         }//1 off I
      
    getch();
  return 0;}


Добавлено через 4 минуты
Цитата Сообщение от Vtulhu Посмотреть сообщение
Уважаемый Vtulhu-я пишу так,как удобно мне.
И это Ваша главная проблема.
На данном этапе(этапе изучения),моя приоритетная задача разобраться с синтаксисом языка,написанием кода и тд.Объявление "красивых" переменных, пока в мои планы не входит.Сейчас важен сам принцип.А остальное придет с опытом.
uglyPinokkio
325 / 228 / 41
Регистрация: 30.05.2014
Сообщений: 682
06.07.2014, 15:45     Как правильно объявить структуру #10
Цитата Сообщение от OverDozero Посмотреть сообщение
Вроде разобрался с вложенными структурами.
Нет. Количество предметов должно быть атрибутом студента а не предмета.

C
1
2
3
4
5
6
7
8
9
10
struct predmet{
    char predm [256];//предмет
    int ozp [5];//оценки
    int maxball;
 };
 struct students{
    char FIO[256];//ФИО
    int kolpred;//количество предметов 
    struct predmet *pred;//Указатель на список предметов
  };
OverDozero
 Аватар для OverDozero
98 / 98 / 6
Регистрация: 07.04.2011
Сообщений: 517
06.07.2014, 16:20  [ТС]     Как правильно объявить структуру #11
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
Нет. Количество предметов должно быть атрибутом студента а не предмета.
Поправил код в соответствии с вашим замечанием.Так должно быть?
Не получается передать указатель по предмету в вывод.Как правильно передать указатель?
И еще вопрос:Когда ввожу фамилию студента,допустим Иванов,и далее количество предметов-все нормально.Но когда хочу ввести так Иванов К.Д.-программы закрывается в случае если указан 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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <stdlib.h>
#include <alloc.h>
/*ÑîñòГ*ГўГЁГІГј ïðîãðГ*ììó ôîðìèðîâГ*Г*ГЁГї Г¤Г*Г*Г*ûõ îá ГіГ±ГЇГҐГўГ*åìîñòè ñòóäåГ*òîâ ГЇГ® äèñöèïëèГ*ГҐ:
ГґГ*ìèëèÿ Г€.ГЋ., 5 îöåГ*îê ГЇГ® ГЄГ®Г*òðîëüГ*ûì ìåðîïðèÿòèÿì.
ÎðãГ*Г*èçîâГ*ГІГј âû÷èñëåГ*ГЁГҐ èòîãîâûõ îöåГ*îê: åñëè ñòóäåГ*ГІ Г*Г*ГЎГ°Г*Г« 80% ГЁ áîëåå îò Г¬Г*ГЄГ±ГЁГ¬Г*ëüГ*Г® âîçìîæГ*îãî ГЎГ*ëëГ* – îöåГ*ГЄГ* 5,
îò 60% äî 79% – 4; îò 40% äî 59% -3, ìåГ*ГҐГҐ 40% - 2*/
 
 struct predmet{
    char predm [256];//ïðåäìåò
    int ozp [5];//îöåГ*ГЄГЁ
    int maxball;
 };
 struct students{
    char FIO[256];//ÔÈÎ
    int kolpred;//êîëè÷åñòâî ïðåäìåòîâ 
    struct predmet *pred;
  };
int percent=0;//ñêîëüêî ïðîöåГ*ГІ Г*Г*ГЎГ°Г*Г« ñòóäåГ*ГІ
int sumball=0;//Г±ГіГ¬Г* ГЎГ*ëëîâ
int kolvostud=0;//êîëè÷åñòâî Г±ГіГІГҐГ¤Г*òîâ
int pr=0;
 
 int main ()
  {
      
     printf("Vvedite loli4estvo studentov:");
     scanf("%d",&kolvostud);
         students study [kolvostud];
      for (int i=0;i<kolvostud;i++){//1 on I
     printf("Vvedite FIO studenta(4erez probel):");
     scanf("%s",study[i].FIO);
          
         printf("Vvedite koli4estvo predmetov u studenta:");
         scanf("%d",&study[i].kolpred);
         predmet pred[study[i].kolpred];
                        for (int j=0;j<study[i].kolpred;j++){//2 on J
     
             printf("Vvedite nazvanie %d predmeta:",j+1);
             scanf("%s",pred[j].predm);
              
               printf("Vvedite max.ball po predmetu %s: ",pred[j].predm);
             scanf("%d",&pred[j].maxball);
               for (int k=0;k<5;++k){//3 on K
                 printf("Vvedite ocenku %d:",k+1);
             scanf("%d",&pred[j].ozp[k]); }//3 off K
                   }//2 off J 
                         }//1 off I
      
      //âûâîä
     
for (int i=0;i<kolvostud;i++){//1 on I
      printf("FIO studenta %s:\n",study[i].FIO);
      printf("Koli4estvo predmetov u studenta %s %d:\n",study[i].FIO,study[i].kolpred);
                  for (int j=0;j<study[i].kolpred;j++){//2 on J
                  printf("Predmet:%s\n",pred[j].predm);
                  printf("Max.ball po predmetu %s: \n",pred[j].maxball);
                  printf("Bally studenta po predmetu %d:");
                   for (int k=0;k<5;++k){//3 on K
                    
                 printf("%d",pred[j].ozp[k]);
                 printf("/n");
              }//3 off K
                   }//2 off J 
                         }//1 off I*/
    getch();
  return 0;}
uglyPinokkio
325 / 228 / 41
Регистрация: 30.05.2014
Сообщений: 682
06.07.2014, 18:33     Как правильно объявить структуру #12
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от OverDozero Посмотреть сообщение
Так должно быть?
Память под предметы надо отводить.

Цитата Сообщение от OverDozero Посмотреть сообщение
Как правильно передать указатель?
В данном случае - индексировать как массив.

Цитата Сообщение от OverDozero Посмотреть сообщение
Но когда хочу ввести так Иванов К.Д.-программы закрывается в случае если указан 1 студент,а если более,при вводе фамилии второго студента таким образом -Иванов К.Д - зацикливается.
Потому что scanf предназначен для ввода строки до первого разделителя. Для ввода строки с разделителями используется fgets.

Код - адская смесь C и C++, которую можно компилировать только g++

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
#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <stdlib.h>
//#include <alloc.h>
 
/*Составить программу формирования данных об успеваемости студентов по дисциплине:
фамилия И.О., 5 оценок по контрольным мероприятиям.
Организовать вычисление итоговых оценок: если студент набрал 80% и более от максимально возможного балла – оценка 5,
от 60% до 79% – 4; от 40% до 59% -3, менее 40% - 2*/
 
struct predmet{
    char predm [256];//предмет
    int ozp [5];//оценки
    int maxball;
};
 
struct students{
    char FIO[256];//ФИО
    int kolpred;//количество предметов
    struct predmet *pred;
};
 
int percent=0;//сколько процент набрал студент
int sumball=0;//сума баллов
int kolvostud=0;//количество сутеднтов
int pr=0;
 
int main ()
{
    printf("Vvedite loli4estvo studentov:");
    scanf("%d",&kolvostud);
    while ( getchar() != '\n' );
    students study[kolvostud];
    for (int i=0;i<kolvostud;i++){//1 on I
        printf("Vvedite FIO studenta(4erez probel):");
        fgets(study[i].FIO,255,stdin);
        printf("Vvedite koli4estvo predmetov u studenta:");
        scanf("%d",&study[i].kolpred);
        while ( getchar() != '\n' );
        study[i].pred = (predmet*)calloc(study[i].kolpred,sizeof(predmet));
        for (int j=0;j<study[i].kolpred;j++){//2 on J
            printf("Vvedite nazvanie %d predmeta:",j+1);
            fgets(study[i].pred[j].predm,255,stdin);
            printf("Vvedite max.ball po predmetu %s: ",study[i].pred[j].predm);
            scanf("%d",&study[i].pred[j].maxball);
            for (int k=0;k<5;++k){//3 on K
                printf("Vvedite ocenku %d:",k+1);
                scanf("%d",&study[i].pred[j].ozp[k]);
            }//3 off K
            while ( getchar() != '\n' );
        }//2 off J
    }//1 off I
 
    //вывод
 
    for (int i=0;i<kolvostud;i++){//1 on I
        printf("FIO studenta %s:\n",study[i].FIO);
        printf("Koli4estvo predmetov u studenta %s %d:\n",study[i].FIO,study[i].kolpred);
        for (int j=0;j<study[i].kolpred;j++){//2 on J
            printf("Predmet:%s\n",study[i].pred[j].predm);
            printf("Max.ball po predmetu %d: \n",study[i].pred[j].maxball);
            printf("Bally studenta po predmetu %d:");
            for (int k=0;k<5;++k){//3 on K
                printf("%d",study[i].pred[j].ozp[k]);
                printf("/n");
            }//3 off K
        }//2 off J
    }//1 off I*/
    getch();
    return 0;
}
Добавлено через 1 час 7 минут
C
1
2
3
for (int i=0;i<kolvostud;i++){
        free(study[i].pred);
}
Забыл память почистить, сорри.
OverDozero
 Аватар для OverDozero
98 / 98 / 6
Регистрация: 07.04.2011
Сообщений: 517
06.07.2014, 19:01  [ТС]     Как правильно объявить структуру #13
До памяти я еще не добрался)Разбираюсь с вводом
C
1
2
printf("Vvedite max.ball po predmetu %s:",study[i].pred[j].predm);
            scanf("%d",&study[i].pred[j].maxball);
Результат на скрине.
%s стоит до двоеточия, : переносится на следующую строку.Если указать после двоеточия,то вывод нормально в этой строке,но название предмета показывается после двоеточия,хотя после должен быть ввод максимального балла по предмету.
Я так понимаю fgets считывает строку,пока не будет достигнут \n.И \n станет частью строки.Выходит к введенным данным добавляется перевод на новую строку.
С выводом такая же естественно такая же проблема.Происходит переход на новую строку в ненужном месте.
Как с этим можно бороться?
Надо покопать в сторону gets
Миниатюры
Как правильно объявить структуру  
uglyPinokkio
325 / 228 / 41
Регистрация: 30.05.2014
Сообщений: 682
06.07.2014, 19:03     Как правильно объявить структуру #14
Цитата Сообщение от OverDozero Посмотреть сообщение
Как с этим можно бороться?
Ну к примеру заменить \n нулем .
OverDozero
 Аватар для OverDozero
98 / 98 / 6
Регистрация: 07.04.2011
Сообщений: 517
07.07.2014, 13:05  [ТС]     Как правильно объявить структуру #15
Все спасибо!Разобрался с структурами.И дабы не плодить лишних тем-буду продолжать писать здесь.Вопрос другой,но задача 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
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
#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <stdlib.h>
 
/*Составить программу формирования данных об успеваемости студентов по дисциплине:
фамилия И.О., 5 оценок по контрольным мероприятиям.
Организовать вычисление итоговых оценок: если студент набрал 80% и более от максимально возможного балла – оценка 5,
от 60% до 79% – 4; от 40% до 59% -3, менее 40% - 2*/
 
struct predmet{
    char predm [256];//предмет
    int ozp [5];//оценки
    int maxball;
 };
 struct students{
    char FIO[256];//ФИО
    int kolpred;//количество предметов 
    struct predmet *pred;
  };
 
int percent=0;//сколько процент набрал студент
int sumball=0;//сума баллов
int kolvostud=0;//количество сутеднтов
 
int main ()
{
    printf("Vvedite loli4estvo studentov:");
    scanf("%d",&kolvostud);
    while ( getchar() != '\n' );
    students study[kolvostud];
    for (int i=0;i<kolvostud;i++){//1 on I
        printf("Vvedite FIO studenta(4erez probel):");
        gets(study[i].FIO);
 
        printf("Vvedite koli4estvo predmetov u studenta:");
        scanf("%d",&study[i].kolpred);
            while ( getchar() != '\n' );
     study[i].pred = (predmet*)calloc(study[i].kolpred,sizeof(predmet));
 
        for (int j=0;j<study[i].kolpred;j++){//2 on J
            printf("Vvedite nazvanie %d predmeta:",j+1);
            gets(study[i].pred[j].predm);
            printf("Vvedite max.ball po predmetu %s:",study[i].pred[j].predm);
            scanf("%d",&study[i].pred[j].maxball);
            for (int k=0;k<5;++k){//3 on K
                printf("Vvedite ocenku %d:",k+1);
                scanf("%d",&study[i].pred[j].ozp[k]);
            }//3 off K
            while ( getchar() != '\n' );
        }//2 off J
    }//1 off I
 
    //вывод
 printf("__________________________________________________\n");
    for (int i=0;i<kolvostud;i++){//1 on I
        printf("FIO studenta:%s\n",study[i].FIO);
        printf("Koli4estvo predmetov u studenta %s:%d \n",study[i].FIO,study[i].kolpred);
        for (int j=0;j<study[i].kolpred;j++){//2 on J
            printf("Predmet:%s\n",study[i].pred[j].predm);
            printf("Max.ball po predmetu %s:%d\n",study[i].pred[j].predm,study[i].pred[j].maxball);
            printf("Bally studenta po predmetu:");
            for (int k=0;k<5;k++){//3 on K
                 printf("%d;",study[i].pred[j].ozp[k]);
                 sumball=sumball+study[i].pred[j].ozp[k];//вычисление суммы баллов по данному студенту
            }//3 off K
            percent=((sumball*100)/study[i].pred[j].maxball);
            printf("\n");
            printf("Procent ot maksimalnogo balla:%d\n",percent);   
            //вывод оценки
            if (percent<40) printf("Ocenka sostavlyaet 2 balla\n");
            if ((percent>=40) && (percent<=59)) printf("Ocenka sostavlyaet 3 balla\n");
            if ((percent>=60) && (percent<=79)) printf("Ocenka sostavlyaet 4 balla\n");
            if  (percent>=80) printf("Ocenka sostavlyaet 5 ballov\n");
            printf("--------------------------------------------\n");
            sumball=0;//обнуление суммы
        percent=0;//обнуление процентов
        }//2 off J
        
        printf("////////////////////////////////////////////\n");
    }//1 off I
    for (int i=0;i<kolvostud;i++){
        free(study[i].pred);
}
    getch();
    return 0;
}


Теперь нужно записать структуры с данными в файл.Запись в файл проходит нормально
Код записи:
Кликните здесь для просмотра всего текста
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
#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <stdlib.h>
 
 
/*Составить программу формирования данных об успеваемости студентов по дисциплине:
фамилия И.О., 5 оценок по контрольным мероприятиям.
Организовать вычисление итоговых оценок: если студент набрал 80% и более от максимально возможного балла – оценка 5,
от 60% до 79% – 4; от 40% до 59% -3, менее 40% - 2*/
 
struct predmet{
    char predm [256];//предмет
    int ozp [5];//оценки
    int maxball;
 };
 struct students{
    char FIO[256];//ФИО
    int kolpred;//количество предметов 
    struct predmet *pred;
  };
int kolvostud=0;//количество сутеднтов
 
int main ()
{
    printf("Vvedite loli4estvo studentov:");
    scanf("%d",&kolvostud);
   while ( getchar() != '\n' );
    students study[kolvostud];
    for (int i=0;i<kolvostud;i++){//1 on I
        printf("Vvedite FIO studenta(4erez probel):");
        gets(study[i].FIO);
        printf("Vvedite koli4estvo predmetov u studenta:");
        scanf("%d",&study[i].kolpred);
            while ( getchar() != '\n' );
     study[i].pred = (predmet*)calloc(study[i].kolpred,sizeof(predmet));
 
        for (int j=0;j<study[i].kolpred;j++){//2 on J
            printf("Vvedite nazvanie %d predmeta:",j+1);
            gets(study[i].pred[j].predm);
            printf("Vvedite max.ball po predmetu %s:",study[i].pred[j].predm);
            scanf("%d",&study[i].pred[j].maxball);
            for (int k=0;k<5;++k){//3 on K
                printf("Vvedite ocenku %d:",k+1);
                scanf("%d",&study[i].pred[j].ozp[k]);
            }//3 off K
            while ( getchar() != '\n' );
        }//2 off J
    }//1 off I
 
    //запись в файл
FILE *in;
 in=fopen("struct.txt","w");
    fprintf(in,"%d\n",kolvostud);
    for (int i=0;i<kolvostud;i++){//1 on I
        fprintf(in,"%s\n",study[i].FIO);
        fprintf(in,"%d\n",study[i].kolpred);
        for (int j=0;j<study[i].kolpred;j++){//2 on J
            fprintf(in,"%s\n",study[i].pred[j].predm);
            fprintf(in,"%d\n",study[i].pred[j].maxball);
            for (int k=0;k<5;k++){//3 on K
                 fprintf(in,"%d\n",study[i].pred[j].ozp[k]);
                 }//3 off K
        }//2 off J
    }//1 off I
    fclose(in);
    printf("\n");
    printf("Zapis v fayl zavershena.Dlya prodolgeniya nagmite lubuyu klavishu");
    for (int i=0;i<kolvostud;i++){
        free(study[i].pred);}
    getch();
    return 0;
}

Структура файла:
Кликните здесь для просмотра всего текста

2-всего количество студентов=количеству структур студент
Ivanov I.I. студент 1
1-количество предметов у студента 1
Matematika-название первого предмета у студента 1
100-максимальный балл по предмету математика
20
20
20
10
10-баллы по предмету математика
Petrov P.P.
2
Russkiy
90
20
20
20
10
15
Fizika
50
10
10
10
10
10

Не могу разобраться с чтением данных из файла и запись назад в структуры.fscanf чушь выдает при чтении строк с именем и

названием предмета.fgets тоже не выходит
Набросал код чтения:
Кликните здесь для просмотра всего текста
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
104
105
106
#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <stdlib.h>
 
 
/*ÑîñòГ*ГўГЁГІГј ïðîãðГ*ììó ôîðìèðîâГ*Г*ГЁГї Г¤Г*Г*Г*ûõ îá ГіГ±ГЇГҐГўГ*åìîñòè ñòóäåГ*òîâ ГЇГ® äèñöèïëèГ*ГҐ:
ГґГ*ìèëèÿ Г€.ГЋ., 5 îöåГ*îê ГЇГ® ГЄГ®Г*òðîëüГ*ûì ìåðîïðèÿòèÿì.
ÎðãГ*Г*èçîâГ*ГІГј âû÷èñëåГ*ГЁГҐ èòîãîâûõ îöåГ*îê: åñëè ñòóäåГ*ГІ Г*Г*ГЎГ°Г*Г« 80% ГЁ áîëåå îò Г¬Г*ГЄГ±ГЁГ¬Г*ëüГ*Г® âîçìîæГ*îãî ГЎГ*ëëГ* – îöåГ*ГЄГ* 5,
îò 60% äî 79% – 4; îò 40% äî 59% -3, ìåГ*ГҐГҐ 40% - 2*/
 
struct predmet{
    char predm [256];//ïðåäìåò
    int ozp [5];//îöåГ*ГЄГЁ
    int maxball;
 };
 struct students{
    char FIO[256];//ÔÈÎ
    int kolpred;//êîëè÷åñòâî ïðåäìåòîâ 
    struct predmet *pred;
  };
 
int percent=0;//ñêîëüêî ïðîöåГ*ГІ Г*Г*ГЎГ°Г*Г« ñòóäåГ*ГІ
int sumball=0;//Г±ГіГ¬Г* ГЎГ*ëëîâ
int kolvostud=0;//êîëè÷åñòâî Г±ГіГІГҐГ¤Г*òîâ
char arr[255];
int main ()
 
{   
    FILE *in;
 in=fopen("struct.txt","r");
 fscanf (in,"%d", &kolvostud);  
 printf("%d\n",kolvostud);
students study[kolvostud]; 
 for (int i=0;i<kolvostud;i++){//1 on I
        fscanf(in,"%s",study[i].FIO);
        printf("%s\n",study[i].FIO);
        fscanf(in,"%d",&study[i].kolpred);
        printf("%d\n",study[i].kolpred);}
       /* for (int j=0;j<study[i].kolpred;j++){//2 on J
            
            
            
            study[i].pred[j].predm);
            fscanf(in,"%d",study[i].pred[j].maxball);
            for (int k=0;k<5;k++){//3 on K
                 fscanf(in,"%d",study[i].pred[j].ozp[k]);
                 }//3 off K
        }//2 off J
    }//1 off I*/
    
    
    
    
    
    
    
/*  printf("Vvedite loli4estvo studentov:");
    scanf("%d",&kolvostud);
   while ( getchar() != '\n' );
    students study[kolvostud];
    for (int i=0;i<kolvostud;i++){//1 on I
        printf("Vvedite FIO studenta(4erez probel):");
        gets(study[i].FIO);
 
        printf("Vvedite koli4estvo predmetov u studenta:");
        scanf("%d",&study[i].kolpred);
            while ( getchar() != '\n' );
     study[i].pred = (predmet*)calloc(study[i].kolpred,sizeof(predmet));
 
        for (int j=0;j<study[i].kolpred;j++){//2 on J
            printf("Vvedite nazvanie %d predmeta:",j+1);
            gets(study[i].pred[j].predm);
            printf("Vvedite max.ball po predmetu %s:",study[i].pred[j].predm);
            scanf("%d",&study[i].pred[j].maxball);
            for (int k=0;k<5;++k){//3 on K
                printf("Vvedite ocenku %d:",k+1);
                scanf("%d",&study[i].pred[j].ozp[k]);
            }//3 off K
            while ( getchar() != '\n' );
        }//2 off J
    }//1 off I
 
    //Г§Г*ГЇГЁГ±Гј Гў ГґГ*éë
FILE *in;
 in=fopen("struct.txt","w");
    fprintf(in,"%d\n",kolvostud);
    for (int i=0;i<kolvostud;i++){//1 on I
        fprintf(in,"%s\n",study[i].FIO);
        fprintf(in,"%d\n",study[i].kolpred);
        for (int j=0;j<study[i].kolpred;j++){//2 on J
            fprintf(in,"%s\n",study[i].pred[j].predm);
            fprintf(in,"%d\n",study[i].pred[j].maxball);
            for (int k=0;k<5;k++){//3 on K
                 fprintf(in,"%d\n",study[i].pred[j].ozp[k]);
                 }//3 off K
        }//2 off J
    }//1 off I
    fclose(in);
    printf("\n");
    printf("Zapis v fayl zavershena.Dlya prodolgeniya nagmite lubuyu klavishu");
    for (int i=0;i<kolvostud;i++){
        free(study[i].pred);*///}
    getch();
    return 0;
}

Понятно что тут неправильно.Не могу разобрать как реализовать чтение из файла с привязкой к конкретному студенту своего количества предметов,баллы и оценки по предмету.Ясно что надо делать в цикле.Как это реализовать чтением из файла?
Спасибо за ответы!

Добавлено через 1 час 59 минут
Фигня какая-то выходит.Не получается записать данные из файла в структуру,в том же порядке,в каком они были записаны в файл.
uglyPinokkio
325 / 228 / 41
Регистрация: 30.05.2014
Сообщений: 682
07.07.2014, 17:22     Как правильно объявить структуру #16
Запускать не пробовал, на глаз запись должна работать.

C++
1
fscanf(in,"%d",&study[i].kolpred);
Тут отводишь массив структур требуемого размера

C++
1
study[i].pred = (predmet*)calloc(study[i].kolpred,sizeof(predmet));
И дальше в цикле читаешь поля в том же порядке, что и писал.
Что именно не работает-то?
OverDozero
 Аватар для OverDozero
98 / 98 / 6
Регистрация: 07.04.2011
Сообщений: 517
07.07.2014, 17:42  [ТС]     Как правильно объявить структуру #17
Не выходит написать чтение файла именно в том же порядке,как и записывалась структура.
Чтение ладно..хотя тут проблемы есть..например с фамилией студента.Надо читать через fgets.Через fscanf опять же читает до первого пробела.
Возьму для примера структуру файла:
2-всего количество студентов=количеству структур студент
Ivanov I.I. студент 1
1-количество предметов у студента 1
Matematika-название первого предмета у студента 1
100-максимальный балл по предмету математика
20
20
20
10
Каким образом организовать чтение в цикле и запись в структуру,чтоб записать именно так:100 баллов,относится к предмету математика,который относится к студенту Иванову.
Мне надо считать сначала строку с количеством предметов у студента Иванова,чтоб этому студенту организовать цикл по этому количеству предметов.И в этом цикле уже организовывать чтение макс.балла и баллов по предмету.Как обратиться при чтении файла к определенной строке,которая содержит количество предметов у данного студента..Вот в этом у меня проблема...
единственная идея это использовать префиксы перед записью новой строки.
Допустим префикс # ФИО студента,будет производиться запись в структуру студент.
Префикс * предмет,запись уже будет производиться в структуру предмет и тд
Допустим Фамилия Петров.Надо определить что эт офамилия уже другого студента,а не предмет Иванова
Но это уже (ВЦ)код.Может есть способ проще?
uglyPinokkio
325 / 228 / 41
Регистрация: 30.05.2014
Сообщений: 682
07.07.2014, 17:50     Как правильно объявить структуру #18
Цитата Сообщение от OverDozero Посмотреть сообщение
Каким образом организовать чтение в цикле и запись в структуру,чтоб записать именно так:100 баллов,относится к предмету математика,который относится к студенту Иванову.
В том варианте записи, что я видел, сначала пишется количество студентов, потом по каждому студенту ФИО, потом количество предметов и в цикле данные по каждому предмету.
Читать точно так же, только наоборот, - количество студентов, и дальше циклом данные каждого студента.
По каждому студенту ФИО, количество предметов и циклом данные по каждому предмету. Не нужно ничего никуда дописывать, только лишний головняк.
OverDozero
 Аватар для OverDozero
98 / 98 / 6
Регистрация: 07.04.2011
Сообщений: 517
07.07.2014, 19:33  [ТС]     Как правильно объявить структуру #19
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
#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <stdlib.h>
#include <iostream.h>
 
/*ÑîñòГ*ГўГЁГІГј ïðîãðГ*ììó ôîðìèðîâГ*Г*ГЁГї Г¤Г*Г*Г*ûõ îá ГіГ±ГЇГҐГўГ*åìîñòè ñòóäåГ*òîâ ГЇГ® äèñöèïëèГ*ГҐ:
ГґГ*ìèëèÿ Г€.ГЋ., 5 îöåГ*îê ГЇГ® ГЄГ®Г*òðîëüГ*ûì ìåðîïðèÿòèÿì.
ÎðãГ*Г*èçîâГ*ГІГј âû÷èñëåГ*ГЁГҐ èòîãîâûõ îöåГ*îê: åñëè ñòóäåГ*ГІ Г*Г*ГЎГ°Г*Г« 80% ГЁ áîëåå îò Г¬Г*ГЄГ±ГЁГ¬Г*ëüГ*Г® âîçìîæГ*îãî ГЎГ*ëëГ* – îöåГ*ГЄГ* 5,
îò 60% äî 79% – 4; îò 40% äî 59% -3, ìåГ*ГҐГҐ 40% - 2*/
 
struct predmet{
    char predm [255];//ïðåäìåò
    int ozp [5];//îöåГ*ГЄГЁ
    int maxball;
 };
 struct students{
    char FIO[255];//ÔÈÎ
    int kolpred;//êîëè÷åñòâî ïðåäìåòîâ 
    struct predmet *pred;
  };
 
int percent=0;//ñêîëüêî ïðîöåГ*ГІ Г*Г*ГЎГ°Г*Г« ñòóäåГ*ГІ
int sumball=0;//Г±ГіГ¬Г* ГЎГ*ëëîâ
int kolvostud=0;//êîëè÷åñòâî Г±ГіГІГҐГ¤Г*òîâ
char arr[255];
int main ()
 
{   
    FILE *in;
 in=fopen("struct.txt","r");
 fscanf (in,"%d", &kolvostud);  
 printf("%d",kolvostud);
students study[kolvostud]; 
 
 for (int i=0;i<kolvostud;i++){//1 on I
        fgets(arr,255,in);//Г·ГЁГІГ*ГҐГ¬ ñòðîêó Г± ÔÈÎ
        strcpy(study[i].FIO,arr);//Гў ñòðóêòóðó ГЇГЁГёГҐГ¬ ÔÈÎ
        printf("%s",study[i].FIO);
        fscanf(in,"%d",&study[i].kolpred);//Г·ГЁГІГ*ГҐГ¬ êîëè÷åñòâî ïðåäìåòîâ Гі ñòóäåГ*ГІГ*
        printf("%d",study[i].kolpred);
        study[i].pred = (predmet*)calloc(study[i].kolpred,sizeof(predmet));//âûäåëÿåì ГЇГ*ìÿòü ïîä ïðåäìåòû
        
            for (int j=0;j<study[i].kolpred;j++){//2 on J
 
                fgets(arr,255,in);
                strcpy(study[i].pred[j].predm,arr);//Гў ñòðóêòóðó äîáГ*âëÿåì Г*Г*çâГ*Г*ГЁГҐ ïðåäìåòГ*
                printf("%s",study[i].pred[j].predm);
                        fscanf(in,"%d",&study[i].pred[j].maxball);
                        printf("%d",study[i].pred[j].maxball);
                            for (int k=0;k<5;k++){//3 on K
                             fscanf(in,"%d",&study[i].pred[j].ozp[k]);
                             printf("%d;",study[i].pred[j].ozp[k]);
                 }//3 off K
        }//2 off J
 }//1 off I
Вот набросал код..Начиная с 2 цикла циклится..никак не пойму почему.Вроде идет строго по циклам.
Если рассматривать до 2 цикла в строчках
C++
1
2
        fscanf(in,"%d",&study[i].kolpred);//Г·ГЁГІГ*ГҐГ¬ êîëè÷åñòâî ïðåäìåòîâ Гі ñòóäåГ*ГІГ*
        printf("%d",study[i].kolpred);
муть какая то.Если эти 2 строчки убрать и убрать 2 цикл то выводит так в консоль:
2
Ivanov I.I.
1
Если их оставить:
2
36Ivanov I.I.
1
Откуда берется 36?Мусор
Просьба тыкнуть носом в ошибки в коде В чем ошибся?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.07.2014, 20:42     Как правильно объявить структуру
Еще ссылки по теме:

Как правильно написать функцию, которая редактирует структуру по полю Name и возвращает новую, исправленную структуру?.. C++
C++ Как правильно объявить массив строк c++
C++ Как правильно объявить статический метод

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

Или воспользуйтесь поиском по форуму:
uglyPinokkio
325 / 228 / 41
Регистрация: 30.05.2014
Сообщений: 682
07.07.2014, 20:42     Как правильно объявить структуру #20
Цитата Сообщение от OverDozero Посмотреть сообщение
Просьба тыкнуть носом в ошибки в коде
Файл приложи, я его писать сам не буду - 146%
Yandex
Объявления
07.07.2014, 20:42     Как правильно объявить структуру
Ответ Создать тему
Опции темы

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