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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.05.2017, 09:22   #11
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Да, я её уже смотрел, но ведь там еще точку надо пропустить кроме цифр.
KAMLS вне форума Ответить с цитированием
Старый 08.05.2017, 09:28   #12
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Код:
isdigit(ch) || isточка(ch)
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 08.05.2017, 10:29   #13
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Вот при такой компоновке кода компилятор ошибок не показывает. Но при исполнении выдаёт ошибку.
Код:
#include<iostream>
#include<conio.h>
#include<cstdlib>
#include<math.h>
#include<iomanip>
using namespace std;
class money
{
private:
	int a;
	long double summa;
	char str [23];
public:
	money (): summa(0), a(0)
	{}
	long double mstold()
	{
		char str1[23];
		cout<<"Введите денежную строку: \n";
		cin.get(str1, 23);
		for(int j=0; j<23; j++)
		{
			if ( isdigit (str1[j])==1 || str1[j]=='.') // если перые символы строки str - число
			{
				str[a]=str1[j];
				a++;
			}
			
		}
		str[a]='\0';
		long double summa=atof(str);
		return summa;	
	}
};
int main()
{
	setlocale(LC_ALL,"rus");
	long double b;
	money m1;
	b=m1.mstold();
	cout<<setiosflags(ios::fixed)
		<<setiosflags(ios::showpoint)
		<<setprecision(2)
		<<b;
	getch();
	return 0;
}
Подскажите пожалуйста что не так?
KAMLS вне форума Ответить с цитированием
Старый 08.05.2017, 10:33   #14
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Так какую ошибку-то?

И == 1 не надо.
Во-первых в С/С++ и так можно писать if (1), if (2), if (!0) и т.п. вместо if (true)
Во-вторых isdigit возвращает "A value different from zero" когда цифра. Это не обязательно 1.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 08.05.2017, 11:09   #15
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Если вам не трудно, попытайтесь запустить программу у себя. скриншот ошибки прикреплен.
Изображения
Тип файла: jpg кадр_7.jpg (78.7 Кб, 126 просмотров)
KAMLS вне форума Ответить с цитированием
Старый 08.05.2017, 11:26   #16
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Да должно работать по идее, ну только ==1 убрать, иначе результат может быть неправильным.
http://rextester.com/JAQA86161

Наверно вы что-то странное вводите/передаете, добавьте вывод str1[j] перед проверкой.

UPD: а, так а зачем цикл до 23? Надо до strlen.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 08.05.2017, 15:07   #17
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Да, с циклом согласен, но 23 это от начала да так и осталось, тут за идею борьба идет))
Скопировал ваш код, в отдельной программе его построил и запустил, работает. Только содержимое массива сделал $333.34
Выводит 333.34 т.е. как задумано.
Скорректировал свою программу, т.е. сделал копию вашей, выводит
333.00
Почему - ваще не втыкаю!!!
Полная копия! Только мне getch(); ставить приходится, иначе ничего увидеть не успеваю.
А вот когда программа не скорректирована, т.е. когда надо вводить то же самое $333.34 выдает показанную ошибку. т.е. компилятор молчит, а ошибка вылетает в процессе исполнения.
Такие дела.
Код:
#include<iostream>
#include<conio.h>
#include<cstdlib>
#include<math.h>
#include<iomanip>
using namespace std;
class money
{
private:
	int a;
	long double summa;
	char str [23];
public:
	money (): summa(0), a(0)
	{}
	long double mstold()
	{
		char str1[23]="$333.34";
		for(int j=0; j<23; j++)
		{
			if ( isdigit (str1[j]) || str1[j]=='.') // если перые символы строки str - число
			{
				str[a]=str1[j];
				a++;
			}
			
		}
		str[a]='\0';
		long double summa=atof(str);
		return summa;	
	}
};
int main()
{
	setlocale(LC_ALL,"rus");
	long double b;
	money m1;
	b=m1.mstold();
	cout<<setiosflags(ios::fixed)
		<<setiosflags(ios::showpoint)
		<<setprecision(2)
		<<b;
	getch();
	return 0;
}
Вот моя скорректированная программа, которая вместо 333.34 выдает 333.00
А в не скорректированной ==1 убрал, толку нет также. Может VS 2088 барахлит?

Последний раз редактировалось KAMLS; 08.05.2017 в 15:09. Причина: опечатка
KAMLS вне форума Ответить с цитированием
Старый 08.05.2017, 15:20   #18
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Такие странные дела..
Убрал в своей скорректированной программе setlocale(LC_ALL,"rus");
и стало срабатывать как надо 333.34!!!
При чем тут setlocale(LC_ALL,"rus");?!!
KAMLS вне форума Ответить с цитированием
Старый 08.05.2017, 15:22   #19
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Так я ж сказал почему. Цикл идет дальше конца нормального содержимого строки и читает всякий мусор, на который срабатывает какая-то отладочная проверка корректности переданного символа внутри isdigit.

А при
Код:
char str1[23]="$333.34";
вроде нулями заполнается все остальное.
как и при
Код:
int arr[23] = { 41, 42 };
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 08.05.2017 в 15:25.
Alex11223 вне форума Ответить с цитированием
Старый 08.05.2017, 15:25   #20
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Переделал j<23 на j<strlen(str1) и стало работать с вводом значения а не с установленным в программе.
Но осталась блин проблема с setlocale(LC_ALL,"rus"); пишет .00 вместо .34
Подскажите пожалуйста почему?
KAMLS вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Копирование значений ячеек из одной строки в другую ольгаг Microsoft Office Excel 1 19.12.2016 10:47
умножение одной матрицы на другую (выводить не только ответ, но и ход решения) Delphi или C++ carrie bradshaw Помощь студентам 0 29.04.2014 00:20
Переход с одной строки на другую в DBF сканировании danxiel Помощь студентам 2 04.09.2012 14:15
MS SQL SERVER 2005 копирование таблицы из ОДНОЙ БД В другую или перенести все строки из одной таблицы в другую reihtmonbern БД в Delphi 4 17.07.2012 23:25
Перенос данных из строки одной таблицы БД в другую БД Optigood БД в Delphi 15 12.05.2010 17:07