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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.02.2009, 21:14   #1
Wi1D
Кибернетик
Форумчанин
 
Аватар для Wi1D
 
Регистрация: 22.10.2008
Сообщений: 142
Восклицание строковое выражение числа должно быть переведено в вещественный тип

Кто знает помогите
Вот задание:
Составить процедуру по корректному посимвольному вводу вещественных чисел (общая длина числа ограничена некоторым значением Lmax). Введенное строковое выражение числа должно быть переведено в вещественный тип. Допускается использовать следующие клавиши:
цифры, точка, знак минус,
Esc (отказ от ввода),
Enter (ввод числа – перевод его в вещественный тип),
BackSpace (или ← - “забой” предыдущей цифры)
Вот я написал процедуру ввода строки...
Код:
Program chuCJla;
 uses CRT;
 const
	Lmax=10;
 var
	znak:char;
	s:string;
	lp,j,i:byte;
	c,t:integer;
	r:real;
 procedure BBoD(var s:string;var lp:byte;var znak:char);
	var
	l:byte;
	ch:char;
	 begin
	 s:='';
	 l:=1;
	 Writeln('Max CuMBoJloB= ',lmax);
	 Writeln('BBoDuTe BMeCTe Co 3HAKOM');
	 Writeln('BBeduTe KoJlu4eCTBo CuMBoJloB.3Hak u Pa3DeJluTeJl - TO}l{e c4uTaTb');
	 readln(lp);
		if lp>lmax then Writeln('CJluLLlKoM DJluHHoe 4uCJlo')
		else
			begin
			 Writeln('BBeDuTe ',l,' CuMBoJl 4uCJlA,T.E 3HAK');
			 readln(znak);
			 insert(znak,s,length(s)+1);
			for l:=2 to lp do
			 begin
				Writeln('BBeDuTe ',l,' CuMBoJl 4uCJlA');
				readln(ch);
				insert(ch,s,length(s)+1);
			 end;
			end;
		end;
Begin
 ClrScr;
 BBoD(s,lp,znak);
{ЧТО ДАЛЬШЕ ДЕЛАТЬ?????}
 Val(s,c,t);
 readln;
End.
А вот что дольше делать со строкой не понимаю...
ПРобывал через десятки...идея показалась слишком обширной...
кто подскажет?
не существует идеальных программ...и людей тоже..
<== P.S. если я тебе помог нажми весы слева <==
Wi1D вне форума Ответить с цитированием
Старый 08.02.2009, 21:47   #2
pomoshnic
Форумчанин
 
Аватар для pomoshnic
 
Регистрация: 16.11.2008
Сообщений: 192
По умолчанию

Через процедуру val
pomoshnic вне форума Ответить с цитированием
Старый 08.02.2009, 21:51   #3
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Находим в строке "." (или какой там разделитель дроби), всё, что слева - целая часть, её получаем через Val. Правая часть - дробная. Её получить можно так: посимвольно просматриваем строку с конца, аккумулятор делим на 10, прибавляем к нему цифру, делённую на 10. Затем дробную часть прибавляем к целой. Готово.
Arigato вне форума Ответить с цитированием
Старый 08.02.2009, 21:58   #4
Wi1D
Кибернетик
Форумчанин
 
Аватар для Wi1D
 
Регистрация: 22.10.2008
Сообщений: 142
По умолчанию

Через вал не получаеться найти целую часть...он выдает 0!
или может тип не тот у этой переменной что выдает число...какой должен быть?

КАК МНЕ ПРЕОБРАТОВАТЬ СИМВОЛ В ЧИСЛО? как использовать ord и str
не существует идеальных программ...и людей тоже..
<== P.S. если я тебе помог нажми весы слева <==

Последний раз редактировалось Wi1D; 08.02.2009 в 22:31.
Wi1D вне форума Ответить с цитированием
Старый 08.02.2009, 22:47   #5
pomoshnic
Форумчанин
 
Аватар для pomoshnic
 
Регистрация: 16.11.2008
Сообщений: 192
По умолчанию

А как ты написал через вал?
pomoshnic вне форума Ответить с цитированием
Старый 08.02.2009, 23:15   #6
Wi1D
Кибернетик
Форумчанин
 
Аватар для Wi1D
 
Регистрация: 22.10.2008
Сообщений: 142
По умолчанию

Код:
rogram chuCJla;
 uses CRT;
 const
	Lmax=10;
 var
	s:string;
	lp,drob:byte;
	t,c,i,j,j2:integer;
	acc:real;
	z:shortint;
 procedure BBoD(var s:string;var lp:byte;var z:shortint);
	var
	l:byte;
	ch,znak:char;
	 begin
	 s:='';
	 l:=1;
	 Writeln('MaKCuMaJlbHoE KoJlu4eCTBo CuMBoJloB= ',lmax);
	 Writeln('BBeduTe KoJlu4eCTBo CuMBoJloB He C4uTa9 3Hak.Pa3DeJluTeJlb - c4uTaTb');
	 readln(lp);
		if lp>lmax then Writeln('CJluLLlKoM DJluHHoe 4uCJlo')
		else
			begin
			 Writeln('BBeDuTe 3Hak');
			 readln(znak);
				if znak='-' then z:=-1;
				if znak='+' then z:=1;
			for l:=1 to lp do
			 begin
				Writeln('BBeDuTe ',l,' CuMBoJl 4uCJlA');
				readln(ch);
				insert(ch,s,length(s)+1);
			 end;
			end;
		end;
Begin
 ClrScr;
 BBoD(s,lp,z);
	val(s,c,t);
	drob:=lp-t;
	acc:=0;
	 for i:=lp downto t+1 do begin
	 Val(s[i],j,t);
	 acc:=acc+j*(1/exp(ln(10)*drob));
	 dec(drob);
	 writeln(acc);
	end;
	readln;
End.
Почему он не считает нормально acc???
не существует идеальных программ...и людей тоже..
<== P.S. если я тебе помог нажми весы слева <==
Wi1D вне форума Ответить с цитированием
Старый 09.02.2009, 09:08   #7
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Цитата:
Находим в строке "." (или какой там разделитель дроби), всё, что слева - целая часть, её получаем через Val. Правая часть - дробная. Её получить можно так: посимвольно просматриваем строку с конца, аккумулятор делим на 10, прибавляем к нему цифру, делённую на 10. Затем дробную часть прибавляем к целой. Готово.
Непонятно, к чему такие сложности. Вот выкопировка из Хэлпа Паскаля:
Цитата:
Объявление:
Procedure Val(S; Var V; Var Code : Integer);

Где:
S - переменная со строковым типом. Должна представлять
последовательность символов, формирующих знаковое целое число.
V - переменная типа Real или Integer
Code - переменная типа Integer

Режим:
Windows, Real, Protected
Для неверующих вот пример.
Код:
uses crt;
var s:string;
    v:extended;
    c:integer;
begin
clrscr;
write('s=');readln(s);
val(s,v,c);
write('v=',v:0:10);
readln
end.
P.S. Наверное так не очень понятно как вывести точное количество знаков после запятой. Думаю их просто нужно посчитать при вводе числа или вычислить, их количество
k:=length(s)-pos(',',s);
Тогда вывод числа write('v=',v:0:k);

Последний раз редактировалось puporev; 09.02.2009 в 09:37.
puporev вне форума Ответить с цитированием
Старый 09.02.2009, 16:49   #8
Wi1D
Кибернетик
Форумчанин
 
Аватар для Wi1D
 
Регистрация: 22.10.2008
Сообщений: 142
По умолчанию

puporev спасибо!
Все работает!Вот листинг:
Код:
Program chuCJla;
 uses CRT;
 const
	Lmax=10;
 var
	s:string;
	r:extended;
	c,k:integer;
 procedure BBoD(var s:string);
	var
	l,lp:byte;
	ch:char;
	 begin
	 s:='';
	 l:=1;
	 Writeln('MaKCuMaJlbHoE KoJlu4eCTBo CuMBoJloB= ',lmax);
	 Writeln('BBeduTe KoJlu4eCTBo CuMBoJloB');
	 readln(lp);
	 Writeln('4uCJlo PA3DeJl9Tb CuMBoJloM "."');
		if lp>lmax then Writeln('CJluLLlKoM DJluHHoe 4uCJlo')
		else
			begin
			for l:=1 to lp do
			 begin
				Writeln('BBeDuTe ',l,' CuMBoJl 4uCJlA');
				readln(ch);
				insert(ch,s,length(s)+1);
			 end;
			end;
		end;
Begin
 ClrScr;
 BBoD(s);
 k:=length(s)-pos('.',s);
 val(s,r,c);
 write('ETo 4uCJlo PaBHO= ',r:0:k);
	readln;
End.
не существует идеальных программ...и людей тоже..
<== P.S. если я тебе помог нажми весы слева <==
Wi1D вне форума Ответить с цитированием
Старый 09.02.2009, 18:16   #9
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

puporev, согласен, ступил. Я Turbo Pascal много лет уже не использую, глянул в хелп невнимательно, и ...
Цитата:
Procedure Val(S; Var V; Var Code : Integer);
Показалось что и V, и Code типа Integer.
Arigato вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Строковое выражение SeregaIRK Общие вопросы C/C++ 1 07.10.2008 19:20
значение получившегося выражения должно быть равно заданному целому S Elm0 Паскаль, Turbo Pascal, PascalABC.NET 6 18.01.2008 00:13
Процесс - на вкладке процессы, напротив процесса программы должно быть написано SYSTEM Terran Общие вопросы Delphi 3 10.01.2008 21:03
TStringGrid - изначально мы видим одну ячейку в конце должно быть столько сколько заполнили. Ensoph Компоненты Delphi 5 18.10.2007 22:24
Неправильно отображается вещественный тип frantic БД в Delphi 4 23.02.2007 14:24