Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Kris_
1 / 1 / 3
Регистрация: 09.11.2014
Сообщений: 64
1

Прекращена работа программы

17.08.2018, 17:35. Просмотров 1016. Ответов 11

Как можна переделать это код, чтобы испоьзовать классы, а не функции стандартного ввода-вывода?

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
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
#include<iomanip>
#include <cstdlib>
#define N 3
 
using namespace std;
 
class church {
    char *name;
    char school;
    unsigned int count;
    float square;
public:
    void set(char *a, char b, unsigned int c, float d);
    void get(char *a, char &b, unsigned int &c, float &d);
    void show(void);
};
void church::set(char *a, char b, unsigned int c, float d) {
    strcpy(name, a);
    school = b;
    count = c;
    square = d;
}
void church::get (char *a, char &b, unsigned int &c, float &d){
    delete[] a;
    a = new char[strlen(name) + 1];
    strcpy(a, name);
    b = school;
    c = count;
    d = square;
}
void church::show(void) {
    cout << name << " ";
    cout << school << " ";
    cout << count << " ";
    cout << square << " ";
}
int main(void) {
    setlocale(LC_ALL, "Russian");
    char *n = 0;
    char t;
    unsigned int s;
    float h;
    short i;
    church obj[N];
    system("cls");
    cout << "Работа функции SET!\n";
    for (i = 0; i < N; i++) {
        cout << "Название, Школа, Количество монахов, Площадь земли: \n";
        cin >> n;
        cin >> t;
        cin >> s;
        cin >> h;
        obj[i].set(n, t, s, h);
    }
    cout << "Работа функции Show!\n";
    cout << "Название, Школа, Количество монахов, Площадь земли: \n";
    for (i = 0; i < N; i++) {
        obj[i].show();
        cout << "\n";
    }
    cout << "Работа функции GET и SHOW!\n";
    cout << "Название, Школа, Количество монахов, Площадь земли: \n";
    for (i = 0; i < N; i++) {
        obj[i].get(n, t, s, h);
        obj[i].show();
        cout << "\n";
    }
    delete[] n;
    return 0;
};
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.08.2018, 17:35
Ответы с готовыми решениями:

Прекращена работа программы
Здравствуйте)) У меня возникла такая вот проблема: мне задали написать программу,которая...

Прекращена работа программы
Написал программу. Суть в следующем - создаешь ее ярлык с заданными параметрами и при запуске с...

Прекращена работа программы с++
Помогите . #include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;iterator&gt; using namespace std;...

Прекращена работа программы
Всем доброго времени суток, и с Наступившим! Мне было дано задание составить блок-схему алгоритма...

11
Kris_
1 / 1 / 3
Регистрация: 09.11.2014
Сообщений: 64
17.08.2018, 17:44  [ТС] 2
Когда запускаю программу и ввожу первые значения, нажимаю ентер, то програма завершает свою работу по какой-то причине. Что не так? Почему так происходит?
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
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
#include<iomanip>
#include <cstdlib>
#define N 3
 
using namespace std;
 
class church {
    char *name;
    char school;
    unsigned int count;
    float square;
public:
    void set(char *a, char b, unsigned int c, float d);
    void get(char *a, char &b, unsigned int &c, float &d);
    void show(void);
};
void church::set(char *a, char b, unsigned int c, float d) {
    strcpy(name, a);
    school = b;
    count = c;
    square = d;
}
void church::get (char *a, char &b, unsigned int &c, float &d){
    delete[] a;
    a = new char[strlen(name) + 1];
    strcpy(a, name);
    b = school;
    c = count;
    d = square;
}
void church::show(void) {
    cout << name << " ";
    cout << school << " ";
    cout << count << " ";
    cout << square << " ";
}
int main(void) {
    setlocale(LC_ALL, "Russian");
    char *n = 0;
    char t;
    unsigned int s;
    float h;
    short i;
    church obj[N];
    system("cls");
    cout << "Работа функции SET!\n";
    for (i = 0; i < N; i++) {
        cout << "Название, Школа, Количество монахов, Площадь земли: \n";
        cin >> n;
        cin >> t;
        cin >> s;
        cin >> h;
        obj[i].set(n, t, s, h);
    }
    cout << "Работа функции Show!\n";
    cout << "Название, Школа, Количество монахов, Площадь земли: \n";
    for (i = 0; i < N; i++) {
        obj[i].show();
        cout << "\n";
    }
    cout << "Работа функции GET и SHOW!\n";
    cout << "Название, Школа, Количество монахов, Площадь земли: \n";
    for (i = 0; i < N; i++) {
        obj[i].get(n, t, s, h);
        obj[i].show();
        cout << "\n";
    }
    delete[] n;
    return 0;
};
0
zss
Модератор
Эксперт С++
9271 / 8005 / 4914
Регистрация: 18.12.2011
Сообщений: 21,348
Завершенные тесты: 1
17.08.2018, 17:50 3
Лучший ответ Сообщение было отмечено Kris_ как решение

Решение

Цитата Сообщение от Kris_ Посмотреть сообщение
char *name;
Это указатель, а не строка
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
#include <iostream>
#include <string>
//#include <conio.h>
//#include<stdlib.h>
//#include<cstring>
//#include<stdio.h>
//#include<iomanip>
//#include <cstdlib>
 
using namespace std;
 
class church {
    string name;
    char school;
    unsigned int count;
    float square;
public:
    void set(string a, char b, unsigned int c, float d);
    void get(string& a, char &b, unsigned int &c, float &d);
    void show(void);
};
void church::set(string a, char b, unsigned int c, float d) {
    name=a;
    school = b;
    count = c;
    square = d;
}
void church::get(string& a, char &b, unsigned int &c, float &d) {
    a = name;
    b = school;
    c = count;
    d = square;
}
void church::show(void) {
    cout << name << " ";
    cout << school << " ";
    cout << count << " ";
    cout << square << " ";
}
int main(void) {
    setlocale(LC_ALL, "Russian");
    string n;
    char t;
    unsigned int s;
    float h;
    short i;
    const int N = 3;
    church obj[N];
    system("cls");
    cout << "Работа функции SET!\n";
    for (i = 0; i < N; i++) {
        cout << "Название, Школа, Количество монахов, Площадь земли: \n";
        cin >> n;
        cin >> t;
        cin >> s;
        cin >> h;
        obj[i].set(n, t, s, h);
    }
    cout << "Работа функции Show!\n";
    cout << "Название, Школа, Количество монахов, Площадь земли: \n";
    for (i = 0; i < N; i++) {
        obj[i].show();
        cout << "\n";
    }
    cout << "Работа функции GET и SHOW!\n";
    cout << "Название, Школа, Количество монахов, Площадь земли: \n";
    for (i = 0; i < N; i++) {
        obj[i].get(n, t, s, h);
          cout << n << " ";
          cout << t << " ";
          cout << s << " ";
          cout << h << endl;
        obj[i].show();
        cout << "\n";
    }
    system("pause");
    return 0;
};
1
Kuzia domovenok
3012 / 2556 / 665
Регистрация: 25.03.2012
Сообщений: 9,131
Записей в блоге: 1
Завершенные тесты: 1
17.08.2018, 17:51 4
используйте std::string вместо char
указатели конечно очень полезно знать и даже иногда применять на практике, но не для хранения строк в стиле СИ. И особенно если это что-то сложнее примерчика на 20 строк, посвящённому этим указателям.
Как только прога превращается во что-то сложнее примерчика на 20 строк, посвящённому этим указателям, программист чисто физически не сможет постоянно уделять внимание вопросам выделения, копирования и освобождения памяти под каждую из множества строк в своей программе.
используйте std::string вместо char
0
Kris_
1 / 1 / 3
Регистрация: 09.11.2014
Сообщений: 64
17.08.2018, 17:53  [ТС] 5
Тогда вместо char *name; использовать string name;?
0
Kuzia domovenok
3012 / 2556 / 665
Регистрация: 25.03.2012
Сообщений: 9,131
Записей в блоге: 1
Завершенные тесты: 1
17.08.2018, 18:11 6
ну конкретно в твоём примере, ошибку можно было б исправить введением
C++
1
2
    delete[] a;
    a = new char[strlen(name) + 1];
в метод set
C++
1
2
3
4
5
6
7
int main(void) {
    setlocale(LC_ALL, "Russian");
    char *n = new char[100];
    char t;
    unsigned int s;
    float h;
    short i;
в объявлении переменных для ввода

а также
C++
1
2
cin.getline(n, 100);//cin >> n;
        cin >> t;
при вводе переменных

Добавлено через 1 минуту
это если говорить о частностях, но в общем и целом использовать string вместо char это просто очень хорошая практика, с которой этих ошибок бы не было in the first place

Добавлено через 3 минуты
З.Ы, тут геттер вообще никакой роли не играет
C++
1
2
obj[i].get(n, t, s, h);
        obj[i].show();
З.З.Ы, если бы даже играл, вся выделенная строка так и осталась бы внутри геттера, ибо в отличие от остальных b c d объявлена без &
C++
1
2
void church::get(char& *a, char &b, unsigned int &c, float &d) {
    a = new char[strlen(name) + 1];
0
Kris_
1 / 1 / 3
Регистрация: 09.11.2014
Сообщений: 64
17.08.2018, 18:13  [ТС] 7
Не знаю всё ли исправила, но всё же не работает правильно
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
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
#include<iomanip>
#include <cstdlib>
#define N 3
 
using namespace std;
 
class church {
    char *name;
    char school;
    unsigned int count;
    float square;
public:
    void set(char *a, char b, unsigned int c, float d);
    void get(char *a, char &b, unsigned int &c, float &d);
    void show(void);
};
void church::set(char *a, char b, unsigned int c, float d) {
    strcpy(name, a);
    school = b;
    count = c;
    square = d;
}
void church::get (char *a, char &b, unsigned int &c, float &d){
    delete[] a;
    a = new char[strlen(name) + 1];
    strcpy(a, name);
    b = school;
    c = count;
    d = square;
}
void church::show(void) {
    cout << name << " ";
    cout << school << " ";
    cout << count << " ";
    cout << square << " ";
}
int main(void) {
    setlocale(LC_ALL, "Russian");
    char *n = new char[100];
    char t;
    unsigned int s;
    float h;
    short i;
    church obj[N];
    system("cls");
    cout << "Работа функции SET!\n";
    for (i = 0; i < N; i++) {
        cout << "Название, Школа, Количество монахов, Площадь земли: \n";
        cin.getline(n, 100);//cin >> n;
        cin >> t;
        cin >> n;
        cin >> t;
        cin >> s;
        cin >> h;
        obj[i].set(n, t, s, h);
    }
    cout << "Работа функции Show!\n";
    cout << "Название, Школа, Количество монахов, Площадь земли: \n";
    for (i = 0; i < N; i++) {
        obj[i].show();
        cout << "\n";
    }
    cout << "Работа функции GET и SHOW!\n";
    cout << "Название, Школа, Количество монахов, Площадь земли: \n";
    for (i = 0; i < N; i++) {
        obj[i].get(n, t, s, h);
        obj[i].show();
        cout << "\n";
    }
    delete[] n;
    return 0;
};
0
Kuzia domovenok
3012 / 2556 / 665
Регистрация: 25.03.2012
Сообщений: 9,131
Записей в блоге: 1
Завершенные тесты: 1
17.08.2018, 18:24 8
Цитата Сообщение от Kris_ Посмотреть сообщение
cin.getline(n, 100);//cin >> n; cin >> t; cin >> n; cin >> t; cin >> s; cin >> h;
[del]
0
zss
Модератор
Эксперт С++
9271 / 8005 / 4914
Регистрация: 18.12.2011
Сообщений: 21,348
Завершенные тесты: 1
17.08.2018, 18:52 9
Kris_, чем же Вам не угодил мой вариант?
0
Kris_
1 / 1 / 3
Регистрация: 09.11.2014
Сообщений: 64
17.08.2018, 20:49  [ТС] 10
Угодил полностью, спасибо вам большое! Просто при попытках разобраться прибавилось моих ошибок. Теперь всё понятно и всё работает)

Добавлено через 3 минуты
А как лучше переделать это с использованием классов вместо стандартных функций ввода/вывода? Не совсем понимаю как подойти к этому заданию.
0
zss
Модератор
Эксперт С++
9271 / 8005 / 4914
Регистрация: 18.12.2011
Сообщений: 21,348
Завершенные тесты: 1
18.08.2018, 06:52 11
Перегрузите операции потокового ввода-вывода
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
friend ostream& operator<<(ostream& out,church& c) {
    out << c.name << " ";
    out << c.school << " ";
    out << c.count << " ";
    out << c.square << " ";
    return out;
}
friend istream& operator>>(istream& out,church& c) {
   in.getline(c.name, 100);
   in >> c.school >>c.count >>c.square;
   in.get();// дабы не оставлять \n в потоке ввода
   return in;
}
0
Kris_
1 / 1 / 3
Регистрация: 09.11.2014
Сообщений: 64
21.08.2018, 17:19  [ТС] 12
Это должно быть вместо существующего ввода/вывода?
0
21.08.2018, 17:19
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.08.2018, 17:19

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Прекращена работа программы
#include &lt;iostream&gt; #include &lt;string&gt; #include &lt;conio.h&gt; #include &lt;windows.h&gt; #include...

Прекращена работа программы
#include &lt;iostream&gt; #include &lt;stdlib.h&gt; #include &lt;math.h&gt; #include &lt;stdio.h&gt; #include &lt;iomanip&gt;...

Прекращена работа программы
Написал следующую программу на visual c++ express 2010: #include &lt;iostream&gt; using namespace std;...

Прекращена работа программы
При запуске консольного приложения выскакивает окно, где говорится о том, что прекращена работа...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

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