Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Массив структур 
:(
    Опции темы
Reniel
Дата 10.11.2010, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 26.6.2010

Репутация: нет
Всего: нет



По С++ нужно сделать лабораторную работу, только начинаю программировать, сделал 10 лаб из 12, на этой встал, и не могу дальше продвинуться. Помогите дельным советом или кусочком кода с разъяснением smile

Вот собственно само задание: На основе  сводной экзаменационной ведомости, включающей фамилии студентов и дисциплины (математика, физика, программирование, история) вывести на печать  название предмета, по которому получено наименьшее количество "2", и фамилии студентов, получивших по этому предмету "2". 

Не могу понять как сделать выборку по предмету, и вывести по этому предмету двоечников.

Вот мои попытки 2 попытки, но не доделанные до конца:

Код

#include <iostream.h>
#include <conio.h>
#include <stdio.h>

int main()
{
   struct vedomost
   {
      char fio[80];   // familii
      int mass[5];    //massiv resultatov dvoek

      struct math
      {
         int n;            //ochenka
         int two[5];    //spisok dvoeshnikov
         int count;        //schetchik dvoek
      }math;

      struct fizika
      {
         int n;
         int two[5];
         int count;
      }fiz;

      struct history
      {
         int n;
         int two[5];
         int count;
      }his;

      struct programming
      {
         int n;
         int two[5];
         int count;
      }prog;
   }result;


   vedomost ved[5]={
   {"bahar",              {2}, {3}, {4}, {5}},
   {"kazlov",             {2}, {4}, {5}, {3}},
   {"knazev",            {3}, {5}, {4}, {2}},
   {"bochkarev",       {4}, {5}, {2}, {2}},
   {"kirikov",             {2}, {2}, {5}, {5}}
   };

   for(int i=0; i<5; i++)
   {
      if(ved[i].math.n==2)
      {
         ++result.math.count;
         if(i==4) result.mass[0] = result.math.count;

         if(i==0)
         result.math.two[i] = i+10;
         else
         result.math.two[i] = i;
      }

      if(ved[i].fiz.n==2)
      {
         ++result.fiz.count;
         if(i==4) result.mass[1] = result.fiz.count;

         if(i==0)
         result.fiz.two[i] = i+10;
         else
         result.fiz.two[i] = i;
      }

      if(ved[i].his.n==2)
      {
         ++result.his.count;
         if(i==4) result.mass[2] = result.his.count;

         if(i==0)
         result.his.two[i] = i+10;
         else
         result.his.two[i] = i;
      }

      if(ved[i].prog.n==2)
      {
         ++result.prog.count;
         if(i==4) result.mass[3] = result.prog.count;

         if(i==0)
         result.prog.two[i] = i+10;
         else
         result.prog.two[i] = i;
      }
   }

   /*
   for(int i=0; i<5; i++)
   {
    cout << result.mass[i] << endl;
    cout << result.math.two[i] << endl;
   }
   */
    getch();
}


а вот более простой не доделанный вариант

Код

#include <iostream.h>
#include <conio.h>
#include <stdio.h>

int main()
{
   struct vedomost
   {
        char fio[80];
        int math,
             fiz,
             hist,
             prog;

   };

   vedomost result={0,0,0,0};

   vedomost ved[5]={
   {"andrey bahar",            2, 3, 4, 5},
   {"dima kazlov",              2, 4, 5, 3},
   {"evgeni knazev",          3, 5, 4, 2},
   {"serega bochkarev",    4, 5, 2, 2},
   {"roma kirikov",              2, 2, 5, 5}
   };

   //podschet dvoek
   int max=0;
   for(int i=0; i<5; i++)
   {
      if(ved[i].math==2)++result.math;

      if(ved[i].fiz==2)++result.fiz;

      if(ved[i].hist==2)++result.hist;

      if(ved[i].prog==2)++result.prog;

   }

   //nahogdenie predmeta po kotoromy 2-k bolshe

    getch();
}


Это сообщение отредактировал(а) Reniel - 10.11.2010, 08:39
PM MAIL   Вверх
xvr
Дата 10.11.2010, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



  •  Не надо смешивать исходные данные, промежуточные вычисления и результаты в одной структуре
  •  Не надо дублировать описание предметов в виде 5 одинаковых (но по разному названных) структур - сделайте массив из 5 структур
  •  Сделайте обработку данных в 2 этапа - сначала посчитайте количество двоек, выберите предмет с минимумом, а потом формируйте список студентов с двойкой по этому предмету
  •  Ваш первый вариант считает что то не то (что именно он считает понять не получилось, но явно не то  smile )


PM MAIL   Вверх
Reniel
Дата 11.11.2010, 06:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 26.6.2010

Репутация: нет
Всего: нет



Написал следующую программу, все компилится, но при работе сразу вылетает в ошибку - " Thread stopped C:\BC5\BIN\10.2.exe: Fault: access violation at 0x312fd: write of address 0x10c00001 "

как я понял он не может в какой то участок памяти произвести запись, помогите не могу понять причину ошибки.

вот код программы:

Код

#include <iostream.h>
#include <conio.h>

const int size=5;

struct predmeti {
    int num[4];
}result;

struct familia {
    char fam[80];
};

////////////////////////////////////////
int main()
{
//inicilizacia structur
familia fio[size]={
{"bahar"},
{"petrov"},
{"smolin"},
{"adenko"},
{"sidorov"}
};

predmeti pred[size]={
{{2, 3, 4, 5}},
{{2, 5, 2, 3}},
{{2, 2, 3, 2}},
{{5, 4, 5, 1}},
{{3, 2, 5, 5}}
};

//podschet dvoek po kagdomy predmety
for(int i=0; i<size; i++)
{
    for(int j=0; i<4; j++)
   {
    if(pred[i].num[j]==2)
      ++result.num[j];
   }
}


//opredelenie predmeta po kotoromy bolshe vsego 2-k
int max[2]; // 0 - index predmeta, 1 - max chislo dvoek
for(int i=0; i<4; i++)
{
    if(result.num[i] > result.num[i+1])
   {
    max[0]=i;
      max[1]=result.num[i];
   }
}

//vivod predmeta po kotoromy bolshe vsego dvoek
cout << "naibolshee kolichestvo dvoek po predmety - ";

switch(max[0]){
    case 0: cout << "mathematika";
           break;
    case 1: cout << "fizika";
           break;
   case 2: cout << "programming";
           break;
   case 3: cout << "history";
           break;
}

cout << " kolichestvo dvoek: " << max[1] << endl;


//vivod studentov poluchivshih dvoiki

cout << "stydenti polychivshie dvoiki po etomy predmety :" << endl;

for(int i=0; i<size; i++)
{
    if(pred[i].num[max[0]]==2)
    cout << fio[i].fam << endl;
}



   getch();
}

PM MAIL   Вверх
Crafty
Дата 11.11.2010, 06:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 3.11.2008

Репутация: 12
Всего: 14



Reniel, в 37 строке  i на j поменяйте  
Код

for(int j=0; j<4; j++)

PM MAIL   Вверх
Reniel
Дата 11.11.2010, 07:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 26.6.2010

Репутация: нет
Всего: нет



Спасибо xvr и Crafty за советы, и что ткнули носом в ошибки.

Вот код программы еще немного доработанный и полностью работающий.

Код

#include <conio.h>
#include <stdio.h>

const int size=5;

struct predmeti {
    int num[4];
}result;

struct familia {
    char fam[80];
};

void main()
{
//inicilizacia structur
familia fio[size]={
{"bahar"},
{"petrov"},
{"smolin"},
{"adenko"},
{"sidorov"}
};

predmeti pred[size]={
{{2, 3, 4, 2}},
{{2, 5, 2, 2}},
{{2, 2, 3, 2}},
{{5, 4, 5, 2}},
{{3, 2, 5, 5}}
};

//podschet dvoek po kagdomy predmety
for(int i=0; i<size; i++)
{
    for(int j=0; j<4; j++)
   {
    if(pred[i].num[j]==2)
        ++result.num[j];
   }
}

//opredelenie predmeta po kotoromy bolshe vsego 2-k
int max[2]; // 0 - index predmeta, 1 - max chislo dvoek
for(int i=0; i<4; i++)
{
    if(result.num[i] > result.num[i+1] && result.num[i]>max[1] && i!=3)
   {
      max[0]=i;
      max[1]=result.num[i];
   }
   if(result.num[i] > max[1] && i==3)
   {
        max[0]=i;
    max[1]=result.num[i];
   }
}

//vivod predmeta po kotoromy bolshe vsego dvoek
printf("naibolshee kolichestvo dvoek po predmety - ");

switch(max[0]){
   case 0: printf("mathematika");
           break;
   case 1: printf("fizika");
           break;
   case 2: printf("programming");
           break;
   case 3: printf("history");
           break;
}

printf(", kolichestvo dvoek: %i", max[1]);

//vivod studentov poluchivshih dvoiki

printf("\nstydenti polychivshie dvoiki po etomy predmety : \n");

for(int i=0; i<size; i++)
{
       if(pred[i].num[max[0]]==2)
          printf("%s \n", fio[i].fam);
}



   getch();
}


Это сообщение отредактировал(а) Reniel - 11.11.2010, 10:59
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

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


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0488 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.