Форум программистов
 
О проблемах с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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


Ответ
 
Опции темы
Старый 28.06.2011, 13:18   #1
Fllyber
 
Регистрация: 28.06.2011
Сообщений: 3
По умолчанию Задача С++ с использованием unsigned int

Здравствуйте, я изучаю язык с++ первый семестр и че то как нам объясняют до меня не очень доходит Дали задачи на практику 2 сделал, а вот с 3ей возникли проблемы. Так как я хочу научиться сам решать эти задачи, не прошу вас решить ее, а прошу о помощи подсказать с чего начать, что требуется итд. По мере выполнения показывал бы что получается=)

вот задача:
Написать функцию, преобразующую вводимую с клавиатуры строку цифр в натуральное число. Функция должна:
- возвращать значение введённого числа;
– игнорировать попытки ввода символов, отличных от цифр;
– выдавать сообщение об ошибке при попытке ввода числа, превышающего допустимое значение типа unsigned int.
Fllyber вне форума Ответить с цитированием
Старый 28.06.2011, 13:49   #2
Jaguar83
Профессионал
Пользователь
 
Аватар для Jaguar83
 
Регистрация: 25.05.2011
Сообщений: 91
По умолчанию

1. Организовать цикл, в котором каждый символ введенной строки проверяется, является ли он цифрой.
2. Создать массив символов, который будет содержать "отфильтрованные" цифры.
3. Преобразовать сформированный массив символов в число.
4. Проверить, умещается ли число в unsigned int, если нет - вывести предупреждение
5. Возвратить результат функции.
Помог? Будь человеком - жми на весы слева!
Jaguar83 вне форума Ответить с цитированием
Старый 28.06.2011, 13:57   #3
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,503
По умолчанию

Для перевода из строки в число вроде есть стандартные функции atoi для int и atof для float.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 28.06.2011, 13:58   #4
Mandrivnyk
Software Developer
Участник клуба
 
Аватар для Mandrivnyk
 
Регистрация: 01.03.2011
Сообщений: 1,098
По умолчанию

Цитата:
Сообщение от Jaguar83 Посмотреть сообщение
1. Организовать цикл, в котором каждый символ введенной строки проверяется, является ли он цифрой.
2. Создать массив символов, который будет содержать "отфильтрованные" цифры.
3. Преобразовать сформированный массив символов в число.
4. Проверить, умещается ли число в unsigned int, если нет - вывести предупреждение
5. Возвратить результат функции.
Проще считывать сразу в строку и уже с ней работать.
Кстати, и проверку "умещения" через сравнение строк сделать элементарно -)
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв.
Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062
Mandrivnyk вне форума Ответить с цитированием
Старый 30.06.2011, 10:50   #5
Fllyber
 
Регистрация: 28.06.2011
Сообщений: 3
По умолчанию

// 1.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include <conio.h>
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{int a[20], n, i;
cout<<"vvedi chislo peremennih n:";
cin>>n;
for(i=0; i<n; i++)
{
cin>>a[i];
if ((a[i]>='0') && (a[i]<='9'))
{
cout<<a[i]<<endl;
}
else
{
if((a[i]='.') || (a[i]='-'))
{
cout<<"oshibka"<<endl;
}
else;
}
}
getch();
return 0;
}


подскажите, что делать. чет даже цикл не могу сделать.
Fllyber вне форума Ответить с цитированием
Старый 30.06.2011, 12:07   #6
Nedward
Пользователь
 
Регистрация: 26.06.2011
Сообщений: 85
По умолчанию

Цитата:
Сообщение от Fllyber Посмотреть сообщение
#include "stdafx.h"
#include <conio.h>
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{int a[20], n, i;
cout<<"vvedi chislo peremennih n:";
cin>>n;
for(i=0; i<n; i++)
{
cin>>a[i];
if ((a[i]>='0') && (a[i]<='9'))
{
cout<<a[i]<<endl;
}
else
{
if((a[i]='.') || (a[i]='-'))
{
cout<<"oshibka"<<endl;
}
else;
}
}
getch();
return 0;
}
Можно вопрос, а что вообще должна делать эта программа? Я правильно понял, что Вы решили заставить пользователя вводить число по одной цифре?

Вот код, думаю это идеальная защита "от дурака"
Код:
#include <iostream>
#include <locale>
using namespace std;

int main()
{
	setlocale(LC_ALL, "Russian");
	string s; //Ввод от пользователя
	unsigned long n; //Число, которое ввел пользователь
	bool all_ok = true;
	do
	{
		cout<<"Введите Ваше число:";
		cin >> s;
		cout << "Вы ввели:\"" << s << "\"" << endl;
		
		//Пытаемся преобразовать строку в число
		char *c=NULL; //Указатель на первый символ, который не удалось распознать
		n = strtoul(s.c_str(),&c,0);
		if ((*c)!=NULL)
		{
			cout << "Из-за символа \"" << *c << "\" невозможно преобразовать введенную Вами строку в число." << endl
				<< "Попробуйте еще раз" << endl;
			all_ok=false;
		}
		else
			//Теперь проверяем - возможно число быль слишком большим?
			if ((n == ULONG_MAX) && errno == ERANGE)
			{
				cout << "Ваше число не влезло в переменную типа \"unsigned long\"" << endl
					<< "Попробуйте еще раз" << endl;
				all_ok=false;
			}
			else
				all_ok=true; //Если все проверки прошли удачно - все в порядке!

	} while (!all_ok); //Требуем от пользователя ввести корректное число, пока он не сдасться и не введет :)
	cout << "Ваще число равно " << n << endl;
	return 0;
}
Всегда пишите код так, будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете. (c) Martin Golding

Последний раз редактировалось Nedward; 30.06.2011 в 12:09.
Nedward вне форума Ответить с цитированием
Старый 30.06.2011, 12:52   #7
Fllyber
 
Регистрация: 28.06.2011
Сообщений: 3
По умолчанию

Nedward, с вами можно как то связаться?)
Fllyber вне форума Ответить с цитированием
Старый 30.06.2011, 14:45   #8
Nedward
Пользователь
 
Регистрация: 26.06.2011
Сообщений: 85
По умолчанию

Цитата:
Сообщение от Fllyber Посмотреть сообщение
Nedward, с вами можно как то связаться?)
Можно, связывайтесь
Личные сообщения здесь, вроде-бы работают. Хотя я не проверял.
Всегда пишите код так, будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете. (c) Martin Golding
Nedward вне форума Ответить с цитированием
Старый 01.07.2011, 19:41   #9
Alkagolik
Пользователь
 
Аватар для Alkagolik
 
Регистрация: 02.08.2009
Сообщений: 77
По умолчанию

Понравилась задача. Учитывая что я очень редко работал с символьными данными решил попробовать. Вот реализация
Код:
#include <iostream>
#include <math.h>
//Программа съест любую строку с любыми символами
//и все символы кроме цифр проигнорирует
//проверит на соответствие типу unsignet int на уровне символьного массива
//В случае несоответствия типу unsignet int перевод из сиволов в числа
//проводиться не будет
//Единственное что не смог сообразить это ввод массива через цикл методов std::cin
//Пришлось подключить std::gets()

long long CHAR_TO_INT (char tmp[], double RAZRYAD);
double RAZRYADNOST(char tmp[]);
bool Check (char tmp[], double RAZRYAD);

unsigned short const MAX_RAZR = 10;

int main ()
{
	long long Itogovoe_Chislo = 0;
	double RAZR;
	char String[100];
	do{
		std::gets(String);
		RAZR = RAZRYADNOST(&String[0]);
		if (Check (&String[0], RAZR)==true){
			Itogovoe_Chislo = CHAR_TO_INT (&String[0], RAZR);
			std::cout << Itogovoe_Chislo;
		}
		else std::cout << "Sory, but you wrong!"<<std::endl;
	} while (Check (&String[0], RAZR)==false);
	return 0;
}
// конвертация символов в цифры
// игнорирует все символы кроме цифр (с отрицательными и float числами играйтесь сами)
long long CHAR_TO_INT (char tmp[], double RAZRYAD)
{
	int i=0;
	long long chislo=0, bufer=0;
	--RAZRYAD;
	while (tmp[i]!='\0'){
		if ((tmp[i]>48)&&(tmp[i]<57)){
			char tmp_1 = tmp[i];
			bufer = atoi(&tmp_1) * pow(10.0, RAZRYAD);
			chislo += bufer;
			--RAZRYAD;
		}
		i++;
	}
	return chislo;
}
// подсчет цифр в массиве символов. вспомогательная функция
double RAZRYADNOST(char tmp[])
{
	int i=0, RAZRYAD=0;
	while(tmp[i]!='\0'){
		if ((tmp[i]>48)&&(tmp[i]<57))
			RAZRYAD++;
		i++;
	}
	return RAZRYAD;
}
// Проверка на соответствие unsigned int
bool Check (char tmp[], double RAZRYAD)
{
	if (RAZRYAD > MAX_RAZR) return false;
	else if (RAZRYAD < MAX_RAZR) return true;
	else
	{
		int j=0, i=0;
		char *mass;
		while(tmp[i]!='\0'){
			if ((tmp[i]>48)&&(tmp[i]<57)){
				++j;
				mass = new char [j+1];
			}
		}
		j=0;
		while(tmp[i]!='\0'){
			if ((tmp[i]>48)&&(tmp[i]<57)){
				mass[j]=tmp[i];
				mass[j+1]='\0';
			}
		}
		if (mass[MAX_RAZR-10]>52) return false;
		else if (mass[MAX_RAZR-9]>50) return false;
		else if (mass[MAX_RAZR-7]>52) return false;
		else if (mass[MAX_RAZR-5]>54) return false;
		else if (mass[MAX_RAZR-4]>55) return false;
		else if (mass[MAX_RAZR-3]>50) return false;
		else if (mass[MAX_RAZR-1]>53) return false;
		else return true;
	}
}
Alkagolik вне форума Ответить с цитированием
Старый 02.07.2011, 23:38   #10
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Alkagolik Посмотреть сообщение
Понравилась задача. Учитывая что я очень редко работал с символьными данными решил попробовать. Вот реализация
Кошмар Почему разрядность типа double? Почему проверка > 48 < 57 строгая? atoi переводит строку в число, а не отдельный символ. В этот раз вам повезло, потому что из-за выравнивания за переданным в эту ф-цию байтом следовали нули, но ведь нет гарантии. Да и это как микроскопом гвозди забивать, когда можно всего-то отнять то самое число 48. И зачем в цикле кучу раз выделяете память, и не освобождаете перед тем, как потерять на неё указатель? И вообще, что за безумная ф-ция Check? И, если уж совсем придираться, то для чего у функции, которая гарантированно вернёт значение, не превышающее максимального unsinged int, тип long long? В общем, странная реализация, не рекомендую её ТС, ибо ошибок слишком много.
netrino вне форума Ответить с цитированием
Ответ
Купить рекламу на форуме 20000 рублей в месяц
Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Для типов данных char, short, int, long с квалификаторами signed, unsigned составить программу, которая, listiksasha Фриланс 4 21.02.2011 12:26
Для типов данных char, short, int, long с квалификаторами signed, unsigned составить программу, которая, listiksasha Помощь студентам 2 20.02.2011 12:57
Есть необходимость использовать unsigned int. Нужен ваш опыт. Karyuzin Общие вопросы по Java, Java SE, Kotlin 1 14.12.2010 07:44
int vs unsigned int Kn793 Общие вопросы C/C++ 13 28.08.2010 21:00
[РЕШЕНО][C] unsigned int аргумент работает как signed Sfuller Общие вопросы C/C++ 2 30.06.2010 17:17


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS