Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.09.2009, 17:06   #1
phpcreator
Пользователь
 
Регистрация: 09.09.2009
Сообщений: 18
По умолчанию Структуры и указатели

Код:
#include <cstdlib>
#include <iostream>
#include <conio.h>
#include <cstring>
#define n 5
using namespace std;

struct result{
       int math;
       int inf;
       int fizika;
       int ukr;
       int hist;
       };
struct stud{
       char FIO[50];
       struct result res;
       }student[n];
  
int fin(void);
void vvod_dannih(void);       
void reiting(int *count, struct stud *k);       
       //Функция проверки вводимых данных
       void proverka(int *pred)
       {
         do{
         if((*pred>100)||(*pred<0)) 
                                   {
                                        cout<<"Otsenka vvedena NEKOREKTNO!!!! Vvedite dannie povtorno"<<endl;
                                        cin>>*pred;
                                   }
         else break;
         } while(1); 
       }

        
        //Функция ввода данных о студентах
       void vvod_dannih(void)
       {
       struct stud student[n],*r;
       int i, *p,count=0,*s;
       
        for(i=0;i<n;i++)
          {
          cout<<"Vvedite FIO "<<i+1<<" studenta:"<<endl;
          gets(student[i].FIO);
          
          cout<<"Vvedite otsenku po MATEMATIKE:"<<endl;
          cin>>student[i].res.math;
          p=&student[i].res.math;
          proverka(p);
          
          cout<<"Vvedite otsenku po INFORMATIKE:"<<endl;
          cin>>student[i].res.inf;
          p=&student[i].res.inf;
          proverka(p);
          
          cout<<"Vvedite otsenku po FIZIKE:"<<endl;
          cin>>student[i].res.fizika;
          p=&student[i].res.fizika;
          proverka(p);
          
          cout<<"Vvedite otsenku po UKRAINSKOMU:"<<endl;
          cin>>student[i].res.ukr;
          p=&student[i].res.ukr;
          proverka(p);
          
          cout<<"Vvedite otsenku po ISTORII:"<<endl;
          cin>>student[i].res.hist;
          p=&student[i].res.hist;
          proverka(p);
          count++;
          if(fin()) { system("cls"); continue;} else {system("cls"); break;};
          }
       s=&count;  
       r=student; 
       reiting(s,r);
       }
       
       //Функция окончания ввода данных
       int fin(void)
       {
       char c;
           cout<<"Hotite prodoljiti vvod dannih? (Y/N)"<<endl;
           c=getch();
           if (toupper(c)=='Y') return 1;
           else if (toupper(c)=='N') return 0;
       }
      
       //Функция Рейтинг предмета
       void reiting(int *count, struct stud *k)
       {char c; int i;
       
         cout<<"Najmite tsifru predmeta, kotorii vas interesuet"<<endl;
         cout<<"1. Matematika \n2.Informatika\n3.Fizika\n4.Ukrainskii\n5.Istoria\n";
         c=getch();
         switch (c)
         {
           case '1': for (i=0;i<*count;i++) if ((*k).res.math>=60) {cout<<(*k).FIO<<" "; } break;
           case '2': for (i=0;i<*count;i++) if ((*k).res.inf>=60) {cout<<(*k).FIO<<" ";} break;
           case '3': for (i=0;i<*count;i++) if ((*k).res.fizika>=60) {cout<<(*k).FIO<<" ";} break;
           case '4': for (i=0;i<*count;i++) if ((*k).res.ukr>=60) {cout<<(*k).FIO<<" ";} break;
           case '5': for (i=0;i<*count;i++) if ((*k).res.hist>=60) {cout<<(*k).FIO<<" ";} break;
           default : cout<<"K sojeleniu predmata pod takim nomerom netu!!"<<endl;
         }  
       }
       
     
 
int main()
{

    vvod_dannih();

    getch();
}
Помогите доработать прогу.
1 неувязочка заключается в том что если я хочу продолжить ввод данных в структуру, пропускается заполнение поля FIO
2 неувязочка заключается в том что я не знаю как правильно сделать указатель на структуру, чтоб вывести имена студентов у которых по заданому предмету есть достаточно баллов

P.S. код немного запутанный получился ну думаю вы справитесь)

Последний раз редактировалось phpcreator; 09.09.2009 в 18:28. Причина: потому что было не читабильно)
phpcreator вне форума Ответить с цитированием
Старый 09.09.2009, 17:57   #2
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 822
По умолчанию

Мда,проще надо быть)... Попробуй такой вариант,тебе не нужно передавать указатель на структуру,потому что у тебя массив глобальный,тогда всё проще:
Код:
#include <cstdlib>
#include <iostream>
#include <conio.h>
#include <cstring>
//#define n 5
using namespace std;
int n=5;
struct result{
int math;
int inf;
int fizika;
int ukr;
int hist;
};
struct stud{
char FIO[50];
struct result res;
};
struct stud student[5];

int fin(void);
void vvod_dannih(void);
void reiting(int *count);
//Функция проверки вводимых данных
void proverka(int *pred)
{
do{
if((*pred>100)||(*pred<0))
{
cout<<"Otsenka vvedena NEKOREKTNO!!!! Vvedite dannie povtorno"<<endl;
cin>>*pred;
}
else break;
} while(1);
}


//Функция ввода данных о студентах
void vvod_dannih(void)
{

int i,*p,count=0,*s;

for(i=0;i<n;i++)
{
cout<<"Vvedite FIO "<<i+1<<" studenta:"<<endl;
gets(student[i].FIO);

cout<<"Vvedite otsenku po MATEMATIKE:"<<endl;
cin>>student[i].res.math;
p=&student[i].res.math;
proverka(p);

cout<<"Vvedite otsenku po INFORMATIKE:"<<endl;
cin>>student[i].res.inf;
p=&student[i].res.inf;
proverka(p);

cout<<"Vvedite otsenku po FIZIKE:"<<endl;
cin>>student[i].res.fizika;
p=&student[i].res.fizika;
proverka(p);

cout<<"Vvedite otsenku po UKRAINSKOMU:"<<endl;
cin>>student[i].res.ukr;
p=&student[i].res.ukr;
proverka(p);

cout<<"Vvedite otsenku po ISTORII:"<<endl;
cin>>student[i].res.hist;
p=&student[i].res.hist;
proverka(p);
count++;
if(fin()) { system("cls"); continue;} else {system("cls"); break;};
}
s=&count;
reiting(s);
}

//Функция окончания ввода данных
int fin(void)
{
char c;
cout<<"Hotite prodoljiti vvod dannih? (Y/N)"<<endl;
c=getch();
if (toupper(c)=='Y') return 1;
else if (toupper(c)=='N') return 0;
}

//Функция Рейтинг предмета
void reiting(int *count)
{char c; int i;

cout<<"Najmite tsifru predmeta, kotorii vas interesuet"<<endl;
cout<<"1. Matematika \n2.Informatika\n3.Fizika\n4.Ukrain skii\n5.Istoria\n";
c=getch();
switch (c)
{
case '1': for (i=0;i<*count;i++) if (student[i].res.math>=60) {cout<<student[i].FIO<<" "; } break;
case '2': for (i=0;i<*count;i++) if (student[i].res.inf>=60) {cout<<student[i].FIO<<" ";} break;
case '3': for (i=0;i<*count;i++) if (student[i].res.fizika>=60) {cout<<student[i].FIO<<" ";} break;
case '4': for (i=0;i<*count;i++) if (student[i].res.ukr>=60) {cout<<student[i].FIO<<" ";} break;
case '5': for (i=0;i<*count;i++) if (student[i].res.hist>=60) {cout<<student[i].FIO<<" ";} break;
default : cout<<"K sojeleniu predmata pod takim nomerom netu!!"<<endl;
} 
}



int main()
{

vvod_dannih();

getch();
}
Извини,не тестил...
Не давай организму поблажки, каждый день тренируй его в шашки..

Последний раз редактировалось Скарам; 09.09.2009 в 17:57. Причина: очепятка
Скарам вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Указатели olli Общие вопросы C/C++ 3 20.05.2009 19:40
[C] массивы, указатели, двойные указатели. Iggel Общие вопросы C/C++ 5 05.05.2009 12:39
Указатели JOFRIF Общие вопросы C/C++ 2 31.08.2008 18:34
Указатели Принц Общие вопросы C/C++ 2 08.06.2008 16:15
Указатели Си JET_FLASH Общие вопросы C/C++ 2 31.01.2008 23:02