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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.07.2011, 01:35   #11
Alkagolik
Пользователь
 
Аватар для Alkagolik
 
Регистрация: 03.08.2009
Сообщений: 77
По умолчанию

За замечания , функция pow() в качестве аргумента степени принимает только double, и остальные функции просто не поменял, они же тоже не за присест все написались, забыл. Вот где серьезное упущение, это "> 48 < 57" и new char[]. Ну короче, я сначала решил одну функцию писать, потом подумал и решил что две... ну потом еще одну надумал. экспромт родил неразберихи
P.S. дождался критики наконец-то.

Вот про atoi немного подробней можно? и как лучше переводить char в int?

Последний раз редактировалось Alkagolik; 03.07.2011 в 01:47.
Alkagolik вне форума Ответить с цитированием
Старый 03.07.2011, 07:10   #12
An1ka
C++,DirectX/OpenGL
Форумчанин
 
Регистрация: 09.01.2011
Сообщений: 422
По умолчанию

Цитата:
Сообщение от Alkagolik Посмотреть сообщение
и как лучше переводить char в int?
Своими функциями лучше =)
Код:
// Целое число в строку
char* IntToCharPtr ( int value) {
	static char buffer [12] = {0};
	char *buf = buffer+10;
	int negative =1;
	if ( value < 0) negative =-1;
	do {
	*buf-- = (value % 10) * negative + '0';
	} while ( value/=10 );
	if ( negative == -1) *buf-- = '-';
	return ++buf;
}
// Строку в целое число
int CharPtrToInt ( char* str)
{
	char *end = str;
	str += strlen( str) -1;
	int negative =1, n =1, result =0;
	if ( *end == '-') { negative =-1; end++; }
	do {
	result += (*str - '0') * n * negative;
	n *= 10;
	} while ( str-- != end);
	return result;
}

Последний раз редактировалось An1ka; 03.07.2011 в 07:12.
An1ka вне форума Ответить с цитированием
Старый 03.07.2011, 14:59   #13
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Alkagolik Посмотреть сообщение
Вот про atoi немного подробней можно? и как лучше переводить char в int?
atoi переводит строку в int. То есть она проходится по массиву символов до терминирующего нуля. Передавая в неё единственный символ, а не C-строку, вы рискуете получить неверные данные. А получить из символьного представления цифры целочисленное можно просто отняв от него 48, или, что лучше, символ '0' (как это можно увидеть в посте An1ka). Правда нет смысле писать собственный аналог ф-ции atoi
netrino вне форума Ответить с цитированием
Старый 03.07.2011, 16:30   #14
Alkagolik
Пользователь
 
Аватар для Alkagolik
 
Регистрация: 03.08.2009
Сообщений: 77
По умолчанию

В результате конструктивной критики код приобрел следующий вид
Код:
unsigned int CHAR_TO_INT (char tmp[], double RAZRYAD);
double RAZRYADNOST(char tmp[]);
bool Check (char tmp[]);

unsigned short const MAX_RAZR = 10;
unsigned short const CHAR_CONST = 100;

int main ()
{
	unsigned int Itogovoe_Chislo = 0, k=0;
	double RAZR;
	char *String=new char [CHAR_CONST];
	do{
		std::gets(String);
		RAZR = RAZRYADNOST(&String[0]);
		if (Check (&String[0])){
			Itogovoe_Chislo = CHAR_TO_INT (&String[0], RAZR);
			std::cout << "Your count is: ";
			std::cout << Itogovoe_Chislo;
		}
		else{
			std::cout << "Sory, but you wrong!\n";
			delete []String;
			String = new char [CHAR_CONST];
			std::cout << "Enter a new string: ";
		}
	} while (!Check (&String[0]));
	delete []String;
	return 0;
}
// конвертация символов в цифры
// игнорирует все символы кроме цифр (с отрицательными и float числами играйтесь сами)
unsigned int CHAR_TO_INT (char tmp[], double RAZRYAD)
{
	int i=0;
	unsigned int chislo=0, bufer=0;
	--RAZRYAD;
	while (tmp[i]!='\0'){
		if ((tmp[i]>=48)&&(57>=tmp[i])){
			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)&&(57>=tmp[i]))
			RAZRYAD++;
		i++;
	}
	return RAZRYAD;
}
// Проверка на соответствие unsigned int
bool Check (char tmp[])
{
	int j=0, i=0;
	char *mass=new char[CHAR_CONST];
	// заполнение массива
	while(tmp[i]!='\0'){
		if ((tmp[i]>=48)&&(57>=tmp[i])){
			mass[j]=tmp[i];
			mass[j+1]='\0';
			++j;
		}
		++i;
	}
	j=0;
	// приведение записей вида 000023 к виду 23
	while(mass[j]!='\0'){
		if (mass[0]==48){
			i=0;
			do{
				mass[i]=mass[i+1];
				++i;
			} while (mass[i]!='\0');
			j=0;
		}
		else ++j;
	}
	//проверка на соответствие unsigned int
	if (MAX_RAZR<j) return false;
	else if (MAX_RAZR>j) return true;
	else{
		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;
	}
	delete []mass;
	delete mass;
}
Alkagolik вне форума Ответить с цитированием
Старый 03.07.2011, 17:52   #15
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Alkagolik Посмотреть сообщение
В результате конструктивной критики код приобрел следующий вид
И всё таки ваша ф-ция Check просто монструозна
Код:
bool check(const char* str) {
  // skip leading zeroes
  while (*str == '0' && *str != '\0')
    str++;

  for (int i = 0; str[i] != '\0'; i++)
    if (!isdigit(str[i])) // if (!('0' <= str[i] && str[i] <= '9'))
      return false;

  if ((strlen(str) > 10) || (strcmp(str, "4294967295") > 0))
    return false;

  return true;
}
А преобразование в unsigned int можно было сделать так:
Код:
unsigned int convert_to_uint(const char* str) {
  unsigned int result = 0;
  unsigned int multiplier = 1;

  for (int i = strlen(str) - 1; i >= 0; i--) {
    result += (str[i] - '0') * multiplier;
    multiplier *= 10;
  }

  return result;
}
Тогда ф-ция RAZRYADNOST вообще не нужна.

Последний раз редактировалось netrino; 03.07.2011 в 17:55.
netrino вне форума Ответить с цитированием
Старый 03.07.2011, 20:48   #16
An1ka
C++,DirectX/OpenGL
Форумчанин
 
Регистрация: 09.01.2011
Сообщений: 422
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
Правда нет смысле писать собственный аналог ф-ции atoi
Почему это нету. Если хочется "свой велосипед" ?? К тому же, я так понимаю, это задания ТС. Плюс у меня функция еще считает отрицательные числа. Да и на atoi компиляторы ругаться любят.
An1ka вне форума Ответить с цитированием
Старый 03.07.2011, 21:09   #17
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от An1ka Посмотреть сообщение
Почему это нету. Если хочется "свой велосипед" ??
Ну с этим не поспоришь) В контексте этой задачи, надо было, а вообще нет, так как всё равно сложно будет сделать лучше. Да и отрицательные числа здесь тоже не нужны были, unsigned int же.
На atoi ругается? Не путаете с нестандартной itoa?
netrino вне форума Ответить с цитированием
Старый 04.07.2011, 08:49   #18
An1ka
C++,DirectX/OpenGL
Форумчанин
 
Регистрация: 09.01.2011
Сообщений: 422
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
Да и отрицательные числа здесь тоже не нужны были, unsigned int же.
Отрицательные числа это ведь бесплатный бонус ! Достаточно переименовать тип int в unsigned int и вуаля будут только положительные целые =)

Цитата:
Сообщение от netrino Посмотреть сообщение
На atoi ругается? Не путаете с нестандартной itoa?
Не знаю, но у меня обе реализованы, так что уж точно не будет
An1ka вне форума Ответить с цитированием
Старый 04.07.2011, 14:21   #19
Alkagolik
Пользователь
 
Аватар для Alkagolik
 
Регистрация: 03.08.2009
Сообщений: 77
По умолчанию

Цитата:
А преобразование в unsigned int можно было сделать так:
Не работает. проверил так
Код:
int main ()
{
	char str[]="h21hj423";
	int result=0, tmp=1;
	for (int i = strlen(str)-1; i>=0; i--)
	{
		result+= (str[i]-'0')*tmp;
		tmp*=10;
	}
	std::cout << result;
	return 0;
}
Результат = 562718423
Вот так работает
Код:
int main ()
{
	char str[]="h21hj423";
	int result=0, tmp=1;
	for (int i = strlen(str)-1; i>=0; i--)
	{
		if((str[i]>=48)&&(57>=str[i]))
		{
			result+= (str[i]-'0')*tmp;
			tmp*=10;
		}
	}
	std::cout << result;
	return 0;
}
Alkagolik вне форума Ответить с цитированием
Старый 04.07.2011, 18:11   #20
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Alkagolik Посмотреть сообщение
Не работает. проверил так
Код:
int main ()
{
	char str[]="h21hj423";
	int result=0, tmp=1;
	for (int i = strlen(str)-1; i>=0; i--)
	{
		result+= (str[i]-'0')*tmp;
		tmp*=10;
	}
	std::cout << result;
	return 0;
}
Цитата:
Код:
char str[]="h21hj423";
Как ни странно, но она работает только для чисел
Ф-ция check удостоверяется, что в строку записано корректное число, без букв и прочего. Если по заданию нужно было разбирать и такие строки, как вы привели, то тогда да - работать не будет, и check, в моей реализации, тогда тоже неверен)
netrino вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Для типов данных 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 22:00
[РЕШЕНО][C] unsigned int аргумент работает как signed Sfuller Общие вопросы C/C++ 2 30.06.2010 18:17