Привет всем! Я недавно начал работать с Паскалем и у меня возникли некоторые вопросы... Вы не могли бы подсказать как правильно поступить? Допустим есть такой код:
uses crt;
var
x:integer;
y:integer;
z:integer;
begin
clrscr;
write('Vvedite X: ');
readln(x);
write('Vvedite Y: ');
readln(y);
write('Vvedite Z: ');
readln(z);
if(x=y) and (y=z) then writeln('X=0 Y=0 Z=0');
if(x<y) and (x<z) then writeln('X=0',' Y=',y,' Z=',z);
if(y<x) and (y<z) then writeln('X=',x,' Y=0 ','Z=',z);
if(z<x) and (z<y) then writeln('X=',x,' Y=',y,' Z=0');
write('Nazhmite Enter...');
readln;
end.
Как сделать так, при вводе X,Y,Z не цифр, а СИМВОЛОВ программа не выкидывала меня в редактор с ошибкой "Invalid numeric format", а скажем выдавала сообщение типа ERROR и предлагала ввести ввести данные заново? Заранее спасибо!
volvo
3.12.2005 21:42
Вот общий принцип (чтобы не было ошибок при неверном вводе):
var
X: integer;
ok: boolean;
beginrepeat{$I-}{ отключаем "вылет" из программы }write('enter X'); readln(X);
{$I+}
ok := (ioresult = 0); { и проверяем состояние ошибки }ifnot ok then writeln('error... try one more');
until ok;
end.
Сможешь его применить для своей программы?
garry_m
4.12.2005 12:09
Ну применить это у меня получилось, но только для переменной X. А вот когда я ввожу в Y некорректное значение (символы), он меня выкидывает с ошибкой. (Invalid numeric format)
uses crt;
var
x:integer;
y:integer;
z:integer;
ok:boolean;
begin
clrscr;
repeat{$I-}write('Vvedite X: '); readln(x);
{$I+}
ok:= (ioresult=0);
ifnot ok then writeln('Error! Try again!');
until ok;
repeat{SI-}write('Vvedite Y: '); readln(y);
{SI+}
ok:= (ioresult=0);
ifnot ok then writeln('Error! Try again!');
until ok;
repeat{$I-}write('Vvedite Z: '); readln(z);
{$I+}
ok:= (ioresult=0); {i prov sost oshibki}ifnot ok then writeln('Error! Try again!');
until ok;
if(x=y) and (y=z) then writeln('X=0 Y=0 Z=0');
if(x<y) and (x<z) then writeln('X=0',' Y=',y,' Z=',z);
if(y<x) and (y<z) then writeln('X=',x,' Y=0 ','Z=',z);
if(z<x) and (z<y) then writeln('X=',x,' Y=',y,' Z=0');
write('Nazhmite Enter...');
readln;
end.
volvo
4.12.2005 12:11
А если {SI-} поменять на {$I-} ? И с плюсом то же самое?
Тут составил еще одну программку... никто не подскажет как вставить цикл? Т. е. требуется чтобы после того, как программа закончит все действия, задавался вопрос типа: "Хотите ли вы попробовать еще? (Y/N)". Соответственно, если "Y", то опять ввод данных по новой, а если "N", то выход в редактор. Сам пробовал - ничего не вышло...
Код:
uses crt;
var
N,k:integer;
ok:boolean;
begin
clrscr;
repeatrepeat{$I-}write('VVEDITE NOMER DNJA V GODU -> ');
readln(k);
{$I+}
ok:=(ioresult=0);
ifnot ok then writeln('* * * ERROR! WRONG INPUT! PLEASE TRY AGAIN! * * *');
until ok;
if(k>365) then writeln('NEVERNIJ VVOD! POVTORITE!');
until(k>=0) and (k<=365);
N:=k mod7;
case N of1:writeln ('PONEDELNIK');
2:writeln ('VTORNIK');
3:writeln ('SREDA');
4:writeln ('CHETVERG');
5:writeln ('PJATNICA');
6:writeln ('SUBBOTA');
7,0:writeln ('VOSKRESENJE');
end;
readln;
end.
volvo
5.12.2005 22:09
garry_m, я немного подправил твою программку, она так будет немного проще: 1) проверка на правильность ввода данных производится в одном месте, один лишний цикл убираем... 2) результат операции К mod 7 не может быть равным 7, я убрал этот вариант Ну, и добавил тот самый цикл, который ты просил...
uses crt;
var
N,k:integer;
ok:boolean;
ans: char;
begin
clrscr;
repeatrepeat{$I-}write('VVEDITE NOMER DNJA V GODU -> '); readln(k);
{$I+}
ok:=(ioresult=0) and (k <= 365) and (k > 0);
ifnot ok then writeln('* * * ERROR! WRONG INPUT! PLEASE TRY AGAIN! * * *');
until ok;
N:=k mod7;
case N of1:writeln ('PONEDELNIK');
2:writeln ('VTORNIK');
3:writeln ('SREDA');
4:writeln ('CHETVERG');
5:writeln ('PJATNICA');
6:writeln ('SUBBOTA');
0:writeln ('VOSKRESENJE');
end;
writeln('do you want to repeat? (Y/N)');
ans := readkey;
until UpCase(ans) = 'N';
end.
garry_m
5.12.2005 23:14
volvo, все работает как надо! Кстати я только что этот цикл внедрил еще в одну программку! Спасибо огромное!
garry_m
6.12.2005 21:30
Блин тут возникла проблема небольшая... программу-то я составил, но только она не выполняет поставленную задачу... Да и поправьте меня pls что я не так в программе сделал... Мне кажется я накосячил в самом начале программы.
ПОСТАВЛЕННАЯ ЗАДАЧА: Переставляя столбцы действительной матрицы размера M x N, упорядочить ее по невозрастанию элементов последней строки.
Сорри за небольшое отклонение от темы про цикл, т. к. данная задача на массивы.
КОД:
uses crt;
const{Razmernost matrici MxN}
M=5;N=5;
type
Tmat=array[1..N,1..M] of integer;
var
mat,str:tmat; {Matrici nachalnije i konechnije}
i:string; {Peremennaja podtverzdenija}
schM,schN:integer; {Peremennije schetchika}begin
clrscr;
{Zapolnenije matrici}write('Vi hotite zapolnit matricu vruchnuju ili avtomaticheski? (Y,N): ');
readln(i);
if (i='Y') or (i='y') then{Zapolnenije matrici vruchnuju}beginfor schM:=1to M dofor schN:=1to N dobeginwrite('Vvedite element M=',schM,' N=',schN, ' ');{Zapolnenije elementa}
readln(mat[schM,schN]);
end;
endelse{Avtomaticheskoje zapolnenije matrici}beginfor schM:=1to M dobeginfor schN:=1to N do
mat[schM,schN]:=schM*schN;{Tablica umnozhenija}end;
end;
{Vivod nachalnoj matrici}
writeln('Nachalnaja matrica ',M,'x',N,':');
for schM:=1to M dobeginfor schN:=1to N dowrite(mat[schM,schN]:5);
writeln('');
{Perestanovka strok}write('Dlja vivoda konechnoj matrici nazhmite Enter...');
readln;
writeln('Konechnij rezultat:');
for schM:=1to M dofor schN:=1to N do
str[M-schM+1,schN]:=mat[schM,schN];
{Vivod konechnoj matrici}for schM:=1to M dobeginfor schN:=1to N dowrite(str[schM,schN]:5);
writeln('');
end;
write('Dlja prodolzhenija nazhmite Enter...'); readln;
end;
end.
volvo
6.12.2005 23:44
garry_m, поставленная тобой (или тебе, неважно) задача решается так: (см. также Пузырьковая сортировка, именно этот алгоритм применялся для сортировки столбцов, и Как задать матрицу, чтобы ... - это использовалось для самого описАния матрицы...)
uses crt;
const{Razmernost matrici MxN}
m = 5; { columns }
n = 5; { lines }type
TColumn = array[1 .. n] of integer;
Tmat = array[1 .. m] of TColumn;
var
mat: Tmat; {Matrici nachalnije i konechnije}
ch: Char; {Peremennaja podtverzdenija}
j_m, i_m, i_n: integer;
cnt: integer;
T: TColumn;
begin
clrscr;
{ Zapolnenije matrici }write('Vi hotite zapolnit matricu vruchnuju [Y] ili avtomaticheski [N]?: ');
Ch := ReadKey; cnt := 0;
writeln;
for i_m:=1to m dofor i_n:=1to n doif UpCase(Ch) = 'Y'thenbeginwrite('mat[',i_m:2,', ',i_n:2, '] = ');
readln(mat[i_n][i_m]);
endelse
mat[i_n][i_m] := i_m * i_n;
{Vivod nachalnoj matrici}
writeln('Nachalnaja matrica ',M,'x',N,':');
for i_m:=1to M dobeginfor i_n:=1to N dowrite(mat[i_n][i_m]:5);
writeln;
end;
{Perestanovka strok}write('Dlja vivoda konechnoj matrici nazhmite Enter...'); readln;
writeln('Konechnij rezultat:');
For i_m := 1To m DoFor j_m := m DownTo i_m + 1DoIf mat[Pred(j_m)][n] > mat[j_m][n] Then{ < }Begin
T := mat[j_m - 1]; mat[j_m - 1] := mat[j_m]; mat[j_m] := T
End;
{Vivod konechnoj matrici}for i_m:=1to M dobeginfor i_n:=1to N dowrite(mat[i_n][i_m]:5);
writeln;
end;
write('Dlja prodolzhenija nazhmite Enter...'); readln;
end.
P.S. В следующий раз вопросы на другие темы задавай в новом топике...
garry_m
7.12.2005 17:12
Странно... а почему в программе, которую ты написал начальная и конечная матрицы совпадают? (они абсолютно одинаковые)
volvo
7.12.2005 17:15
А потому, что таблица умножения уже упорядочена по возрастанию
А какие данные ты вводил? Вручную?
garry_m
7.12.2005 17:22
И вручную и автоматически... так мне нужно еще вставить процедуру как должны переставляться элементы строки? Или ее нужно как-то по-другому заполнять? Я что-то не догоняю... :-(
volvo
7.12.2005 17:24
Приведи данные, которые ты вводил !!! Почему когда я прогоняю программу, все работает, а как только кто-то другой запускает - у них обязательно появляются баги?
Для теста - попробуй, например, задать НЕ таблицу умножения, а вот это: