Структуры(подскажите, что не правильно).

UmnikAlex

Сведения об экзамене содержат следующие данные: дисциплину (программирование, вычислительная техника, информатика), дату сдачи экзамена (год, месяц, день), сведения о студенте (факультет, курс, группа, номер в журнале) и экзаменационную оценку. Задан набор сведений об экзаменах, сданных студентами за последние несколько лет; в них факультет и предмет кодируются первыми буквами названия. Определить, на каком факультете самый высокий показатель качества успеваемости по информатике (то есть самый высокий процент отличников и хорошистов) среди студентов первого курса, сдававших экзамены зимой 1995 года или летом 1996 года.
#include "stdafx.h"
#include "conio.h"
#include "iostream"
 
using namespace std;
 
void main() {
    int i,j,k,q,w,e;
    float p,z,x;
    struct str {
        char fam[25], fak;
        int k,g,n;
        struct ex{
            int y[2];
            char d;
            int o;
        };
        struct ex inf[2];
    };
    struct str spisok[6];
 
    for(i=0;i<6;++i) {
        cout<<"Vvedite familiu: ";
        cin>>spisok[i].fam;
        cout<<"Vvedite fakultet: ";
        cin>>spisok[i].fak;
        cout<<"Vvedite gruppu: ";
        cin>>spisok[i].g;
        cout<<"Vvedite kurs: ";
        cin>>spisok[i].k;
        cout<<"Vvedite nomer v zhurnale: ";
        cin>>spisok[i].n;
        for(j=0;j<3;++j) {
            cout<<"Vvedite den sdachi "<<j+1<<"-go ekzamena";
            cin>>spisok[i].inf[j].y[0];
            cout<<"Vvedite mecyac: ";
            cin>>spisok[i].inf[j].y[1];
            cout<<"Vvedite god: ";
            cin>>spisok[i].inf[j].y[2];
            cout<<"Vvedite disciplinu(pervuu bukvu): ";
            cin>>spisok[i].inf[j].d;
            cout<<"Vvedite ocenku: ";
            cin>>spisok[i].inf[j].o;
        }
    }
    for(i=0;i<6;++i) {
        for(j=0;j<6;++j) {
            if(spisok[i].fak=='e' && spisok[i].k==1 && (((spisok[i].inf[j].y[1]==12 || spisok[i].inf[j].y[1]==11) && spisok[i].inf[j].y[2]==1995)||((spisok[i].inf[j].y[1]==5 || spisok[i].inf[j].y[1]==6) && spisok[i].inf[j].y[2]==1996))) && spisok[i].inf[j].d=='i'&&(spisok[i].inf[j].o==4 || spisok[i].inf[j].o==5))
                    q+=1;
            else { 
                if(spisok[i].fak=='y' && spisok[i].k==1 && (((spisok[i].inf[j].y[1]==12 || spisok[i].inf[j].y[1]==11) && spisok[i].inf[j].y[2]==1995)||((spisok[i].inf[j].y[1]==5 || spisok[i].inf[j].y[1]==6) && spisok[i].inf[j].y[2]==1996))) && spisok[i].inf[j].d=='i'&&(spisok[i].inf[j].o==4 || spisok[i].inf[j].o==5))
                    w+=1;
                else e+=1;
            }
        }
    }
    p=q/(q+w+e);
    z=w/(q+w+e);
    x=e/(q+w+e);
    if(p<z && x<z)
        cout<<“Samyi vysoky pokazatel’ na IURe”;
else {
    if(x<p && z<p)
        cout<<“Samyi vysoky pokazatel’ na ETFe”;
    else {
        if(z<x && p<x) 
            cout<<“Samyi vysoky pokazatel’ na MSFe”; 
        else 
            cout<<“Pokazateli ravny”;
    }
}
 
    getch();
}
Вводится нормально. В конце выдает какую-то ошибку.
6 ответов

UmnikAlex

if(spisok[i].fak=='e' && spisok[i].k==1 && (((spisok[i].inf[j].y[1]==12 || spisok[i].inf[j].y[1]==11) && spisok[i].inf[j].y[2]==1995)||((spisok[i].inf[j].y[1]==5 || spisok[i].inf[j].y[1]==6) && spisok[i].inf[j].y[2]==1996))) && spisok[i].inf[j].d=='i'&&(spisok[i].inf[j].o==4 || spisok[i].inf[j].o==5))
Вводится нормально. В конце выдает какую-то ошибку.
какую именно ошибку?


UmnikAlex

Да, начинает вводиться нормально. Когда ввожу последнюю spisok[i].inf[j].d вылетает, показывая какую-то ошибку. Да, и еще, я работаю в VS 2005. Это не влияет на ошибку?


UmnikAlex

какую именно ошибку?
.....


UmnikAlex

Я щас не могу сказать, т.к. работаю тока в универе. Но,
Когда ввожу последнюю spisok[i].inf[j].d вылетает, показывая какую-то ошибку.
ошибка открывает новую вкладку, в которой написано непонятно что И ОКОШКО в котором описывается ошибка(там еще кнопка Прервать есть).


UmnikAlex

Ну, как минимум, должно вываливаться в цикле проверки. там
for(i=0;i<6;++i) { for(j=0;j<6;++j) {
, а переменная j используется для обращения к вложенной структуре inf, размерность у которой 2 !!! как только j превышает 2 выскакивает ошибка доступа к памяти.


UmnikAlex

#include "conio.h"
#include "iostream"
 
using namespace std;
 
void main() {
    int i,j,k,q,w,e;
    float p,z,x;
    struct str {
        char fam[25], fak;
        int k,g,n;
        struct ex{
            int y[2];
            char d;
            int o;
        };
        struct ex inf[2];
    };
    struct str spisok[2];
 
    for(i=0;i<3;++i) {
        cout<<"Vvedite familiu: ";
        cin>>spisok[i].fam;
        cout<<"Vvedite fakultet: ";
        cin>>spisok[i].fak;
        cout<<"Vvedite gruppu: ";
        cin>>spisok[i].g;
        cout<<"Vvedite kurs: ";
        cin>>spisok[i].k;
        cout<<"Vvedite nomer v zhurnale: ";
        cin>>spisok[i].n;
        for(j=0;j<3;++j) {
            cout<<"Vvedite den sdachi "<<j+1<<"-go ekzamena";
            cin>>spisok[i].inf[j].y[0];
            cout<<"Vvedite mecyac: ";
            cin>>spisok[i].inf[j].y[1];
            cout<<"Vvedite god: ";
            cin>>spisok[i].inf[j].y[2];
            cout<<"Vvedite disciplinu(pervuu bukvu): ";
            cin>>spisok[i].inf[j].d;
            cout<<"Vvedite ocenku: ";
            cin>>spisok[i].inf[j].o;
        }
    }
    for(i=0;i<3;++i) {
        for(j=0;j<3;++j) {
            if(spisok[i].fak=='e' && spisok[i].k==1 && (((spisok[i].inf[j].y[1]==12 || spisok[i].inf[j].y[1]==11) && spisok[i].inf[j].y[2]==1995)||((spisok[i].inf[j].y[1]==5 || spisok[i].inf[j].y[1]==6) && spisok[i].inf[j].y[2]==1996))) && spisok[i].inf[j].d=='i'&&(spisok[i].inf[j].o==4 || spisok[i].inf[j].o==5))
                    q+=1;
            else { 
                if(spisok[i].fak=='y' && spisok[i].k==1 && (((spisok[i].inf[j].y[1]==12 || spisok[i].inf[j].y[1]==11) && spisok[i].inf[j].y[2]==1995)||((spisok[i].inf[j].y[1]==5 || spisok[i].inf[j].y[1]==6) && spisok[i].inf[j].y[2]==1996))) && spisok[i].inf[j].d=='i'&&(spisok[i].inf[j].o==4 || spisok[i].inf[j].o==5))
                    w+=1;
                else e+=1;
            }
        }
    }
    p=q/(q+w+e);
    z=w/(q+w+e);
    x=e/(q+w+e);
    if(p<z && x<z)
        cout<<“Samyi vysoky pokazatel’ na IURe”;
else {
    if(x<p && z<p)
        cout<<“Samyi vysoky pokazatel’ na ETFe”;
    else {
        if(z<x && p<x) 
            cout<<“Samyi vysoky pokazatel’ na MSFe”; 
        else 
            cout<<“Pokazateli ravny”;
    }
}
 
    getch();
}
Не мог бы кто-нибудь проверить???