Форум программистов, компьютерный форум CyberForum.ru

Массив структур - C++

Восстановить пароль Регистрация
 
nondeadlollipop
1 / 1 / 0
Регистрация: 21.11.2010
Сообщений: 20
11.12.2010, 06:40     Массив структур #1
Задача:создать массив структур а,содержащий фамилию и 3 оценки.Найти студентов,чей средний балл выше среднего группы и упорядочить по алфавиту.
Получить массив и вывести на экран.

вышел такой код:
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
#include <iostream>
#include <string.h>
#include <iomanip>
#include <conio.h>
using namespace std;
 
const int Nmax=100;
    float srg;
struct stud
{
    char fio[20];
    int oc[3];
    float sr;
}a[Nmax],b[Nmax];
 
void vvod(int &n,stud am[])
{
    int i;
    cout<<"Razmer massiva";
    cin>>n;
    for(i=0;i<n;i++)
        {
            cout<<"Student # "<<i<<endl;
            cout<<"Familiya"<<endl;
            scanf("%s",a[i].fio);
            cout<<"3 ocenki"<<endl;
            scanf("%d %d %d",&a[i].oc[0],&a[i].oc[1],&a[i].oc[2]);
            a[i].sr=(a[i].oc[0]+a[i].oc[1]+a[i].oc[2])/3;
            srg+=a[i].sr;
        }
}
 
void vubor(int n,stud am[],int nb,stud bm[])
{
    int i,j;
    int nb=-1;
    srg/=n;
    for(i=0;i<n;i++)
        if(a[i].sr>srg) nb++,b[nb]=a[i];
}
 
void sort(int nb,stud bm[])
{
    int nb=-1;
    stud s;
    for(int i=0;i<nb-1;i++)
        for(int j=0;j<i;j++)
            if(strcmp(b[j].fio,b[j+1].fio)>0) s=b[j],b[j]=b[j+1],b[j+1]=s;
 
}
 
void vuvod(int n,stud am[])
{
    cout<<"|"<<setw(12)<<"Familiya"<<"|"<<setw(9)<<"Ocenki"<<"|"<<setw(8)<<"Srednee"<<"|"<<"\n";
    cout<<"|"<<setw(31)<<"-------------------------------"<<"|"<<"\n";
    for(int i=0;i<n;i++)
        cout<<"|"<<setw(12)<<a[i].fio<<"|  "<<a[i].oc[0]<<"  "<<a[i].oc[1]<<"  "<<a[i].oc[2]<<"|"<<setw(8)<<a[i].sr<<"|"<<endl;
}
 
void main()
{
    int n,nb;
    vvod(n,a);
    cout<<"Vvedennui massiv"<<endl;
    vuvod(n,a);
    vubor(n,a,nb,b);
    sort(nb,b);
    cout<<"Polucennui massiv"<<endl;
    vuvod(nb,b);
    getch();
}
при компиляции выдает ошибку вида: nb не инициализированная переменная.
Run-Time Check Failure #3 - The variable 'nb' is being used without being initialized.
и начинает выдавать ее в строке vubor(n,a,nb,b); функции main
что не так в коде?вроде когда nb убираешь он не хочет сортировать,выдает тот же массив.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.12.2010, 06:40     Массив структур
Посмотрите здесь:

Массив структур C++
Массив структур C++
C++ Массив структур
Массив структур C++
Ввести массив структур; рассортировать массив в алфавитном порядке C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dihlofos
Бродяга
 Аватар для dihlofos
302 / 256 / 17
Регистрация: 27.08.2010
Сообщений: 553
11.12.2010, 07:36     Массив структур #2
Вы передаёте в ф-цию неинициализированную переменную nb. Смысл? Отсюда и: The variable 'nb' is being used without being initialized.
C++
1
2
3
4
int n,nb;
...... 
vubor(n,a,nb,b); // чему равна nb?
sort(nb,b);
К тому же создаёте одноимённую переменную внутри функции:
C++
1
2
3
4
5
6
void vubor(int n,stud am[],int nb /*раз*/ ,stud bm[])
{
        ...
        int nb=-1; /*два*/
        ...
}
Отсюда ошибка: redefinition of formal parameter 'nb'

Вы уж определитесь, должна nb быть параметром функции, или её локальной переменной.
nondeadlollipop
1 / 1 / 0
Регистрация: 21.11.2010
Сообщений: 20
11.12.2010, 07:48  [ТС]     Массив структур #3
nb нужно взять из функции vubor после того как создался новый массив b.
C++
1
2
3
4
5
6
7
void vubor(int n,stud am[],int &nb,stud bm[])
{
    int i,j;
    srg/=n;
    for(nb=-1,i=0;i<n;i++)
        if(a[i].sr>srg) nb++,b[nb]=a[i];
}
а если поставить амперсанд,то получается что он берет первоначальное значение,т.е. -1,и потом не сортирует ничего,т.к. i не может быть меньше -2.

как тогда взять значение nb?
dihlofos
Бродяга
 Аватар для dihlofos
302 / 256 / 17
Регистрация: 27.08.2010
Сообщений: 553
11.12.2010, 09:26     Массив структур #4
Цитата Сообщение от nondeadlollipop Посмотреть сообщение
как тогда взять значение nb?
Ну можно, например, вернуть его значение из ф-ции vubor. Вобщем попробовал исправить ваш код, хотя проще было заново переписать:
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 <iostream>
#include <cstring>
#include <iomanip>
#include <conio.h>
using namespace std;
 
const int Nmax=100;
float srg;
 
struct stud
{
        char fio[20];
        int oc[3];
        float sr;
}a[Nmax],b[Nmax];
 
void vvod(int &n,stud am[])
{
        int i;
        cout<<"Razmer massiva";
        cin>>n;
        for(i=0;i<n;i++)
        {
                cout<<"Student # "<<i<<endl;
                cout<<"Familiya"<<endl;
                scanf("%s",a[i].fio);
                cout<<"3 ocenki"<<endl;
                scanf("%d %d %d",&a[i].oc[0],&a[i].oc[1],&a[i].oc[2]);
                a[i].sr=(a[i].oc[0]+a[i].oc[1]+a[i].oc[2])/3;
                srg+=a[i].sr;
        }
}
 
int vubor(int n,stud am[],stud bm[])
{
        int i, j;
        int nb = 0;
        srg /= n;
        
        for(i=0;i<n;i++)
    {
                if(a[i].sr > srg) 
        {
            b[nb] = a[i];
            nb++;
        } /* {} - скобки! и ; вместо запятой! */
    }
    return nb; /* возвращаем количество найденных элементов */
}
 
void sort(int nb, stud bm[])
{
        stud s;
        for(int i=0; i<nb; i++)
                for(int j=0;j<i;j++)
                        if(strcmp(b[j].fio,b[j+1].fio)>0) 
            {
                s=b[j];
                b[j]=b[j+1];
                b[j+1]=s;
            }  /* опять же пропустили {} - скобки! и ; вместо запятых! */
}
 
void vuvod(int n,stud am[])
{
        cout<<"|"<<setw(12)<<"Familiya"<<"|"<<setw(9)<<"Ocenki"<<"|"<<setw(8)<<"Srednee"<<"|"<<"\n";
        cout<<"|"<<setw(31)<<"-------------------------------"<<"|"<<"\n";
        for(int i=0;i<n;i++)
                cout<<"|"<<setw(12)<<am[i].fio<<"|  "<<am[i].oc[0]<<"  "<<am[i].oc[1]<<"  "<<am[i].oc[2]<<"|"<<setw(8)<<am[i].sr<<"|"<<endl; 
/* имя массива не a, a am! */
}
 
void main()
{
        int n,nb;
        vvod(n,a);
        cout<<"Vvedennui massiv"<<endl;
        vuvod(n,a);
 
        nb = vubor(n,a,b);
 
        sort(nb,b);
        cout<<"Polucennui massiv"<<endl;
        vuvod(nb,b);
 
        getch();
}
Возможно я упустил какие-то ошибки, но вроде пашет. К тому же все эти статические массивы, глобальные переменные, смешивание C и C++, и прочие "радости жизни"... Избавьтесь от этого сами, а мне уже лень
nondeadlollipop
1 / 1 / 0
Регистрация: 21.11.2010
Сообщений: 20
15.12.2010, 21:54  [ТС]     Массив структур #5
dihlofos,
спасибо вам огромное!
я понимаю,что вам проще написать,но я только 2 месяца с++ изучаю с 0.так что пока это верх моих стараний.(
еще раз благодарю!)
Yandex
Объявления
15.12.2010, 21:54     Массив структур
Ответ Создать тему
Опции темы

Текущее время: 13:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru