Need to replace the stream functions with other, simpler. Need to replace getchar, cin.putback

Write your question here.

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 <stdio.h>
#include <iostream>
using namespace std;// чтобы не писать std::
float number(){ // считываем число
	int res = 0;
	for (;;)//бесконечный цикл
	{
		char c = getchar();//записываем
		if (c >= '0' && c <= '9')//условие, что используются только цифры
			res = res *10 + c - '0';//для корректной записи числа
		else {
			cin.putback(c);// возвращает символ назад в поток
			break;//прерываем
		}
		
	}
	return res;//возвращаем результат

}

float plmn();//чтобы компилятор увидел функцию в фактор

float skobki() {//скобки

	char c = getchar();
	if (c == '(') {
		float x = plmn();
		getchar();
		return x;
	}
	else {//если не число,то
		cin.putback(c);//возвращаем символ
		return number();
	}
}

float factor() { // функция деления и умножения
	float x =skobki();
	for (;;) {
		char c = getchar();
	
		switch (c) {
		case '*': // если умножение
			x *= skobki();
			break;
		case '/': // если деление 
			x /= skobki();
			break;
		default: //если неизвестный символ, то возвращаем в поток
			cin.putback(c);// возвращаем символ назад 
			return x;//возвращаем результат
		}
	}
}
float plmn() { // функция сложения и вычитания
	float x = factor();
	for (;;) {
		char c = getchar();

		switch (c) {
		case '+': // если сложение
			x += factor();
			break;
		case '-': // если вычитание
			x -= factor();
			break;
		default: //если неизвестный символ, то возвращаем в поток
			cin.putback(c);// возвращаем символ назад 
			return x; //возвращаем результат
		}
	}
}

int main()
{
	float r = plmn();//вызов функций по порядку
	printf("Result= %0.3f", r);//результат
}
Hello xidiot,

Your answer here.
1
2
3
4
5
6
7
8
                                        







When I run your program I am looking at a screen that resembles the above. I have no idea what to do or what might need to be entered. A prompt with an example would help.

If this is a C++ program the "float"s should be "doubles", but "float"s could work.


You have given no information what the program should do, what it is doing or what you expect from the program.

Given the lines:
1
2
#include <stdio.h>   // <--- In a C++ program this should be "cstdio".
#include <iostream> 

I can not tell what type of program this should be. The last line of "main" do not help either.

Andy
You shouldn't mix C++ and C I/O. Here is a version that uses C++ I/O only. Is this what you're asking about? I replaced getchar() with cin.get() and printf() with cout <<
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
#include <iostream>
using namespace std;// чтобы не писать std::
float number(){ // считываем число
	int res = 0;
	for (;;)//бесконечный цикл
	{
		char c = cin.get();//записываем
		if (c >= '0' && c <= '9')//условие, что используются только цифры
			res = res *10 + c - '0';//для корректной записи числа
		else {
			cin.putback(c);// возвращает символ назад в поток
			break;//прерываем
		}
		
	}
	return res;//возвращаем результат

}

float plmn();//чтобы компилятор увидел функцию в фактор

float skobki() {//скобки

	char c = cin.get();
	if (c == '(') {
		float x = plmn();
		cin.get();
		return x;
	}
	else {//если не число,то
		cin.putback(c);//возвращаем символ
		return number();
	}
}

float factor() { // функция деления и умножения
	float x =skobki();
	for (;;) {
		char c = cin.get();
	
		switch (c) {
		case '*': // если умножение
			x *= skobki();
			break;
		case '/': // если деление 
			x /= skobki();
			break;
		default: //если неизвестный символ, то возвращаем в поток
			cin.putback(c);// возвращаем символ назад 
			return x;//возвращаем результат
		}
	}
}
float plmn() { // функция сложения и вычитания
	float x = factor();
	for (;;) {
		char c = cin.get();

		switch (c) {
		case '+': // если сложение
			x += factor();
			break;
		case '-': // если вычитание
			x -= factor();
			break;
		default: //если неизвестный символ, то возвращаем в поток
			cin.putback(c);// возвращаем символ назад 
			return x; //возвращаем результат
		}
	}
}

int main()
{
	float r = plmn();//вызов функций по порядку
	cout << "Result= " << r << '\n';
}

I realized that just at the university we should program in c i / o, but I didn’t even know what it is called, thanks for the help)
No problem. I know it's frustrating when you need to do something but don't know the terminology.

Okay, in your original program, replace cin.putback(c) with ungetc(c, stdin). Also, remove #include <iostream> and change #include <stdio.h> to the modern form: #include <cstdio>
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 <cstdio>

using namespace std;// чтобы не писать std::
float number(){ // считываем число
	int res = 0;
	for (;;)//бесконечный цикл
	{
		char c = getchar();//записываем
		if (c >= '0' && c <= '9')//условие, что используются только цифры
			res = res *10 + c - '0';//для корректной записи числа
		else {
			ungetc(c, stdin);// возвращает символ назад в поток
			break;//прерываем
		}
		
	}
	return res;//возвращаем результат

}

float plmn();//чтобы компилятор увидел функцию в фактор

float skobki() {//скобки

	char c = getchar();
	if (c == '(') {
		float x = plmn();
		getchar();
		return x;
	}
	else {//если не число,то
		ungetc(c, stdin);//возвращаем символ
		return number();
	}
}

float factor() { // функция деления и умножения
	float x =skobki();
	for (;;) {
		char c = getchar();
	
		switch (c) {
		case '*': // если умножение
			x *= skobki();
			break;
		case '/': // если деление 
			x /= skobki();
			break;
		default: //если неизвестный символ, то возвращаем в поток
			ungetc(c, stdin);// возвращаем символ назад 
			return x;//возвращаем результат
		}
	}
}
float plmn() { // функция сложения и вычитания
	float x = factor();
	for (;;) {
		char c = getchar();

		switch (c) {
		case '+': // если сложение
			x += factor();
			break;
		case '-': // если вычитание
			x -= factor();
			break;
		default: //если неизвестный символ, то возвращаем в поток
			ungetc(c, stdin);// возвращаем символ назад 
			return x; //возвращаем результат
		}
	}
}

int main()
{
	float r = plmn();//вызов функций по порядку
	printf("Result= %0.3f", r);//результат
}

(18+4*5)/(10+3*3)
Result= 2.000

I'd also suggest that you change "#include <cstdio>" to "#include stdio.h", remove the using statement, and actually compile this with a C compiler.

it may be worth looking at whether a peek/remove approach is better than a remove, look, put back approach.
ty boys!!
Topic archived. No new replies allowed.