Помощь - Поиск - Пользователи - Календарь
Полная версия: Программа для вычисления гласных
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
user_a
ЗАДАНИЕ :
1 . Петя Пяточкин считает склады

Hазва программы : syllable . *

Любознательный киевский школьник Петя Пяточкин как-то заинтересовался языкознанием - наукой о языке. Для важного исследования Пете нужно выяснить , сколько слогов имеют названия натуральных чисел ( количественные числительные в именительном падеже ) , т.е. сколько гласных букв они содержат . Помогите Пете , написав программу , которая дает ответ на этот вопрос.

входные данные
Во входном файле указано натуральное число n , количество складов для которого нужно посчитать . Число n не превышает 100.

выходные данные
Единственная строка выходного файла должна содержать количество складов , которые в своем названии украинском языке имеет число n .

примеры
входной файл
syllable.in
1
25

Исходный файл
syllable.out
2
3

Помощь к примерам
Слово «один » имеет два состава (содержит две гласные буквы ) . Название числа 25 - « двадцать пять » - имеет три состава (содержит три гласные буквы ) .
----------------------------------------------------------------------------------------------------------------------
МОЯ ПРОГРАММА :
program golosni;
var
x1,x2,x3,x4,s,s1:integer;
p1,p2:integer;
t:text;
tv:text;
begin
assign(t,'syllable.in');
reset(t);
read(t,p1);
close(t);
s:=0;
x2:=trunc(p1/10);
x1:=p1-(x2*10);
if x2=1 then
case x1 of
0: s:=s+2;
1: s:=s+4;
2: s:=s+3;
3: s:=s+3;
4: s:=s+4;
5: s:=s+3;
6: s:=s+3;
7: s:=s+3;
8: s:=s+4;
9: s:=s+3;
end
else begin
case x2 of
2: s:=s+2;
3: s:=s+2;
4: s:=s+2;
5: s:=s+3;
6: s:=s+3;
7: s:=s+3;
8: s:=s+4;
9: s:=s+4;
end;
case x1 of
0: s:=s+1;
1: s:=s+2;
2: s:=s+1;
3: s:=s+1;
4: s:=s+3;
5: s:=s+1;
6: s:=s+1;
7: s:=s+1;
8: s:=s+2;
9: s:=s+2;
end;
end;
reset(t);
read(t,p2);
close(t);
s1:=0;
x4:=trunc(p2/10);
x3:=p2-(x4*10);
if x4=1 then
case x3 of
0: s1:=s1+2;
1: s1:=s1+4;
2: s1:=s1+3;
3: s1:=s1+3;
4: s1:=s1+4;
5: s1:=s1+3;
6: s1:=s1+3;
7: s1:=s1+3;
8: s1:=s1+4;
9: s1:=s1+3;
end
else begin
case x4 of
2: s1:=s1+2;
3: s1:=s1+2;
4: s1:=s1+2;
5: s1:=s1+3;
6: s1:=s1+3;
7: s1:=s1+3;
8: s1:=s1+4;
9: s1:=s1+4;
end;
case x3 of
0: s1:=s1+1;
1: s1:=s1+2;
2: s1:=s1+1;
3: s1:=s1+1;
4: s1:=s1+3;
5: s1:=s1+1;
6: s1:=s1+1;
7: s1:=s1+1;
8: s1:=s1+2;
9: s1:=s1+2;
end;
end;
assign(tv,'syllable.out');
rewrite(tv);
writeln(tv,s);
writeln(tv,s1);
close(tv);
writeln ('Kilkist golosnyh ' , s,',',s1);


readln;
end.


----------------------------------------------------------------------------------------------------------------------
Все работает, щитает правильно (делал с учителем по инфоматике. Ми делали для вычисления из 1 числа). Мне нужно было переделать чтобы считывало из файла 2 числа (каждое с нового рядка) и вычисляло отдельно для этих двух чисел и звписывало их в выходной файл. Но проблема: щитает правильно только для первого числа, для второго выводит тоже значение что и для первого.

пример. нужно:
2
3
Выводит:
2
2.
Помогите найти ошибку. Зарание спасибо.
Федосеев Павел
1. Ты, наверное, впервые на подобном форуме. Перед тем, как приводить листинг программы нажми кнопку CODE, скопируй код, а потом нажми на кнопку '#' рядом с CODE. Теперь твоя программа находится между тегами форматирования и будет удобно отображена.
2. Для улучшения читабельности воспользуйся форматтером кода JCF (смотри здесь).
3. По сути вопроса. Ошибка возникла из-за Copy-Paste - ты повторно открываешь файл t на чтение.
4. Для текстовых файлов есть различия между read и readln. Тебе нужно считывать readln.

По-хорошему, тебе бы реорганизовать код программы. Ну, например, так:
Функция возвращает количество гласных}
function CountG(p: integer):integer;
...................
реализация функции
...................

var
........
begin
assign(t, 'syllable.in');
reset(t);
assign(tv, 'syllable.out');
rewrite(tv);
while not eof(t) do
begin
readln(t, p1);
writeln(tv, CountG(p1));
end;
close(t);
close(tv);
end.

Постарайся уйти от Copy-Paste.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.