Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на C / C++


РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты по данной тематике

Коцюрбенко Алексей aka Жерар
Статус: Советник
Рейтинг: 1736
∙ повысить рейтинг »
Асмик Гаряка
Статус: Советник
Рейтинг: 32
∙ повысить рейтинг »
CradleA
Статус: Специалист
Рейтинг: 0
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / C/C++

Номер выпуска:1819
Дата выхода:22.12.2015, 11:21
Администратор рассылки:F®ost (Администратор)
Подписчиков / экспертов:15 / 13
Вопросов / ответов:1 / 1

Консультация # 188407: Здравствуйте! У меня возникли сложности с таким вопросом: Я работаю с программой code blocks для програмирования на языке си. мне нужно написать программу в которую вводились бы два любых числа и если произведение последних цифр данных чисел будут больше 50 то программа должна выдать "1" если произведение будет меньше 50 то программа д...

Консультация # 188407:

Здравствуйте! У меня возникли сложности с таким вопросом:
Я работаю с программой code blocks для програмирования на языке си. мне нужно написать программу в которую вводились бы два любых числа и если произведение последних цифр данных чисел будут больше 50 то программа должна выдать "1" если произведение будет меньше 50 то программа должна выдать"0". сделать это нужно с поможью логических выражений( && || !). я написала данную программу для чисел int, а что если числа будут float? вот моя программа:
#include<stdio.h>
void main (void)
{

int a,b,c;
printf("enter two numbers\n");
scanf("%d %d",&a,&b);
c=(a%10)*(b%10);
c=!(c<=50);
printf("the resuilt is %d",c);



}

Дата отправки: 11.12.2015, 15:30
Вопрос задал: nana-1992 (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Лысков Игорь Витальевич (Старший модератор):

Здравствуйте, nana-1992!
Задачу можно решать разными способами.
Предлагаю следующее:
Ввод строки сделано посимвольно, с проверкой на допустимые коды
Далее, идет разбор введенной строки с проверкой на синтаксис
Ну и выводится результат сравнения.

Код :
#include <stdio.h>
#include <conio.h>
 
//Функция ввода числовой строки
// Разрешены пробелы, точка и цифры
// Для вытирания знаков используется Backspace
// Ввод заканчивается Enter-ом
// Параметры: адрес буфера и длина буфера, включая завершающий 0
void GetNumStr(char *pstr, int len)
{
	int		i = 0;
	bool	fContinue = true;
	char	ch;

	while(fContinue)				//вводим, пока true
	{
		switch(ch = _getch())		//ждем символ с консоли
		{
			case 0x0d:				//Enter - завершение ввода
				pstr[i] = 0;		//закрываем строку нулем
				putch((char)'\n');	//на экране переходим на новую строку
				fContinue = false;	//выходим из цикла while
				break;
			case 0x08:				//Backspace - вытираем последний символ
				if (i==0)
					break;			//при условии, если что-то есть
				else
				{
					i--;			//уменьшаем индекс
					putch(ch);		//08 - вернемся на 1 позицию назад
					ch = ' ';		//выведем пробел
					putch(ch);
					ch = 0x08;		//и еще раз вернемся назад, т.к. break отсутствует,
				}					// то отработается putch, который дальше
			case ' ':
			case '.':
			case '0':
			case '1':				//разрешенные символы
			case '2':
			case '3':
			case '4':
			case '5':
			case '6':
			case '7':
			case '8':
			case '9':
				if (i<len-1)		//сначала проверим, не переполнен ли буфер?
				{
					putch(ch);		//на экран
					pstr[i++] = ch;	//и в буфер
				}
		}
	}
}

//функция ищет в строке последние цифры для двух чисел
//одновременно проверяет правильность формата
bool GetLastDigits(char *pstr, char *pnum1, char *pnum2)
{
	bool fSelect = true;			//true/false - обрабатывается первое/второе число 
	bool fNum1 = false;				//true/false - найдена/не найдена хотя бы одна цифра первого числа 
	bool fPoint1 = false;			//true/false - найдена/не найдена точка первого числа
	bool fNum2 = false;				//true/false - найдена/не найдена хотя бы одна цифра второго числа
	bool fPoint2 = false;			//true/false - найдена/не найдена точка второго числа
	int  i;
	
	for(i=0; pstr[i]; i++)
	{
		if (fSelect)				//какое обрабатываем число?
		{
			switch (pstr[i])		//первое
			{
				case ' ':
					if (fNum1)		//если есть цифры, то завершаем обработку первого числа
					{				//найдем последнюю цифру
						if(pstr[i-1] != '.')		//если число не заканчивается точкой
							*pnum1 = pstr[i-1]&0x0f;//то берем последнюю цифру, сделав число 0-9
						else
							*pnum1 = pstr[i-2]&0x0f;//иначе - предпоследнюю
						fSelect = false;			//готовы к обработке второго числа
					}
					break;
				case '.':
					if (fPoint1)					//точка допустима только одна
						return false;				//уже была - ошибка!
					fPoint1 = true;					//помечаем
					break;
				default:
					fNum1 = true;	//есть цифра
			}
		}
		else						//второе число
		{
			switch (pstr[i])
			{
				case ' ':			//по пробелу завершаем второе число
					if (fNum2)		//если есть цифры, то завершаем обработку второго числа
					{				//найдем последнюю цифру
						if(pstr[i-1] != '.')
							*pnum2 = pstr[i-1]&0x0f;	//аналогично первому
						else
							*pnum2 = pstr[i-2]&0x0f;
						return true;					//обе цифры найдены, успешно завершаемся
					}
					break;
				case '.':
					if (fPoint2)
						return false;					//проверим точку
					fPoint2 = true;
					break;
				default:
					fNum2 = true;	//есть цифраво втором числе
			}
		}
	}
	if (fNum2)	//прошли всю строку, пробелов в конце нет
	{			//второе число есть
		if(pstr[i-1] != '.')
			*pnum2 = pstr[i-1]&0x0f;					//найдем последнюю цифру
		else
			*pnum2 = pstr[i-2]&0x0f;
		return true;									//успешно завершаемся
	}
	else
		return false;				//как минимум, нет второго числа! Ошибка!
}

void main (void)
{
	char	str[128];
	bool	fOk;
	char	num1, num2;

	do
	{
		printf("\nEnter two numbers: ");

		GetNumStr(str, 128);					//вводим строку	
		
		fOk = GetLastDigits(str, &num1, &num2);	//проверяем на синтаксис и получаем две последние цифры
	}while (!fOk);

	printf("\nResult = %d\n", (num1*num2)>50);	//выводим результат сравнения условия (1 или 0)

	_getch();
}

Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 20.12.2015, 04:29
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка  |  восстановить логин/пароль

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!


В избранное