Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Cтруктура на С++ / 17 сообщений из 17, страница 1 из 1
10.12.2016, 08:56
    #39363979
Avatangqa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cтруктура на С++
Здравствуйте, помогите решить проблему. После запуска и ввода данных, программа перестаёт работать, то есть не выводит результат на экран. Что здесь сделано не так? Заранее спасибо за ответ.

Само задание:

Код: plaintext
1.
2.
Успеваемость студентов. Записать в структуру следующие данные о
студентах: Ф.И.О., № группы, оценки по 4 предметам. Организовать выбор
отличников. Выбранных упорядочить по алфавиту


Код: plaintext
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.
#include <iostream>
    #include <string.h>
    using namespace std;
    int main()
    {
        struct students
        {
            char* name;
            int number;
            int mark1;
            int mark2;
            int mark3;
            int mark4;
        };
        students *student = new students();
        int k = 0;
        cout << "Vvedite kol-vo studentov: ";
        cin >> k;
        for (int i = 0; i < k; i++)
        {
            cout << "\nVvedite imya studenta: ";
            cin>>student[i].name;

            cout << "\nVvedite nomer gruppi: ";
            cin >> student[i].number;

            cout << "\nVvedite ocenky po algebre: ";
            cin >> student[i].mark1;
            cout << "\nVvedite ocenky po fizike: ";
            cin >> student[i].mark2;
            cout << "\nVvedite ocenky po himii: ";
            cin >> student[i].mark3;
            cout << "\nVvedite ocenke po geografii: ";
            cin >> student[i].mark4;
        }
        students *excellentStudent = new students();
        int i = 0, n=0;
        while (i < k)
        {
            if ((student[i].mark1 == 5) && (student[i].mark2 == 5) &&
                (student[i].mark3 == 5) && (student[i].mark4 == 5))
            {
                excellentStudent[i] = student[i];
                n++;
            }
            i++;
        }
        int choice = 0;
        cout << "\nVvedite '0', esli hotite otsortirovat po alfavity,\n"
            "ili '1', esli sortirovka ne trebyetsya.";
        cin >> choice;
        do
        {
            switch (choice)
            {
            case 0:
                students b;
                for (int m = 0; m < (n - 1); m++)
                {
                    for (int a = (m + 1); a < n; a++)
                    {
                        if (excellentStudent[m].name[0]>excellentStudent[a].name[0])
                        {
                            b = excellentStudent[m];
                            excellentStudent[m] = excellentStudent[a];
                            excellentStudent[a] = b;
                        }
                    }
                }
                for (int j = 0; j < n; j++)
                {
                    cout << "\n\n[" << j << "]";
                    cout << "\nImya studenta: " << excellentStudent[j].name;

                    cout << "\nNoper gruppi: " << excellentStudent[j].number;

                    cout << "\nOcenka po algebre: " << excellentStudent[j].mark1;
                    cout << "\nOcenka po fizike: " << excellentStudent[j].mark2;
                    cout << "\nOcenka po himii: " << excellentStudent[j].mark3;
                    cout << "\nOcenka po geometrii: " << excellentStudent[j].mark4;
                }
                break;
            case 1:
                for (int j = 0; j < n; j++)
                {
                    cout << "\n\n[" << j << "]";
                    cout << "\nImya studenta: " << excellentStudent[j].name;

                    cout << "\nNomer gruppi: " << excellentStudent[j].number;

                    cout << "\nOcenka po algebre: " << excellentStudent[j].mark1;
                    cout << "\nOcenka po fizike: " << excellentStudent[j].mark2;
                    cout << "\nOcenka po himii: " << excellentStudent[j].mark3;
                    cout << "\nOcenka po geometrii: " << excellentStudent[j].mark4;
                }
                break;
            default:
                cout << "Vvedeno nevernoe znachenie ["
                    << choice << "]. Poprobuite snova.";
                break;
            }
        } while ((choice == 0) || (choice == 1));

        return 0;
    }
...
Рейтинг: 0 / 0
10.12.2016, 13:13
    #39364040
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cтруктура на С++
Avatangqaпомогите решить проблему.
Пошаговая отладка тебе поможет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10.12.2016, 20:09
    #39364148
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cтруктура на С++
Вот тут:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
        struct students
        {
            char* name;
            int number;
            int mark1;
            int mark2;
            int mark3;
            int mark4;
        };

      // ...
            cout << "\nVvedite imya studenta: ";
            cin>>student[i].name;




уже будут проблемы...

Ты понимаешь, что делаешь ? Не понимаешь -- используй std::string.
...
Рейтинг: 0 / 0
10.12.2016, 20:11
    #39364151
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cтруктура на С++
Ну и такая вот:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
struct students
        {
            char* name;
            int number;
            int mark1;
            int mark2;
            int mark3;
            int mark4;
        };



организация структуры хранения оценок -- это на 2 балла (неуд).

Представь себе, что надо хранить не 4 оценки, а 100 оценок...
...
Рейтинг: 0 / 0
10.12.2016, 20:27
    #39364157
alexy_black
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cтруктура на С++
MasterZivНу и такая вот:

организация структуры хранения оценок -- это на 2 балла (неуд).
почему, может итнститут в индии :) там на 5 :)
...
Рейтинг: 0 / 0
10.12.2016, 21:20
    #39364184
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cтруктура на С++
MasterZivПредставь себе, что надо хранить не 4 оценки, а 100 оценок...
Не следует множить сущности без необходимости - говорил старик Оккам ))
...
Рейтинг: 0 / 0
11.12.2016, 01:23
    #39364263
Пётр Седов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cтруктура на С++
Avatangqa
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
        struct students
        {
            char* name;
            int number;
            int mark1;
            int mark2;
            int mark3;
            int mark4;
        };

Структура хранит данные про одного студента, поэтому её лучше назвать в единственном числе. «char* name;» -- это указатель, по умолчанию он не указывает ни на какой массив, здесь этот указатель проще заменить на массив фиксированной длины. Полям лучше давать подробные имена, а не «mark1», «mark2». У вас путаница:
Avatangqa
Код: plaintext
1.
2.
3.
4.
            cout << "\nVvedite ocenke po geografii: ";
            cin >> student.mark4;
...
                    cout << "\nOcenka po geometrii: " << excellentStudent[j].mark4;

Итого:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
        struct student
        {
            char name[100];
            int group_number;
            int algebra_mark;
            int physics_mark;
            int chemistry_mark;
            int geography_mark; // или geometry_mark
        };


Avatangqa
Код: plaintext
1.
2.
3.
4.
        students *student = new students();
        int k = 0;
        cout << "Vvedite kol-vo studentov: ";
        cin >> k;

В отмеченной строке создаётся [i]один
объект, но вам-то нужен массив объектов. Сначала узнаём длину массива, потом его создаём:
Код: plaintext
1.
2.
3.
4.
        int students_count = 0; // осмысленное имя, вместо «k»
        cout << "Vvedite kol-vo studentov: ";
        cin >> students_count;
        student* students = new student[students_count]; // создаём массив


Avatangqa
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
        students *excellentStudent = new students();
        int i = 0, n=0;
        while (i < k)
        {
            if ((student[i].mark1 == 5) && (student[i].mark2 == 5) &&
                (student[i].mark3 == 5) && (student[i].mark4 == 5))
            {
                excellentStudent[i] = student[i];
                n++;
            }
            i++;
        }

Опять же, сначала узнаём длину массива, потом его создаём:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
        int excellent_students_count = 0; // осмысленное имя, вместо «n»
        for (int i = 0; i < students_count; i++)
        {
            if ((students[i].algebra_mark == 5) && (students[i].physics_mark == 5) &&
                (students[i].chemistry_mark == 5) && (students[i].geography_mark == 5))
            {
                excellent_students_count++;
            }
        }

        student* excellent_students = new student[excellent_students_count];
        int esi = 0;
        for (int si = 0; si < students_count; si++)
        {
            if ((students[si].algebra_mark == 5) && (students[si].physics_mark == 5) &&
                (students[si].chemistry_mark == 5) && (students[si].geography_mark == 5))
            {
                excellent_students[esi] = students[si]; // индексы разные
                esi++;
            }
        }


Avatangqa
Код: plaintext
1.
                        if (excellentStudent[m].name[0]>excellentStudent[a].name[0])

Для сравнения строк в C-шном стиле используется стандартная функция strcmp :
Код: plaintext
1.
                        if (strcmp(excellent_students[m].name, excellent_students[a].name) > 0)

Чтобы использовать эту функцию, в начале .cpp-файла должно быть написано «#include <string.h>», это у вас уже есть.

В конце уничтожаем созданные динамические массивы:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
    int main()
    {
        ...

        delete[] students;
        delete[] excellent_students;

        return 0;
    }
...
Рейтинг: 0 / 0
12.12.2016, 19:31
    #39365220
alexy_black
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cтруктура на С++
Пётр Седов, клевый ответ

от себя добавлю: очень трудно работать с указателями. обязятельно что-нибудь где-нибудь пойдет не так.. лучши для хранения строки использовать std::string, а для хранения массива - std::vector (с вектором это будет вроде std::vector<student> student_list ).

вот к примеру копирование std::string выглядит также, как копирование обычной переменной. с указателями так не получится. все эти классы, да и вобще все ооп, придуманы, чтобы можно было упростить себе задачу (для контроля сложности).
...
Рейтинг: 0 / 0
12.12.2016, 21:57
    #39365276
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cтруктура на С++
alexy_blackочень трудно работать с указателями
да уж
...
Рейтинг: 0 / 0
12.12.2016, 22:24
    #39365281
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cтруктура на С++
Изопропилalexy_blackочень трудно работать с указателями
да уж

так может им по заданию наоборот надо..
...
Рейтинг: 0 / 0
13.12.2016, 00:53
    #39365332
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cтруктура на С++
alexy_blackочень трудно работать с указателями+1. невыносимо )))
...
Рейтинг: 0 / 0
13.12.2016, 01:06
    #39365337
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cтруктура на С++
egorych+1. невыносимо )))
Специально для решения этой проблемы и был в своё время придуман язык Java.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13.12.2016, 01:47
    #39365349
Пётр Седов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cтруктура на С++
alexy_blackлучши для хранения строки использовать std::string,Да, конечно, «char name[100]» -- это только для учебного задания, в реальном коде будет std::string или его аналог. Просто вполне может быть, что автор вопроса будет изучать STL-контейнеры в следующем семестре.
...
Рейтинг: 0 / 0
13.12.2016, 05:27
    #39365362
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cтруктура на С++
Dimitry SibiryakovСпециально для решения этой проблемы и был в своё время придуман язык Java.shared_ptr для этого был придуман. А Java придуман, чтобы не придумывать shared_ptr-ы
Пётр СедовПросто вполне может быть, что автор вопроса будет изучать STL-контейнеры в следующем семестре.Это, типа, как брату из 6-го класса, на вопрос о площади круга, написать интеграл от sqrt(r^2 - x^2)dx?
...
Рейтинг: 0 / 0
13.12.2016, 10:38
    #39365513
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cтруктура на С++
Dimitry Sibiryakovegorych+1. невыносимо )))
Специально для решения этой проблемы и был в своё время придуман язык Java.


В современном С++ с указателями практически не нужно работать, если ты конечно не пишешь какой-то
драйвер устройства или библиотеку.
...
Рейтинг: 0 / 0
14.12.2016, 07:21
    #39366353
nik_x
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cтруктура на С++
MasterZivDimitry Sibiryakovпропущено...

Специально для решения этой проблемы и был в своё время придуман язык Java.


В современном С++ с указателями практически не нужно работать, если ты конечно не пишешь какой-то
драйвер устройства или библиотеку.
Во как! А я то и не знал! И все по старинке, с указателями... Прана, классы и структуры должны быть только статическими
...
Рейтинг: 0 / 0
14.12.2016, 11:05
    #39366493
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cтруктура на С++
nik_xMasterZivпропущено...


В современном С++ с указателями практически не нужно работать, если ты конечно не пишешь какой-то
драйвер устройства или библиотеку.
Во как! А я то и не знал! И все по старинке, с указателями... Прана, классы и структуры должны быть только статическими


ну, учись, развивайся...
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Cтруктура на С++ / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]