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

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

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

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

05.07.2014, 16:35. Просмотров 1412. Ответов 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
uglyPinokkio
326 / 229 / 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));
И дальше в цикле читаешь поля в том же порядке, что и писал.
Что именно не работает-то?
0
OverDozero
99 / 99 / 6
Регистрация: 07.04.2011
Сообщений: 523
07.07.2014, 17:42  [ТС] #17
Не выходит написать чтение файла именно в том же порядке,как и записывалась структура.
Чтение ладно..хотя тут проблемы есть..например с фамилией студента.Надо читать через fgets.Через fscanf опять же читает до первого пробела.
Возьму для примера структуру файла:
2-всего количество студентов=количеству структур студент
Ivanov I.I. студент 1
1-количество предметов у студента 1
Matematika-название первого предмета у студента 1
100-максимальный балл по предмету математика
20
20
20
10
Каким образом организовать чтение в цикле и запись в структуру,чтоб записать именно так:100 баллов,относится к предмету математика,который относится к студенту Иванову.
Мне надо считать сначала строку с количеством предметов у студента Иванова,чтоб этому студенту организовать цикл по этому количеству предметов.И в этом цикле уже организовывать чтение макс.балла и баллов по предмету.Как обратиться при чтении файла к определенной строке,которая содержит количество предметов у данного студента..Вот в этом у меня проблема...
единственная идея это использовать префиксы перед записью новой строки.
Допустим префикс # ФИО студента,будет производиться запись в структуру студент.
Префикс * предмет,запись уже будет производиться в структуру предмет и тд
Допустим Фамилия Петров.Надо определить что эт офамилия уже другого студента,а не предмет Иванова
Но это уже (ВЦ)код.Может есть способ проще?
0
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
07.07.2014, 17:50 #18
Цитата Сообщение от OverDozero Посмотреть сообщение
Каким образом организовать чтение в цикле и запись в структуру,чтоб записать именно так:100 баллов,относится к предмету математика,который относится к студенту Иванову.
В том варианте записи, что я видел, сначала пишется количество студентов, потом по каждому студенту ФИО, потом количество предметов и в цикле данные по каждому предмету.
Читать точно так же, только наоборот, - количество студентов, и дальше циклом данные каждого студента.
По каждому студенту ФИО, количество предметов и циклом данные по каждому предмету. Не нужно ничего никуда дописывать, только лишний головняк.
1
OverDozero
99 / 99 / 6
Регистрация: 07.04.2011
Сообщений: 523
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?Мусор
Просьба тыкнуть носом в ошибки в коде В чем ошибся?
0
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
07.07.2014, 20:42 #20
Цитата Сообщение от OverDozero Посмотреть сообщение
Просьба тыкнуть носом в ошибки в коде
Файл приложи, я его писать сам не буду - 146%
0
OverDozero
99 / 99 / 6
Регистрация: 07.04.2011
Сообщений: 523
07.07.2014, 21:00  [ТС] #21
В папке чтение и вычисления мой ВЦкод
Там же тиихстишник struct.Это и есть записанный файл,который надо считать в структуры
0
Вложения
Тип файла: rar Arch 4.rar (226.2 Кб, 2 просмотров)
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
08.07.2014, 06:48 #22
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Не очень понял, что именно не получалось.
Все точно так же как и при вводе с экрана.

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
#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <stdlib.h>
#include <iostream>
 
/*Составить программу формирования данных об успеваемости студентов по дисциплине:
фамилия И.О., 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\n",kolvostud);
 students study[kolvostud]; 
 while ( fgetc(in) != '\n' );
 
 for (int i=0;i<kolvostud;i++){//1 on I
      fgets(study[i].FIO,255,in);//читаем строку с ФИО
      //strcpy(study[i].FIO,arr);//в структуру пишем ФИО
      printf("%s\n",study[i].FIO);
      fscanf(in,"%d",&study[i].kolpred);//читаем количество предметов у студента
      while ( fgetc(in) != '\n' );
      printf("%d\n",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(study[i].pred[j].predm,255,in);
         printf("%s",study[i].pred[j].predm);
         fscanf(in,"%d",&study[i].pred[j].maxball);
         while ( fgetc(in) != '\n' );
         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]);
            while ( fgetc(in) != '\n' );
            printf("%d;",study[i].pred[j].ozp[k]);
            }//3 off K
         printf("\n");      
      }//2 off J
      printf("\n");      
 }//1 off I
 for (int i=0;i<kolvostud;i++)
   free(study[i].pred);
 getch();
 return 0;
}
1
08.07.2014, 06:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.07.2014, 06:48
Привет! Вот еще темы с ответами:

Как правильно объявить массив строк 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 ,...


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

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

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