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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.63
OverDozero
99 / 99 / 6
Регистрация: 07.04.2011
Сообщений: 523
#1

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

05.07.2014, 16:35. Просмотров 1423. Ответов 21
Метки нет (Все метки)

Всем доброго времени суток.Есть задача:Составить программу формирования данных об успеваемости студентов по дисциплине: фамилия И.О., 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
Вот попытался что-то объявить,но тут явно проблема в объявлении структуры.
Прошу помощи с этой задачей.Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.07.2014, 16:35
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как правильно объявить структуру (C++):

Как правильно объявить структуру в файле (модуле)? - C++
Возникла проблема такая проблема в файле Queue.h объявлена структура и указатели на нее #pragma once #ifndef QUEUE_H #define...

Как правильно написать функцию, которая редактирует структуру по полю Name и возвращает новую, исправленную структуру?.. - C++
Нужно отредактировать структуру по выбору пользователя. Проблема заключается в создании функции. Подскажите, а лучше покажите, как...

Как правильно объявить вектор? - C++
Только начинаю постигать STL. Подскажите, как заполнить случайными числами 1..9 значения контейнеров vector и map. И как вектор...

Как правильно объявить fopen - C++
Доброго времени суток. наткнулся на некоторого рода проблемку. Не могу объявить fopen.. Описываю так как на MSDN написано , а компилятор...

Как правильно объявить массив объектов - C++
Как правильно объявить массив объектов: #include &lt;cstdlib&gt; #include &lt;iostream&gt; using namespace std; class orenda_kvartiri {...

Как правильно объявить статический метод - C++
например class A { private: static void method(); // объявление }; // как правильно объявить реализацию?

21
easybudda
Модератор
Эксперт CЭксперт С++
9698 / 5648 / 964
Регистрация: 25.07.2009
Сообщений: 10,863
05.07.2014, 16:41 #2
Цитата Сообщение от OverDozero Посмотреть сообщение
Структура в C++
С++ - это другой язык, и раздел для него есть соответствующий. Но поскольку код на С больше похож, всё-таки уточню: на каком языке нужно решение?
0
OverDozero
99 / 99 / 6
Регистрация: 07.04.2011
Сообщений: 523
05.07.2014, 20:59  [ТС] #3
Выбор языка реализации не важен.С++ или С.Без разницы.Я сам потом уже переделаю.Мне важно понять сам принцип решения.
P.S.Разделом ошибся
Учусь писать в MinGW

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

Не по теме:

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

0
OverDozero
99 / 99 / 6
Регистрация: 07.04.2011
Сообщений: 523
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-я пишу так,как удобно мне.Если вам есть что-то дополнить по данной теме-пишите.Если нет-прошу набивать рейтинг сообщений в другом месте
0
uglyPinokkio
326 / 229 / 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_;
};
1
Vtulhu
371 / 377 / 96
Регистрация: 12.08.2011
Сообщений: 1,610
06.07.2014, 14:52 #8
Уважаемый Vtulhu-я пишу так,как удобно мне.
И это Ваша главная проблема.

Если вам есть что-то дополнить по данной теме-пишите.
Есть, есть. Только я не скажу, потому что я не люблю людей с синдромом Даннинга-Крюгера. Когда захотите учиться - обращайтесь. С удовольствием помогу. Именно учиться. Потому что научить кого-то - невозможно. Можно только помочь научиться. Но для этого надо, как минимум, чтобы человек осознал свою неученость. Между прочим, "Недоросль" Фонвизина списан с реального человека. И тот, когда увидел пьесу, понял это (хоть на это ума хватило!), и так это его проняло, что он начал учиться как проклятый. В результате он стал ученым. В истории науки он следа особого не оставил, но по меркам своего времени был довольно образованным человеком.
0
OverDozero
99 / 99 / 6
Регистрация: 07.04.2011
Сообщений: 523
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-я пишу так,как удобно мне.
И это Ваша главная проблема.
На данном этапе(этапе изучения),моя приоритетная задача разобраться с синтаксисом языка,написанием кода и тд.Объявление "красивых" переменных, пока в мои планы не входит.Сейчас важен сам принцип.А остальное придет с опытом.
0
uglyPinokkio
326 / 229 / 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;//Указатель на список предметов
  };
1
OverDozero
99 / 99 / 6
Регистрация: 07.04.2011
Сообщений: 523
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;}
0
uglyPinokkio
326 / 229 / 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);
}
Забыл память почистить, сорри.
1
OverDozero
99 / 99 / 6
Регистрация: 07.04.2011
Сообщений: 523
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
0
Миниатюры
Как правильно объявить структуру  
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
06.07.2014, 19:03 #14
Цитата Сообщение от OverDozero Посмотреть сообщение
Как с этим можно бороться?
Ну к примеру заменить \n нулем .
1
OverDozero
99 / 99 / 6
Регистрация: 07.04.2011
Сообщений: 523
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 минут
Фигня какая-то выходит.Не получается записать данные из файла в структуру,в том же порядке,в каком они были записаны в файл.
0
07.07.2014, 13:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.07.2014, 13:05
Привет! Вот еще темы с ответами:

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

Как правильно объявить массив байтов? - C++
Как правильно объявить массив байтов? Надо ли вручную выставлять ему размер после &quot;GetBitmapBits&quot;? Я делал так: extern...

Как правильно объявить vector в классе? - C++
как правильно объявить вектор? #include &lt;vector&gt; #include &lt;algorithm&gt; using namespace std; extern int map; ...

Как правильно объявить два счётчика в цикле for? - C++
Добрый день. Подскажите, пожалуйста. У меня почему-то не работает следующая конструкци цикла: for(int i=0 , int j=0 ; i&lt;10 ,...


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

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

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