Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.74/38: Рейтинг темы: голосов - 38, средняя оценка - 4.74
1 / 1 / 0
Регистрация: 18.12.2010
Сообщений: 50
1

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

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

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

Я не прошу писать программу полностью, прошу лишь показать как реализовать сортировку и не могу понять, что значит предусмотреть меню.
Заранее спасибо!
1
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.01.2011, 05:56
Ответы с готовыми решениями:

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

Структуры данных: сортировка однонаправленного списка
значит так, есть вот эта программа: #include <stdio.h> #include <conio.h> #include <math.h>...

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

Структуры, массивы, указатели, динамические массивы структур
Помогите с решением задачи (прикрепляю условие). Заранее спасибо.

37
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
10.01.2011, 06:27 21
Author24 — интернет-сервис помощи студентам
Например. Файл и меню сюда приделать дело пары минут. На тему файла - вообще элементарно. Но мне лень сейчас.
Конец ввода посылается сигналом 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;
}
1
silent_1991
10.01.2011, 06:29
  #22

Не по теме:

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

0
ForEveR
10.01.2011, 06:32
  #23

Не по теме:

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

0
silent_1991
10.01.2011, 06:33
  #24

Не по теме:

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

0
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, потом во внутреннем на пять... Короче, даже трудно словами описать, какой там хаос творился))) В выложенном коде поправил, скопируйте его вместо своего.
по вашему коду сумму опять не считает, в ответе суммы получается последняя цифра (оценка) которую я ввел, а не сумма цифр(оценок)...
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
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;
}
1
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] - так должно быть)
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
10.01.2011, 07:19 28
footbaler, да, забыл поправить, работал с другим кодом (студия не принимает iostream.h и т.д.), так что вот, чтобы ваш код не запоганить, поганил копию))) Вышло боком...
0
1 / 1 / 0
Регистрация: 18.12.2010
Сообщений: 50
10.01.2011, 07:25  [ТС] 29
silent_1991, еще вопрос к вам:
То что мы общим трудом превратили в исходный код, совпадает с моим заданием в шапке (ну кроме сохранения в файл конечно, это еще допишу), так сказать, отвечает требованиям? (интересно ваше мнение, а то вдруг препод придерется)
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
10.01.2011, 07:45 30
Думаю, да, совпадает)))
0
1 / 1 / 0
Регистрация: 18.12.2010
Сообщений: 50
11.01.2011, 00:00  [ТС] 31
Цитата Сообщение от silent_1991 Посмотреть сообщение
Думаю, да, совпадает)))
Это хорошо!))

Добавлено через 16 часов 4 минуты
Вот я и добил эту программу! Вот что в итоге получилось:
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
#include <iostream.h>
#include <fstream.h>
 
struct STUDENT
{                
  char name[10];  
  char surname[15];
  int god_r;
  int ocenka[5];
  int summa;
 };
 
void sort (STUDENT *, int);
void swap (STUDENT &, STUDENT &);
 
int main ()
{
  STUDENT st[15];
  int v, n, i;
  cout << "Vvedite kolihestvo studentov: ";
  cin >> n;
  for (i = 0; i < n; i ++)
  {
    cout << endl << "Student " << i+1 << ":\n";
    cout << "Vvedite familiu: ";
    cin >> st[i].surname;
    cout << "Vvedite imya: ";
    cin >> st[i].name;
    cout << "Vvedite god rojdeniya: ";      
    cin >> st[i].god_r;
    for(int j = 0; j < 5; j++)
    {
      cout << "Vvedite ocenky po " << j+1 << "-my ekzameny: ";
      cin >> st[i].ocenka[j];
     }
   }
  ofstream file;
  file.open("C:\\student.txt");
  do
  {
    cout <<endl<<
    "Viberete deistvie:" << endl <<
    "1. Summa ballov kajdogo studenta." << endl <<
    "2. Sortirovka cpiska i zapis' v file." << endl <<
    "3. Exit." << endl <<
    "Vvedite 1-3: ";
    cin >> v;
    switch (v)
    {
      case 1:
    for(i = 0; i < n; i++)
    {
      st[i].summa = 0;
      for(int j=0; j<5; j++)
          st[i].summa+=st[i].ocenka[j];
      cout << endl << "Summa ballov " << i+1 << "-go studenta = " << st[i].summa << endl;
     }
    break;
      case 2:
    sort (st, n);
    for (i = 0; i < n; ++i)
    file << i+1 <<". "<< st[i].surname<<"  "<< st[i].name <<"  "<< st[i].god_r <<"  "<< st[i].summa << endl;
    break;
      case 3:
    cout << endl << "Exit..." << endl;
    break;
      default:
    cout << "Vi vveli nevernoe chislo! Poprobuyte esche." << endl;
    continue;
     }
   }
  while (v != 3);
  file.close();
  return 0;
 }
 
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;
 }
Все по заданию работает!
Спасибо всем кто участвовал, отдельное спасибо silent_1991!
0
1 / 1 / 0
Регистрация: 18.12.2010
Сообщений: 50
17.01.2011, 14:27  [ТС] 32
Подскажите пожалуйста, как надо прописать st[i].ocenka[j] вот здесь
C++
1
2
3
4
5
case 2:
        sort (st, n);
        for (i = 0; i < n; ++i)
        file << i+1 <<". "<< st[i].surname<<"  "<< st[i].name <<"  "<< st[i].god_r <<"  "<< st[i].summa << endl;
        break;
что бы в файле отображались не только имя, фамилия, год рождения, и сумма оценок, но и еще каждая введенная оценка?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
17.01.2011, 14:28 33
footbaler, Циклом по j соответственно)
Сначала выводим имя и т.д. затем циклом по j каждую оценку
0
1 / 1 / 0
Регистрация: 18.12.2010
Сообщений: 50
18.01.2011, 12:21  [ТС] 34
ForEveR, Ну что циклом по j, это я понимаю, а вот где это прописать не понимаю...
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
18.01.2011, 14:19 35
C++
1
2
3
4
5
6
7
8
case 2:
        sort (st, n);
        for (i = 0; i < n; ++i)
        file << i+1 <<". "<< st[i].surname<<"  "<< st[i].name <<"  "<< st[i].god_r <<"  "<< st[i].summa << endl; 
        for(int j=0; j<5; ++j)
            file<<st[i].ocenka[j]<<' ';
        file<<'\n';
        break;
1
1 / 1 / 0
Регистрация: 18.12.2010
Сообщений: 50
19.01.2011, 12:31  [ТС] 36
Цитата Сообщение от ForEveR Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
case 2:
        sort (st, n);
        for (i = 0; i < n; ++i)
        file << i+1 <<". "<< st[i].surname<<"  "<< st[i].name <<"  "<< st[i].god_r <<"  "<< st[i].summa << endl; 
        for(int j=0; j<5; ++j)
            file<<st[i].ocenka[j]<<' ';
        file<<'\n';
        break;
Спасибо, но этот код не работает, он записывает 5 нулей под списком студентов.
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
19.01.2011, 13:49 37
footbaler, Фак. Ну а под себя подстроить?
Тогда вот так...
C++
1
2
3
4
5
6
7
8
9
10
11
case 2:
        sort (st, n);
        for (i = 0; i < n; ++i)
        {
        file << i+1 <<". "<< st[i].surname<<"  "<< st[i].name <<"  "<< st[i].god_r <<"  "<< st[i].summa << endl; 
        for(int j=0; j<5; ++j)
            file<<st[i].ocenka[j]<<' ';
        }
        file<<'\n';
        break;
}
Норм?
1
1 / 1 / 0
Регистрация: 18.12.2010
Сообщений: 50
20.01.2011, 17:15  [ТС] 38
Цитата Сообщение от ForEveR Посмотреть сообщение
footbaler, Фак. Ну а под себя подстроить?
извините, я думал это уже готовый вариант...
Вот так самое оно))
C++
1
2
3
4
5
6
7
8
9
10
11
12
case 2:
    sort (st, n);
        for (i = 0; i < n; ++i)
    {
    file << i+1 <<". "<< st[i].surname<<"\t\t"<< st[i].name <<"\t\t"<< st[i].god_r <<"\t";
    for(int j=0; j<5; ++j)
        {
        file << st[i].ocenka[j] <<"\t";
            }
        file << st[i].summa << endl;
    }
        break;
Спасибо вам за подсказку!
0
20.01.2011, 17:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.01.2011, 17:15
Помогаю со студенческими работами здесь

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

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

структуры и массивы
Условия задачи: 1. Создать перечисление должностей Vacancies {Manager, Boss, Clerk, Salesman,...

структуры и массивы
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; struct Worker{ char fio; ...


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

Или воспользуйтесь поиском по форуму:
38
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru