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

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

Код: 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
Cтруктура на С++
    #39364040
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Avatangqaпомогите решить проблему.
Пошаговая отладка тебе поможет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Cтруктура на С++
    #39364148
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот тут:

Код: 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
Cтруктура на С++
    #39364151
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и такая вот:

Код: 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
Cтруктура на С++
    #39364157
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivНу и такая вот:

организация структуры хранения оценок -- это на 2 балла (неуд).
почему, может итнститут в индии :) там на 5 :)
...
Рейтинг: 0 / 0
Cтруктура на С++
    #39364184
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivПредставь себе, что надо хранить не 4 оценки, а 100 оценок...
Не следует множить сущности без необходимости - говорил старик Оккам ))
...
Рейтинг: 0 / 0
Cтруктура на С++
    #39364263
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Cтруктура на С++
    #39365220
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пётр Седов, клевый ответ

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

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

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


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

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


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


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


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


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