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

Вывести имена трех худших по баллу - C++

Восстановить пароль Регистрация
 
OgUrec
0 / 0 / 0
Регистрация: 01.08.2010
Сообщений: 15
27.08.2010, 14:38     Вывести имена трех худших по баллу #1
Вот условие
На вход программе подаются сведения о сдаче экзаменов учениками 11-х классов некоторой средней школы. В первой строке сообщается количество учеников N, которое не меньше 10, но не превосходит 100, каждая из следующих N строк имеет следующий формат:

<Фамилия> <Имя> <оценки>,

где <Фамилия> – строка, состоящая не более чем из 20 символов, <Имя> – строка, состоящая не более чем из 15 символов, <оценки> – через пробел три целых числа, соответствующие оценкам по 100 бальной системе. <Фамилия> и <Имя>, а также <Имя> и <оценки> разделены одним пробелом. Пример входной строки:

Иванов Петр 55 65 73

Требуется написать как можно более эффективную программу (укажите используемую версию языка программирования, например, Borland Pascal 7.0), которая будет выводить на экран фамилии и имена трех худших по среднему баллу учеников. Если среди остальных есть ученики, набравшие тот же средний балл, что и один из трех худших, то следует вывести и их фамилии и имена.

Вот код

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
# include "iostream.h"
# include "math.h"
#include <fstream>
#include <tchar.h>
struct ege  {   char fam[20];
            char name[15];
            int o1;
            int o2;
            int o3;
            int sred;   };
using namespace std;
void main ()
{
    int i,n,min,s1,s2,s3;
    cout<<"Vvedite kolichestvo uchenikov"<<endl;
    cin>>n;
    s1=s2=s3=200;
    ege a[100];
    while (!(n>=10 && n<=100))
    {
        cout<<"Nepravilnii vvod. Chislo uchenikov dolzno bit' <100 i >10"<<endl;
    cout<<"Vvedite kolichestvo uchenikov"<<endl;
    cin>>n;
    }
        cout<<"Vvedite dannie Familia Name ball_1 ball_2 ball_3"<<endl;
        for (i=0;i<n;i++)
        {
            cin>>a[i].fam>>a[i].name>>a[i].o1>>a[i].o2>>a[i].o3;
            a[i].sred = (a[i].o1+a[i].o2+a[i].o3)/3;
        }
        cout<<endl<<"  Spisok uchenikov  "<<endl;
        for (i=0;i<n;i++)
        {
        if (a[i].sred<s1)
        {
            s3=s2;s2=s1;
            s1=a[i].sred;
                    }
            if (a[i].sred<s2)
            {
                s3=s2;
                s2=a[i].sred;       
            }   
                if (a[i].sred<s3)
                {
                    s3=a[i].sred;}              
                cout<<endl<<"--------------------"<<endl<<a[i].fam<<" "<<a[i].name<<" "<<a[i].o1<<" "<<a[i].o2<<" "<<a[i].o3<<"  Srednee znachenie  "<<a[i].sred<<endl<<endl;
 
        }   
 
cout<<"Hudshie srednie balli ege"<<endl;
cout<<s1<<" "<<s2<<" "<<s3<<endl;
for (i=0;i<n;i++)
{
    if (a[i].sred<=s3)
        cout<<endl<<a[i].fam<<" "<<a[i].name<<" "<<a[i].sred<<endl;
    
}
 
}
Проблема в том, что выводит только тех у кого минимальный средний балл. а 2-ой и 3-ий результаты не выводит. И все переменные s1,s2,s3 становятся одинаковые.
Помиогите, чувствую, что ошибка мелкая.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.08.2010, 14:38     Вывести имена трех худших по баллу
Посмотрите здесь:

C++ Ввести имена и телефоны сотрудников организации в массив записей и вывести их в виде таблицы.
Упорядочить список студентов по среднему баллу и вывести весь список C++
Создать базу из трех сотрудников, где будут храниться их имена C++
Вывести трех лучших учеников C++
C++ Вывести все записи, у которых имена объектов совпадают с введенным пользователем
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vladimir.
155 / 155 / 10
Регистрация: 24.11.2009
Сообщений: 375
27.08.2010, 17:33     Вывести имена трех худших по баллу #2
Ошибка в алгоритме.
Точнее в условных операторах в строках с 36 по 47. Если выполниться условие строки 35, то условие в строках 40 и 45 тоже выполнятся. У Вас фактически нет никакой разницы между переменными S1,S2,S3.
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
27.08.2010, 17:36     Вывести имена трех худших по баллу #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
#include <iostream>
#include <set>
 
const int WORST_NUMBER = 3;
 
struct ege
{
    // ...
};
 
bool operator <( const ege& x, const ege& y )
{
    return x.o1 + x.o2 + x.o3 < y.o1 + y.o2 + y.o3;
}
 
int main( int argc, char* argv[] )
{
    ege arr[100];
 
    int n;
    // ...
 
    int count = _min( n, WORST_NUMBER);
    std::set<ege> worst;
    for( int i = 0; i < count; ++i )    
        worst.insert( arr[i] );
    
    if( count > WORST_NUMBER )
    {
        for( int i = 0; i < count; ++i )
            if( arr[i]  < *worst.rbegin() )
            {
                worst.erase( rbegin() );
                worst.insert( arr[i] );
            }
    }
 
    for( std::set<ege>::const_iterator iter = worst.begin(); iter != worst.end(); ++iter )
        std::cout << iter->name << " " << iter->surname << std::endl;
 
    return 0;
}
Что-то типа этого. Дополни вводом и своей структурой.
Так же, не советую держать среднее значени и каждый бал в отдельности, т.к. это дублирование данных. Если хочешь, напиши фукнцию, к-рая выводит средний балл.

Называй переменные более понятными названиями.
worst1, worst2, worst3, например.
Инклуды хедеров, к-рые относятся к библиотекам (iostream, windows.h), и не находятся в директории проекта, неплохо бы заключать в угловые скобки ( '<', '>' ) вместо кавычек.
Dexter
 Аватар для Dexter
284 / 144 / 16
Регистрация: 13.10.2009
Сообщений: 164
27.08.2010, 17:40     Вывести имена трех худших по баллу #4
В твоем алгоритме нужно добавить else перед строками

Код
40 if (a[i].sred<s2)
и
Код
45 if (a[i].sred<s3)
OgUrec
0 / 0 / 0
Регистрация: 01.08.2010
Сообщений: 15
27.08.2010, 18:59  [ТС]     Вывести имена трех худших по баллу #5
Всем спасибо за помощь))
а теперь я сделал. чтобы выводило по возрастанию пишет ошибку:
левый операнд должен быть левосторонним значением. Что это значит?
вот кусочек кода, где я изменил кое-что:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
for (i=0;i<n;i++)
{
    if (a[i].sred<=s3)
        if ((a[i].sred) < (a[i+1].sred))
        {
          fam=a[i].fam;a[i].fam=a[i+1].fam;a[i+1].fam=fam;
          name=a[i].name;a[i].name=a[i+1].name;a[i+1].name=name;
          prom=a[i].sred;a[i].sred=a[i+1].sred;a[i+1].sred=prom;
                                                        }
    
}
for (i=0;i<n;i++)
cout<<endl<<a[i].fam<<" "<<a[i].name<<" "<<a[i].sred<<endl;
}
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
27.08.2010, 19:01     Вывести имена трех худших по баллу #6
Цитата Сообщение от OgUrec Посмотреть сообщение
fam=a[i].fam
Строки так нельзя копировать. Посмотрите в сторону функций strcpy.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.08.2010, 20:38     Вывести имена трех худших по баллу
Еще ссылки по теме:

C++ Вывести на экран в текущем каталоге имена тех каталогов, которые в себе не содержат подкаталогов
C++ Вывести список всех файлов из указанной директории, имена которых содержат русские буквы
C++ Вывести имена файлов в порядке убывания размера файла

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

Или воспользуйтесь поиском по форуму:
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
27.08.2010, 20:38     Вывести имена трех худших по баллу #7
И не группируйте команды по несколько в строку - места на диске вы не сэкономите
Yandex
Объявления
27.08.2010, 20:38     Вывести имена трех худших по баллу
Ответ Создать тему
Опции темы

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