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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 52, средняя оценка - 5.00
footbaler
1 / 1 / 0
Регистрация: 18.12.2010
Сообщений: 50
#1

Структуры и массивы, сортировка списка. - C++

08.01.2011, 05:56. Просмотров 6611. Ответов 37
Метки нет (Все метки)

Задание звучит так...
Написать программу, в которой необходимо создать структуру, элементами которой являются: имя, фамилия, год рождения студента и оценки по пяти экзаменам. Объявить массив данных о студентах группы типа структуры и ввести значения его элементов. Определить сумму баллов за сессию каждого студента и отсортировать список студентов по баллам в порядке возрастания. Сортировку реализовать в отдельной функции. Предусмотреть меню. Результаты работы программы записать в файл.

Я не прошу писать программу полностью, прошу лишь показать как реализовать сортировку и не могу понять, что значит предусмотреть меню.
Заранее спасибо!
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.01.2011, 05:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Структуры и массивы, сортировка списка. (C++):

Структуры, массивы, сортировка - C++
Люди Help! Уже второй день сижу над задачей и не могу понять в чём проблема. Задача такая: 1) Описать структуру с именем TRAIN,...

структуры данных. сортировка однонаправленного списка - C++
значит так, есть вот эта программа: #include <stdio.h> #include <conio.h> #include <math.h> struct spisok { int info; ...

Структуры, массивы структур (как можно присваивать(инициализировать) значения полям структуры) - C++
Есть у меня вот такая структура, например struct Subject { int cost; int Volume; }; Потом создаю экземпляр, Subject G; ...

Структуры. Сортировка массива структуры - C++
Здравствуйте! В чем моя ошибка?? Нужно отсортировать массив структуры по возрастанию среднего балла?? Делаю это с помощью...

"Сортировка двусвязного списка путем исключения элемента с минимальным значением и включения его в начало нового списка - C++
Здравствуйте! Возникла проблема с программой. Тема: "Сортировка двусвязного списка путем исключения элемента с минимальным значением и...

структуры и массивы - C++
#include "stdafx.h" #include <iostream> using namespace std; struct Worker{ char fio; signed int date; double salary; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
silent_1991
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
10.01.2011, 05:30 #16
footbaler, у вас в функции main n не инициализирована, но повсеместно используется. Не дело...
footbaler
1 / 1 / 0
Регистрация: 18.12.2010
Сообщений: 50
10.01.2011, 05:50  [ТС] #17
silent_1991, вот исправил, и изменил русские буквы на латинские... подскажете что у меня еще не так в тексте?
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
 
struct STUDENT
{                
  char name[15];  
  char surname[15];
  int god_r;
  int ocenka;
  int summa;
 };
 
void vvod(STUDENT *, int);
void summa(STUDENT *, int);
void sort(STUDENT *, int);
void exit();
void swap(STUDENT &, STUDENT &);
 
int main()
{
  STUDENT st[30];
  int v, n;
  cout<<"Vvedite kolihestvo studentov: ";
  cin>>n;
  do
  {
    cout<<
    "Vvedite punkt menu 1-4"<<endl<<
    "1. Vvesti dannie o studentax"<<endl<<
    "2. Poshcitat' summu ballov kajdogo studenta"<<endl<<
    "3. Otsortirovaty spisok studentov"<<endl<<
    "4. Exit"<<endl<<
    "Choise: ";
    cin >> v;
    switch (v)
    {
      case 1:
    vvod(st, n);
    break;
      case 2:
           summa(st, n);
           break;
      case 3:
    sort(st, n);
    for (int i = 0; i < n; ++i)
  cout <<st[i].surname<<"  "<<st[i].name<<" "<<st[i].god_r<<" "<<st[i].summa<<endl;
        break;
      case 4:
        exit();
        break;
      default:
    cout << "You must enter a number from 1 to 4\nTry again" << endl << endl;
        continue;
     }
   }
  while (v != 4);
  return 0;
}
 
void vvod(STUDENT *st, int n)
{
  for(int i=0; i<n; i++)
  {
    cout<<"Student В№: "<<i+1<<"\n";
    cout<<"Vvedite familiu studenta: \n";
    cin>>st[i].surname;
    cout<<"Vvedite imya studenta: \n";
    cin>>st[i].name;
    cout<<"Vvedite god rojdeniya studenta: \n";      
    cin>>st[i].god_r;
    for(int j=0; j<5; j++)
    {
      cout<<"Vvedite ocenku po ekzamenu "<<j+1<<" \n";
      cin>>st[i].ocenka;
      }
   }
}
 
void summa(STUDENT *st, int n)
{
for(int i=0; i<n; i++)
      for(i=0; i<5; i++)
       st[i].summa+=st[i].ocenka;
     cout<<"Summa ballov="<<st[i].summa<<"\n";
 }
void sort(STUDENT *st, int n)
{
    for (int i = 0; i < n; ++i)
        for (int j = n - 1; j > i; --j)
       if (st[j - 1].summa > st[j].summa)
        swap(st[j - 1], st[j]);
}
void swap(STUDENT &left, STUDENT &right)
{
    STUDENT temp = left;
    left = right;
    right = temp;
}
 
void exit()
{
    cout << endl << "Exit..." << endl;
}
silent_1991
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
10.01.2011, 05:53 #18
footbaler, у вас сумма неверно считается, потому что изначально переменная summa не инициализирована, и при прибавлении к ней очередной оценки получается мусор. В функции подсчёта суммы перед вложенным циклом инициализируйте переменную summa очередного студента нулём.
footbaler
1 / 1 / 0
Регистрация: 18.12.2010
Сообщений: 50
10.01.2011, 06:17  [ТС] #19
silent_1991, Извините, я понял что это надо сделать здесь,
C++
1
2
3
4
5
6
7
void summa(STUDENT *st, int n)
{
for(int i=0; i<n; i++)
      for(i=0; i<5; i++)
       st[i].summa+=st[i].ocenka;
     cout<<"Summa ballov="<<st[i].summa<<"\n";
 }
но я не понял где именно.
silent_1991
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
10.01.2011, 06:21 #20
C++
1
2
3
4
5
6
7
8
9
10
11
12
void summa(STUDENT *st, int n)
{
    for(int i=0; i<n; i++)
    {
        st[i].summa = 0;
 
        for(int j=0; j<5; j++)
            st[i].summa+=st[j].ocenka;
 
        cout<<"Summa ballov="<<st[i].summa<<"\n";
    }
}
Добавлено через 2 минуты
К тому же вы как во внешнем, так и во внутреннем цикле используете счётчик i - а это логическая ошибка, поскольку во внутреннем цикле мы пробегаем по другим значениям другого массива, нежели во внешнем. А то у вас получается, что во внешнем цикле i увеличили на 1, потом во внутреннем на пять... Короче, даже трудно словами описать, какой там хаос творился))) В выложенном коде поправил, скопируйте его вместо своего.
ForEveR
В астрале
Эксперт С++
7971 / 4733 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
10.01.2011, 06:27 #21
Например. Файл и меню сюда приделать дело пары минут. На тему файла - вообще элементарно. Но мне лень сейчас.
Конец ввода посылается сигналом EOF на Windows - CTRL+Z

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
88
#include <iostream>
#include <string>
#include <algorithm>
#include <vector> 
#include <numeric>
 
typedef std::vector<int> T_vec;
typedef std::string T_str;
 
struct student
{
    T_str name;
    T_str surname;
    unsigned int year_of_b;
    T_vec notes;
    
    const static size_t size=5;
 
    student(T_str name_="", T_str surname_="", unsigned int yob=0,
        T_vec notes_=T_vec(size)):name(name_), surname(surname_),
        year_of_b(yob), notes(notes_)
    {
    }
    
    const T_str& getName() const {return name;}
    const T_str& getSurname() const {return surname;}
    const unsigned int getYearOfBirth() const {return year_of_b;}
    const T_vec& getNotes() const {return notes;}
    const int sum() const {return std::accumulate(notes.begin(), notes.end(), 0);}
 
    void setInfo(T_str name_="", T_str surname_="", unsigned int yob=0,
        T_vec notes_=T_vec(size))
    {
        name=name_;
        surname=surname_;
        year_of_b=yob;
        notes=notes_;
    }
};
 
int gen()
{
    int t;
    std::cin>>t;
    return t;
}
 
std::istream& operator >>(std::istream& is, student& one)
{
    T_str name, surname;
    unsigned year;
    T_vec notes(one.size);
    std::cout<<"Enter name of student: ";
    is>>name;
    std::cout<<"Enter surname of student: ";
    is>>surname;
    std::cout<<"Enter year of student: ";
    is>>year;
    std::cout<<"Enter 5 notes of student\n";
    std::generate(notes.begin(), notes.end(), gen);
    one.setInfo(name, surname, year, notes);
    return is;
}
 
std::ostream& operator <<(std::ostream& os, const student& one)
{
    os<<"Name: "<< one.getName() <<'\n'
        <<"Surname: "<< one.getSurname() <<'\n'
        <<"Year of birthday: "<< one.getYearOfBirth() <<'\n';
    os<<"Notes\n";
    std::copy(one.getNotes().begin(), one.getNotes().end(), 
        std::ostream_iterator<int>(std::cout, " "));
    return os;
}
 
bool operator <(const student& first, const student& second)
{
    return first.sum() < second.sum();
}
 
int main()
{
    std::vector<student> Groop((std::istream_iterator<student>(std::cin)),
        std::istream_iterator<student>());
    std::sort(Groop.begin(), Groop.end());
    std::copy(Groop.begin(), Groop.end(), std::ostream_iterator<student>(std::cout, "\n"));
    return 0;
}
silent_1991
10.01.2011, 06:29
  #22

Не по теме:

ForEveR, сомневаюсь, что ТСу это подойдет

ForEveR
10.01.2011, 06:32
  #23

Не по теме:

silent_1991, Ну) Я всегда в основном пишу для себя. А ТС может что-то позаимствовать)

silent_1991
10.01.2011, 06:33
  #24

Не по теме:

Цитата Сообщение от ForEveR Посмотреть сообщение
Я всегда в основном пишу для себя
И правильно! Иначе как от программирования удовольствие получать? )))

footbaler
1 / 1 / 0
Регистрация: 18.12.2010
Сообщений: 50
10.01.2011, 06:43  [ТС] #25
Цитата Сообщение от silent_1991 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
void summa(STUDENT *st, int n)
{
    for(int i=0; i<n; i++)
    {
        st[i].summa = 0;
 
        for(int j=0; j<5; j++)
            st[i].summa+=st[j].ocenka;
 
        cout<<"Summa ballov="<<st[i].summa<<"\n";
    }
}
Добавлено через 2 минуты
К тому же вы как во внешнем, так и во внутреннем цикле используете счётчик i - а это логическая ошибка, поскольку во внутреннем цикле мы пробегаем по другим значениям другого массива, нежели во внешнем. А то у вас получается, что во внешнем цикле i увеличили на 1, потом во внутреннем на пять... Короче, даже трудно словами описать, какой там хаос творился))) В выложенном коде поправил, скопируйте его вместо своего.
по вашему коду сумму опять не считает, в ответе суммы получается последняя цифра (оценка) которую я ввел, а не сумма цифр(оценок)...
silent_1991
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
10.01.2011, 06:57 #26
footbaler, ёпть! А вы что хотели, у вас в структуре ocenka объявлена не как массив, а как переменная целого типа!

Добавлено через 1 минуту
Такое ощущение, что вы абсолютно не понимаете, что делаете в коде...

Добавлено через 1 минуту
Так работает всё, что надо:

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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
 
struct STUDENT
{                
  char name[15];  
  char surname[15];
  int god_r;
  int ocenka[5];
  int summa;
 };
 
void vvod(STUDENT *, int);
void summa(STUDENT *, int);
void sort(STUDENT *, int);
void exit();
void swap(STUDENT &, STUDENT &);
 
int main()
{
  STUDENT st[30];
  int v, n;
  cout<<"Vvedite kolihestvo studentov: ";
  cin>>n;
  do
  {
    cout<<
    "Vvedite punkt menu 1-4"<<endl<<
    "1. Vvesti dannie o studentax"<<endl<<
    "2. Poshcitat' summu ballov kajdogo studenta"<<endl<<
    "3. Otsortirovaty spisok studentov"<<endl<<
    "4. Exit"<<endl<<
    "Choise: ";
    cin >> v;
    switch (v)
    {
      case 1:
        vvod(st, n);
        break;
      case 2:
           summa(st, n);
           break;
      case 3:
        sort(st, n);
        for (int i = 0; i < n; ++i)
  cout <<st[i].surname<<"  "<<st[i].name<<" "<<st[i].god_r<<" "<<st[i].summa<<endl;
        break;
      case 4:
        exit();
        break;
      default:
        cout << "You must enter a number from 1 to 4\nTry again" << endl << endl;
        continue;
     }
   }
  while (v != 4);
  return 0;
}
 
void vvod(STUDENT *st, int n)
{
  for(int i=0; i<n; i++)
  {
    cout<<"Student №: "<<i+1<<"\n";
    cout<<"Vvedite familiu studenta: \n";
    cin>>st[i].surname;
    cout<<"Vvedite imya studenta: \n";
    cin>>st[i].name;
    cout<<"Vvedite god rojdeniya studenta: \n";      
    cin>>st[i].god_r;
    for(int j=0; j<5; j++)
    {
      cout<<"Vvedite ocenku po ekzamenu "<<j+1<<" \n";
      cin>>st[i].ocenka[j];
      }
   }
}
 
void summa(STUDENT *st, int n)
{
    for(int i=0; i<n; i++)
    {
        st[i].summa = 0;
 
        for(int j=0; j<5; j++)
            st[i].summa+=st[i].ocenka[i];
 
        cout<<"Summa ballov="<<st[i].summa<<"\n";
    }
}
 
void sort(STUDENT *st, int n)
{
    for (int i = 0; i < n; ++i)
        for (int j = n - 1; j > i; --j)
           if (st[j - 1].summa > st[j].summa)
                swap(st[j - 1], st[j]);
}
void swap(STUDENT &left, STUDENT &right)
{
    STUDENT temp = left;
    left = right;
    right = temp;
}
 
void exit()
{
    cout << endl << "Exit..." << endl;
}
footbaler
1 / 1 / 0
Регистрация: 18.12.2010
Сообщений: 50
10.01.2011, 07:17  [ТС] #27
не злитесь, я ведь всего лишь учусь, хоть и не правильным путем.
тут все таки не все верно)
Цитата Сообщение от silent_1991 Посмотреть сообщение
for(int j=0; j<5; j++)
st[i].summa+=st[i].ocenka[i];
st[i].summa+=st[i].ocenka[j] - так должно быть)
silent_1991
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
10.01.2011, 07:19 #28
footbaler, да, забыл поправить, работал с другим кодом (студия не принимает iostream.h и т.д.), так что вот, чтобы ваш код не запоганить, поганил копию))) Вышло боком...
footbaler
1 / 1 / 0
Регистрация: 18.12.2010
Сообщений: 50
10.01.2011, 07:25  [ТС] #29
silent_1991, еще вопрос к вам:
То что мы общим трудом превратили в исходный код, совпадает с моим заданием в шапке (ну кроме сохранения в файл конечно, это еще допишу), так сказать, отвечает требованиям? (интересно ваше мнение, а то вдруг препод придерется)
silent_1991
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
10.01.2011, 07:45 #30
Думаю, да, совпадает)))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.01.2011, 07:45
Привет! Вот еще темы с ответами:

Массивы, структуры, на С++ - C++
Уже второй день думаю как сделать задачку по программированию, но пока что-то безуспешно. Лекции по этой теме нам еще не читали(дана для...

Массивы структуры - C++
Как найти среднюю температуру заданого месяца, а потом определить в какие дни этого месяца температура превышала среднии показатели?

Структуры и массивы - C++
Задание следующее: Написать программу, в которой необходимо создать структуру, элементами которой являются фамилия автора книги и ее...

Структуры, массивы, функции - C++
Написать программу, определяющую дату, которая наступит через m дней на с++ желательно с использованием Структур и функций...очень надо


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
10.01.2011, 07:45
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru