![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() ![]() |
![]() |
Rocket |
![]()
Сообщение
#1
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация: ![]() ![]() ![]() |
С помощью разбора строки, вводимой с клавиатуры создать калькулятор, вычисляющий простейшие выражения типа: "1 + 7 - 3 * 2 =" результатом такого выражения будет 10 (приоритет операций не учитывается). Использовать только функци strtok. В дальнейшем модифицировать калькулятор так, чтобы он разбирал строки "1+7-3*2=", т.е. знаки операций искать с помощью strpbrk.
Пока я только разбиваю строку на фрагменты:
#include<stdio.h>
#include<string.h>
#include<conio.h>
int main()
{
char s[255];
char *p;
int i;
clrscr();
fgets(s,254,stdin);
i=0;
p=strtok(s,"+,-,*,/");
while(p)
{
printf("%d : %s\n",i,p);
i++;
p=strtok(NULL,"+,-,*,/");
}
return 0;
}
Вопрос в том, как получать сами числа в выражении и знаки операций? |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Так?
#include<stdio.h>
#include<string.h>
#include<conio.h>
int main(){
char s[255];
char *p, *temp;
int i, len;
// clrscr();
fgets(s,254,stdin);
temp = strdup(s);
len = i = 0;
p = strtok(temp,"+-*/=");
while(p && *p != '\n') {
len += strlen(p);
printf("%d : %3d; sign : %c\n",i++, atoi(p), s[len++]);
p = strtok(NULL,"+-*/=");
}
free(temp);
return 0;
}
atoi(p) дает тебе число, хранящееся в p, а s с заданным индексом - знак операции...(запятая не нужна в строке для strtok - только сами символы) |
Rocket |
![]()
Сообщение
#3
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация: ![]() ![]() ![]() |
А как тогда произвести вычисление заданного выражения? Числа переводим с помощью atoi(p), а со знаками операций как поступать?
|
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
Например, так:
#include<stdio.h>
#include<string.h>
#include<conio.h>
int main(){
char s[255];
char *p, *temp, sign;
int i, len;
float result;
// clrscr();
fgets(s,254,stdin);
temp = strdup(s);
len = i = 0;
result = 0; sign = '\0';
p = strtok(temp,"+-*/=");
while(p && *p != '\n') {
len += strlen(p);
switch(sign) {
case '\0':
result = atoi(p); break;
case '+':
result += atoi(p); break;
case '-':
result -= atoi(p); break;
case '*':
result *= atoi(p); break;
case '/':
result /= atoi(p); break;
}
printf("%d : %3d; sign : %c\n",i++, atoi(p), (sign = s[len++]));
p = strtok(NULL,"+-*/=");
}
free(temp);
printf("\nresult = %5.2f\n", result);
return 0;
}
|
Rocket |
![]()
Сообщение
#5
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация: ![]() ![]() ![]() |
Например, так: #include<stdio.h>
#include<string.h>
#include<conio.h>
int main(){
char s[255];
char *p, *temp, sign;
int i, len;
float result;
// clrscr();
fgets(s,254,stdin);
temp = strdup(s);
len = i = 0;
result = 0; sign = '\0';
p = strtok(temp,"+-*/=");
while(p && *p != '\n') {
len += strlen(p);
switch(sign) {
case '\0':
result = atoi(p); break;
case '+':
result += atoi(p); break;
case '-':
result -= atoi(p); break;
case '*':
result *= atoi(p); break;
case '/':
result /= atoi(p); break;
}
printf("%d : %3d; sign : %c\n",i++, atoi(p), (sign = s[len++]));
p = strtok(NULL,"+-*/=");
}
free(temp);
printf("\nresult = %5.2f\n", result);
return 0;
}
Круто! Спасибо за помощь! |
Rocket |
![]()
Сообщение
#6
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация: ![]() ![]() ![]() |
А как модифицировать программу с помощью strpbrk, не используя strtok?
Сообщение отредактировано: Rocket - 3.12.2007 11:46 |
volvo |
![]()
Сообщение
#7
|
Гость ![]() |
Вот так:
#include<stdio.h>
#include<string.h>
#include<conio.h>
int main(){
char s[255];
char *p, *temp, sign;
int val;
float result;
// clrscr();
fgets(s,254,stdin);
temp = p = s;
// i = 0;
result = 0; sign = '\0';
while(p && *p != '\n') {
p = strpbrk(temp,"+-*/=");
switch(sign) {
case '\0':
sscanf(temp, "%d", &val);
result = val;
break;
case '+':
sscanf(temp, "%d", &val);
result += val; break;
case '-':
sscanf(temp, "%d", &val);
result -= val; break;
case '*':
sscanf(temp, "%d", &val);
result *= val; break;
case '/':
sscanf(temp, "%d", &val);
result /= val; break;
}
sign = *p++;
temp = p;
}
printf("\nresult = %5.2f\n", result);
return 0;
}
|
Rocket |
![]()
Сообщение
#8
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация: ![]() ![]() ![]() |
|
volvo |
![]()
Сообщение
#9
|
Гость ![]() |
Чтение числа из строки мы реализуем...
|
![]() ![]() |
![]() |
Текстовая версия | 28.07.2025 11:40 |