Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Простейшая задача на String

Автор: Art87 12.01.2006 13:49

Задача такая: Слова в исходной строке разделены пробелами. Сформировать строку в которой будут все слова из первой строки начинающиеся на гласную букву.

program abc;
const glasn=['а','е','и','о','у','ы','э','ю','я'];
Var
S, S1: string;
a, n, l: byte;
i: char; {Первая буква слова}
begin
writeln ('Ввод текста: '); readln(S);
S:= S + '_';
a:=0; {Количество слов в тексте начинающихся с гласной буквы}
n:= pos('_', s);
while n<>0 do begin
l:=length(S);
i:= copy(S,1,l);
If i=glasn then a:= a + 1;
insert(a, S1, n); writeln(S1); readln;
end;
end;


Выдает ошибку после
Цитата
i:= copy(S,1,l);
- Несоответствие типов.
Ну и в правильности остальной программы я сомневаюсь. Посмотрите пожалуйста.

И еще хотел спросить:
Я написал прогу для вычисления n!
Var f, m: longint;
function fact (n: integer): longint;
begin
if n=0 then fact:= 1
else fact:= fact (n - 1)*n;
end;
begin
writeln('Ввод m: ');
readln(m);
f:=fact(m);
writeln('m= ', f); readln;
end.


Как сделать чтобы она вычисляла факториал (n>100)?

Автор: Гость 12.01.2006 14:24

Цитата(Art87 @ 12.01.2006 9:49)
Как сделать чтобы она вычисляла факториал (n>100)?
Твоя программа этого делать не сможет (даже 14! в Longint уже не помещается)... Смотри здесь: http://forum.pascal.net.ru/index.php?s=&showtopic=2428&view=findpost&p=20956

Автор: Студентик13 12.01.2006 15:09

Можно попробовать Вещественный тип данных EXTENDED

Автор: Гость 12.01.2006 15:12

Студентик13, факториал по определению - целое число. И вычислять его нужно с точностью до единиц. Что тебе даст Extended? Во-первых, уверен ли ты, что в него число 100! поместится? Во-вторых, точность - никакая, всего 19..20 значащих цифр мантиссы...

Ну, и в третьих... Если бы это было так просто, то наверное такие задания не давали бы, как ты думаешь?

Автор: Art87 12.01.2006 15:18

А если так:


var
p, r, d: longint;
i, j, n: integer;

c: array [1..1000] of byte;
begin
writeln('Vvedite n ');
C[1]:=1; r:=1;
for i:=2 to n do
p:=0;
for j:=1 to r do
d:=c[j] * (i+p);
c[j]:= d mod 10;
p:= p div 10;
If p<>0 then
begin
r:=r+1;
C[r]:= p mod 10;
p:= p div 10;
end; end.


Только не пойму, почему не запускается. Хотя и ошибки не выдает.

Автор: Студентик13 12.01.2006 15:30

а ты Read(n); Забыл дописать

Цитата
Во-первых, уверен ли ты, что в него число 100! поместится? Во-вторых, точность - никакая, всего 19..20 значащих цифр мантиссы...

Гость Длиннта EXTENDED'а в байтах равна 10'и и промежуток его чисел может состаелять от 3.4*10^-4932 до 1.7*10^4932 число 100! суда поместится темболее что оно целое

Автор: Art87 12.01.2006 15:30

Студентик13
Спасибо. Я не только это забыл дописать.

Автор: volvo 12.01.2006 15:55

Студентик13, хорошо, я могу и авторизоваться. Давай ты мне скажешь, чему будет равна цифра №75 в числе 100! при его вычислении как Extended?

Я же тебе сказал, что здесь без длинной арифметики не обойтись...

P.S. Флейм удален... Устное предупреждение обоим...

Автор: Art87 12.01.2006 15:59

volvo
А программа на string почему не работает? Подскажите пожалуйста.

Автор: Студентик13 12.01.2006 17:27

Твоя первая программа не работает поэтому(смотри PrtSc)


Эскизы прикрепленных изображений
Прикрепленное изображение

Автор: klem4 12.01.2006 17:40

Студентик13, я думаю эту строчку он смог и без тебя разглядеть, ты бы лучьше о своих задачах думал ...

uses crt;

procedure GetNewString(_in : string; var _out : string);
const glasn = ['у','е','ы','о','я','и','ю','а'];
var
i,back : byte;
begin
_out := '';
i := 1;
while ( i <= length(_in)) do begin
while ( i <= length(_in)) and (_in[i] = ' ') do inc(i);
if i <= length(_in) then begin
back := i;
while (i <= length(_in)) and not(_in[i] = ' ') do inc(i);
if _in[back] in glasn then _out := _out + copy(_in, back, i - back) + #32;
end;
end;
end;

var
s1,s2 : string;
begin
clrscr;
write('s1 = '); readln(s1);
GetNewString(s1,s2);
write('s2 = ' + s2);
readln;
end.

Автор: Гость 12.01.2006 21:16

klem4
Спасибо огромное. У меня только один дуратский вопрос: Что значит код ASCII #32? Я в этой таблице так и не понял ничего.

Автор: klem4 12.01.2006 21:32

пробел

Автор: Art87 13.01.2006 14:14

klem4
Еще вопрос: А зачем столько циклов while? Там где 2 подряд идут, разве нельзя одним ограничиться?

Автор: volvo 13.01.2006 14:23

Нет... Каждый цикл здесь необходим... Это одна из самых часто требующихся задач, и klem4 уж наверное максимально оптимизировал код... smile.gif

Вся проблема в том, что внутри САМОГО внешнего While выполняется не только другой While, а еще и условие...

Автор: mdcool 26.04.2007 0:20

Цитата(Art87 @ 12.01.2006 9:49) *

И еще хотел спросить:
Я написал прогу для вычисления n!
Var f, m: longint;
function fact (n: integer): longint;
begin
if n=0 then fact:= 1
else fact:= fact (n - 1)*n;
end;
begin
writeln('Ввод m: ');
readln(m);
f:=fact(m);
writeln('m= ', f); readln;
end.


Как сделать чтобы она вычисляла факториал (n>100)?

уйди от рекурсии, те,е не хватает оперативки для выполнения, под локальные переменные выделяется 16 ктлобайт, и рекурсия только забивает их. попробуй

function fact(n:integer):longint;
var i:=integer;
begin
fact:=1;
for i:=1 to n do
fact:=fact*i
end;



М
Теме больше года ...