Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.11.2009, 18:57   #1
alexobenikov
Пользователь
 
Регистрация: 19.11.2009
Сообщений: 15
По умолчанию Вопрос по строкам / задача "матричный калькулятор"

Здравствуйте - подкинули мне тут задачку - написать "матричный калькулятор", то есть
Вводишь: 2 квадратные матрицы А и В , далее вводишь какое-нибудь произвольное выражение из серии 4*А+5*(В/А-8)
Должно вывести: "ответную" матрицу

Уже сделал все операции для матриц,так же сделал функцию перевода int в матричную форму,более менее придумал сам алгоритмом...


Так вот решая столкнулся с проблемой - Как мне в строке определить что это за символ передо мной - число( int ) , или знак , или Буква?
(
пока вижу только такой вариант - если а[i] не char А и не char В и не знак (пробел + - * / ( ) - то тогда инт - но я не знаю как эт оформить может if (все это) a[i]=perevod_int_v_matrix(a[i])
)

и второй вопрос правильный ли подход нахождения скобок:

Код:
char* poisk_otkr_skobki (char n[],int dlinna)
{
	for (int i=strlen(n);i>0;i--)
	{
		if ( n.a[i]=='(' )
		{
			char *p_otkr_skobka;
			p_otkr_skobka=&n.a[i];
			return p_otkr_skobka;
		}
		else return 0;
	}
}
char* poisk_zakr_skobki (char n[],int dlinna)
{
	for (int i=0;i<strlen(n);i++)
		if ( n.a[i]==')' )
		{
			char *p_zakr_skobka;
			p_zakr_skobka=&n.a[i];
			return p_zakr_skobka;
		}
		else return 0;
}
PS пишу ,как видите, на обычном С
+ начинающий

Последний раз редактировалось Sazary; 19.11.2009 в 20:35.
alexobenikov вне форума Ответить с цитированием
Старый 19.11.2009, 19:29   #2
nazavrik
Форумчанин
 
Аватар для nazavrik
 
Регистрация: 01.09.2008
Сообщений: 178
По умолчанию

Недавно обсуждался примерно такой же вопрос. Если точно не знаешь как будет выглядеть выражение, то лучше организовать посимвольную проверку выражения

Код:
//считываешь символ - ch

// функция int isalpha(ch) - проверяет, является ли ch - буквой,

if(isalpha(ch)!=0)
//значит буква

//функция int isdigit(ch) - проверяет, является ли ch - цифрой,

if(isdigit(ch)!=0)
//значит цмфра

//иначе ch - знак

switch(ch)
{
     case '+': ... break;
     case '-': ... break;
     case '*': ... break;
}
Быть радикальным - значит понять вещь в её корне. К.Маркс
nazavrik вне форума Ответить с цитированием
Старый 19.11.2009, 19:56   #3
alexobenikov
Пользователь
 
Регистрация: 19.11.2009
Сообщений: 15
По умолчанию

Да , но мне не понятно как быть с приоритетом операции
ведь тут не 2 элемента и например если такой пример 2+2*2 - то должно вывести 6 , а выведет 8 , хотя... ладно тут я понял.
А не могли бы вы написать функцию isalpha или isdigit
alexobenikov вне форума Ответить с цитированием
Старый 19.11.2009, 20:29   #4
nazavrik
Форумчанин
 
Аватар для nazavrik
 
Регистрация: 01.09.2008
Сообщений: 178
По умолчанию

Цитата:
А не могли бы вы написать функцию isalpha или isdigit
Они все описаны в <ctype.h>.

Могу посоветовать посмотреть реализацию калькулятора, которую предлагает Страуструп здесь.
Быть радикальным - значит понять вещь в её корне. К.Маркс
nazavrik вне форума Ответить с цитированием
Старый 19.11.2009, 20:38   #5
alexobenikov
Пользователь
 
Регистрация: 19.11.2009
Сообщений: 15
По умолчанию

Спасибо, а глупый вопрос - как они в реале будут выглядеть , видишь ли у нас препод запрещает пользоваться всевозможными функциями вплоть до strlen пока не напишешь такую же сам...

PS спасибо
alexobenikov вне форума Ответить с цитированием
Старый 19.11.2009, 21:26   #6
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

Код:
char _isdigit(char x)
{
     if( x >= '0' && x <= '9' )
           return 1;
    return 0;

char _isalpha(char x)
{
     if(( x > 'a' && x < 'z' ) || ( x >=  'A' && x <= 'Z'))
           return 1;
    return 0;
}

Последний раз редактировалось NiCola999; 19.11.2009 в 21:57.
NiCola999 вне форума Ответить с цитированием
Старый 19.11.2009, 22:51   #7
alexobenikov
Пользователь
 
Регистрация: 19.11.2009
Сообщений: 15
По умолчанию

но тогда вопрос - а как быть с двузначными числами?
или что писать
if( isdigit(a[i-1])!=0 && isdigit(a[i])!=0)
наше число = a[i-1]*10+a[i]
или я что-то не понимаю?
alexobenikov вне форума Ответить с цитированием
Старый 19.11.2009, 23:30   #8
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

у тебя же выражение представляет собой строку. Строка это массив символов

например выражение

"10+5=15"

будет представлять собой массив
'1','0','+','5','=','1','5'

в твоем случае придется проверять каждый символ в цикле
преобразовать символ в число можно функцией atoi(char);
NiCola999 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04
Считывание строк из файла. перемещение по строкам "веред"-"назад" Larkin. Помощь студентам 2 15.06.2009 17:58
"Калькулятор в Delphi" в теоретические аспекты??? jenja Общие вопросы Delphi 1 25.05.2008 23:23
"Транспортная задача", "Поиск решения" Perroman Microsoft Office Excel 3 12.12.2007 17:12