Тема: Помилка у програмі студент.

#include  <stdio.h>
#include <iostream>
#include <string>
using namespace std;
class student
{
    char* name = new char[100];
    int* mark = new int[5];
    int average = 0;
public:
    student()
    {
        for (int i = 0; i < 5; i++) {
            mark[i] = 0;
        }
    }
    void fill()
    {
        cout << "Enter name: ";
        (cin >> name).get();
        cin.clear();                                                             //  тут видає помилку
        
        cout << "Enter marks: " << endl;
        for (int i = 0; i < 5; i++) {
            cout << "Enter " << i + 1 << " mark: ";
            cin >> mark[i];
        }
        int temp_product = 0;
        for (int i = 0; i < 5; i++) {
            temp_product += mark[i];
        }
        average = temp_product / 5;
    }
    void print()
    {
        cout << "Students name: " << name << endl << "His/her marks: " << endl;
        for (int i = 0; i < 5; i++)
        {
            cout << mark[i] << endl;
        }
        cout << "Average: " << average << endl;
    }
    ~student() {
        cout << "Data deleted. Program compiled normally";
    }
};

class group {
    char* gname = new char[100];
    int num;
    student* students = new student[num];
public:
    group(int temp) {
    gname == ("No group name!!");
        num = temp;
    }
    void fil()
    {
        cout << "Enter group 1 name: ";
        (cin >> gname).get(); 
        cin.clear();
    
        for (int i = 0; i < num; i++) {
            cout << "Enter student " << i + 1 << " data" << endl;
            students[i].fill();
        }
    }
    void print() {
        for (int i = 0; i < num; i++) {
            cout << "Student " << i + 1 << " info" << endl;
            students[i].print();
        }
    }
};
int main() {
    group group1(4);
    group group2(5);
    group1.fil();
    group1.print();
    group2.fil();
    group2.print();
       system("pause");
    return 0;
}

        _Ch    122 'z'    char
        _Meta    122    int
        _Str    0xfdfdfdfd <Error reading characters of string.>    char *


Visual Studio 2017

2

Re: Помилка у програмі студент.

Мені трохи дивно, що аж туди дістається, але добре, може і там впасти. Ви хочете про це поговорити? Краще почитайте підручник, бо проблем тут багато, і повний їхній опис потягне якраз на пару розділів підручника.

Подякували: Lvivjanin19741

3

Re: Помилка у програмі студент.

Класи повинні бути називані з великої літери.
Захват пам'яті повинен бути в конструкторі
Вивільнення - в деструкторі.
Не обов'язково пхати усе в класи

4

Re: Помилка у програмі студент.

koala написав:

Мені трохи дивно, що аж туди дістається, але добре, може і там впасти. Ви хочете про це поговорити? Краще почитайте підручник, бо проблем тут багато, і повний їхній опис потягне якраз на пару розділів підручника.

кі роздили якого підручника читати?

5

Re: Помилка у програмі студент.

ur_naz написав:

Класи повинні бути називані з великої літери.
Захват пам'яті повинен бути в конструкторі
Вивільнення - в деструкторі.
Не обов'язково пхати усе в класи

навколо та біля, а конструктивніше?

6

Re: Помилка у програмі студент.

Lvivjanin1974 написав:
koala написав:

Мені трохи дивно, що аж туди дістається, але добре, може і там впасти. Ви хочете про це поговорити? Краще почитайте підручник, бо проблем тут багато, і повний їхній опис потягне якраз на пару розділів підручника.

кі роздили якого підручника читати?

The C++ Programming Language, 4th Edition
C++ Primer (5th Edition)
Які розділи? Всі підряд.

7 Востаннє редагувалося koala (25.12.2019 22:56:36)

Re: Помилка у програмі студент.

Lvivjanin1974 написав:

кі роздили якого підручника читати?

Вашого підручника, за яким ви навчаєтеся. Ті, що описують усе те, що ви застосовуєте - щонайменше від стрічок char * до порядку ініціалізації елементів екземплярів класу, а швидше за все, від самого початку.

Lvivjanin1974 написав:

а конструктивніше?

Конструктивніше - то конструктивніше. Розумієте, програмний код не може бути сам по собі - ну тобто, звісно, може, але тоді в ньому не буде сенсу; код має реалізовувати певне завдання, і говорити про помилки в коді можна лише порівнюючи те, що робить код, із цим завданням. Це - найглибші основи, це має бути якщо не в передмові, то в першому розділі будь-якого підручника. Ви маєте завдання і можете порівнювати код із ним; але нас ви вирішили у це завдання не втаємничувати. Чому? Я припускаю, що просто для економії власного часу - вам, бачте, довго витрачати в гіршому разі 5 хвилин на набирання завдання (а може, це й просте Ctrl+C-Ctrl+V). Але, розумієте, якщо не принципи чемності, то принаймні загальні міркування про рівність усіх людських осіб вимагають, щоб ми ставилися до вас приблизно так само, як і ви до нас. Тут вам не на 5 хвилин пояснень треба, тут помилка на помилці; але вам же шкода на нас 5 хвилин витратити - то й від нас ви навряд чи дочекаєтеся чогось кращого за пораду читати підручника.

Подякували: Lvivjanin19741

8

Re: Помилка у програмі студент.

навколо та біля, а конструктивніше?

це конкретні вказівки. Хтось не дуже розумний, або з кривим наміром навчив вас неподобству, а ви як макака, усе копіюєте...
навіть

int average = 0;

// ось дуже спрощена декларація класу предмет
struct Subject {
 char* Name;
 int AverageValue;
   Subject (const char*_name, int _value) {
       Name = new char[255];
       strcpy(Name, _name);
       AverageValue = _value;
   }
   ~Subject() {
      delete[] Name;
  }
}

це щоб обдумати, що ти не так робиш

9

Re: Помилка у програмі студент.

ur_naz, що ж ви дитину поганому вчите. А як там буде більш ніж 254 символи? Звісно, можна через strlen:

name_ = new char[strlen(name)+1];
strcpy(name_, name);

Але цей функціонал вбудований в string, і ним і слід користуватися всюди, крім критичних місць, це прибирає потребу в більшості деструкторів.
Ну і про назви змінних - чого це у вас члени класу з великої літери?

10

Re: Помилка у програмі студент.

якби в мене були приватні поля, я б так і назвав би їх. але ж вони публічні. тому повинні про це повідомити.
щодо пам'яті. так її забагато не буває, завтра ваш студент прийде і повідомить, що помилився і вам треба буде просити нову пам'ять у ОС, а може вона не тої ноги встала і не дасть... ну, ок, я помилився і треба було просити 256.

11 Востаннє редагувалося wander (26.12.2019 13:36:50)

Re: Помилка у програмі студент.

ur_naz, ви наркоман чи може мазохіст?
Такий-то код писати та пропонувати новачкові, і чому воно має навчитися?

1)

char* Name;

Ммм, використання сирих вказівників, ви схоже Мейерса зовсім не читали? Інакше, знали б, що стандартна бібліотека надає хороший (не ідеальний звісно) інструмент у вигляді "Розумних вказівників" для керування пам'яттю. Ба більше, тут ідеально підходить std::string, який був створений спеціально для роботи з символьними даними:

The class template basic_string stores and manipulates sequences of char-like objects, which are non-array objects of trivial standard-layout type.

Що мішає цим скористатися? Це явно краще, ніж ваша жалюгідна спроба зімітувати роботу std::string.

2)

const char*_name, int _value

Це вроді вже б мали проходити?

http://eel.is/c++draft/lex.name#3 написав:

In addition, some identifiers are reserved for use by C++ implementations and shall not be used otherwise; no diagnostic is required.

  • Each identifier that contains a double underscore __ or begins with an underscore followed by an uppercase letter is reserved to the implementation for any use.

  • Each identifier that begins with an underscore is reserved to the implementation for use as a name in the global namespace.

3)

Name = new char[255];

Незнаю, може ви не вкурсі були?

http://eel.is/c++draft/expr.new#9.6.2 написав:

If the expression is erroneous after converting to std::size_t:

  • if the expression is a core constant expression, the program is ill-formed;

  • otherwise, an allocation function is not called; instead

    • if the allocation function that would have been called has a non-throwing exception specification, the value of the new-expression is the null pointer value of the required result type;

    • otherwise, the new-expression terminates by throwing an exception of a type that would match a handler of type std::bad_array_new_length.

А ловити виключення хто буде? Т. Г. Шевченко? Дуже круто буде впасти в std::terminate.

4)

strcpy(Name, _name);

Оу, цікаво, а ви знаєте наскільки небезпечною є ця функція і скільки проблем вона може вам, як розробнику принести? Будь-який хацкер буде вдячним за те, що ви її написали, проте, чи було так задумано?)

5)
Ну, і до решти, ви про списки ініціалізації конструкторів чули? Тут мені навіть ліньки пояснювати чому його варто використовувати, бо тоді міні статтю можна написати  :D

P.S. - і що, якщо сервер впаде? Ви про це подумали? Знову пропунуєте nonscalable код в 2019?

Подякували: koala1

12 Востаннє редагувалося ur_naz (26.12.2019 17:04:22)

Re: Помилка у програмі студент.

1) Згоден, але погляньте на перший пост...
Все iнше виссане з пальця

13

Re: Помилка у програмі студент.

ur_naz написав:

Все iнше виссане з пальця

Виссане?
Це елементарні речі, які проходять у будь-якій книжці для початківців і трішки "близько"-продакшн практики.
Скажу одразу, співбесіди ви б не пройшли з таким кодом.

14

Re: Помилка у програмі студент.

а ви проводите співбесіди? тоді мені вас жаль

15

Re: Помилка у програмі студент.

Та тут непотрібно і вміти співбесіди проводити, якщо у вас на 5 рядків коду 10 помилок *JOKINGLY*

16

Re: Помилка у програмі студент.

не робіть з себе ідіота. ваші придирки обумовлені вашою заздрістю. і якщо в вас руки не з того місця ростуть, щоб користуватись вказівниками, пишіть на сішарпі. на хабрі є дуже повчальна статя як випікати хліб... але ж ви вочевидь кацапською не читаєте, тож варитесь у власному соку. спустіться на землю, тут вам не продакшн, тут навчальний рівень.

До речи, вам не и спадало на думку, що всі ваші ексепшини і безпечні вказівники лише прикривають вашу недбалість?

17

Re: Помилка у програмі студент.

Пане ur_naz, ви кумедні.
Пане adziri, досить його вже тролити, він більше наркоманами не обзивається.

Подякували: wander1

18

Re: Помилка у програмі студент.

koala написав:

Пане ur_naz, ви кумедні.
Пане adziri, досить його вже тролити, він більше наркоманами не обзивається.

Гаразд, я вже зрозумів, що там, як кажуть об стіну горохом)

19

Re: Помилка у програмі студент.

ur_naz написав:

До речи, вам не и спадало на думку, що всі ваші ексепшини і безпечні вказівники лише прикривають вашу недбалість?

А вам не спадало на думку, що все структрне програмування, функції та назви змінних теж лише прикривають недбалість? Лише машинні коди! Лише числові адреси! Лише goto! Лише хардкор!

20

Re: Помилка у програмі студент.

структурне програмування з'явилось, коли вас ще в проекти не було.   і якщо на то пішло, то більшість навіть не здогадується як працюють додатки на рівні машинних кодів. ви ж кидаєтесь тим що, не знаєте