1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Привет всем! Я недавно начал работать с Паскалем и у меня возникли некоторые вопросы... Вы не могли бы подсказать как правильно поступить? Допустим есть такой код:
uses crt; var x:integer; y:integer; z:integer; begin clrscr;
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 и предлагала ввести ввести данные заново? Заранее спасибо!
Вот общий принцип (чтобы не было ошибок при неверном вводе):
var X: integer; ok: boolean; begin repeat {$I-} { отключаем "вылет" из программы } write('enter X'); readln(X); {$I+} ok := (ioresult = 0); { и проверяем состояние ошибки } if not ok then writeln('error... try one more'); until ok; end.
Ну применить это у меня получилось, но только для переменной 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); if not ok then writeln('Error! Try again!'); until ok;
repeat {SI-} write('Vvedite Y: '); readln(y); {SI+} ok:= (ioresult=0); if not ok then writeln('Error! Try again!'); until ok;
repeat {$I-} write('Vvedite Z: '); readln(z); {$I+} ok:= (ioresult=0); {i prov sost oshibki} if not 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');
Тут составил еще одну программку... никто не подскажет как вставить цикл? Т. е. требуется чтобы после того, как программа закончит все действия, задавался вопрос типа: "Хотите ли вы попробовать еще? (Y/N)". Соответственно, если "Y", то опять ввод данных по новой, а если "N", то выход в редактор. Сам пробовал - ничего не вышло...
Код:
uses crt; var N,k:integer; ok:boolean; begin clrscr;
repeat
repeat {$I-} write('VVEDITE NOMER DNJA V GODU -> '); readln(k); {$I+} ok:=(ioresult=0); if not 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 mod 7; case N of 1:writeln ('PONEDELNIK'); 2:writeln ('VTORNIK'); 3:writeln ('SREDA'); 4:writeln ('CHETVERG'); 5:writeln ('PJATNICA'); 6:writeln ('SUBBOTA'); 7,0:writeln ('VOSKRESENJE');
garry_m, я немного подправил твою программку, она так будет немного проще: 1) проверка на правильность ввода данных производится в одном месте, один лишний цикл убираем... 2) результат операции К mod 7 не может быть равным 7, я убрал этот вариант Ну, и добавил тот самый цикл, который ты просил...
uses crt; var N,k:integer; ok:boolean; ans: char; begin
clrscr; repeat repeat {$I-} write('VVEDITE NOMER DNJA V GODU -> '); readln(k); {$I+} ok:=(ioresult=0) and (k <= 365) and (k > 0); if not ok then writeln('* * * ERROR! WRONG INPUT! PLEASE TRY AGAIN! * * *'); until ok;
N:=k mod 7; case N of 1: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';
Блин тут возникла проблема небольшая... программу-то я составил, но только она не выполняет поставленную задачу... Да и поправьте меня 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} begin for schM:=1 to M do for schN:=1 to N do begin write('Vvedite element M=',schM,' N=',schN, ' ');{Zapolnenije elementa} readln(mat[schM,schN]); end; end else {Avtomaticheskoje zapolnenije matrici} begin for schM:=1 to M do begin for schN:=1 to N do mat[schM,schN]:=schM*schN;{Tablica umnozhenija} end; end; {Vivod nachalnoj matrici} writeln('Nachalnaja matrica ',M,'x',N,':'); for schM:=1 to M do begin for schN:=1 to N do write(mat[schM,schN]:5); writeln('');
{Perestanovka strok}
write('Dlja vivoda konechnoj matrici nazhmite Enter...'); readln; writeln('Konechnij rezultat:'); for schM:=1 to M do for schN:=1 to N do str[M-schM+1,schN]:=mat[schM,schN];
{Vivod konechnoj matrici} for schM:=1 to M do begin for schN:=1 to N do write(str[schM,schN]:5); writeln(''); end; write('Dlja prodolzhenija nazhmite Enter...'); readln;
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;
if UpCase(Ch) = 'Y' then begin write('mat[',i_m:2,', ',i_n:2, '] = '); readln(mat[i_n][i_m]); end else mat[i_n][i_m] := i_m * i_n;
{Vivod nachalnoj matrici} writeln('Nachalnaja matrica ',M,'x',N,':'); for i_m:=1 to M do begin for i_n:=1 to N do write(mat[i_n][i_m]:5); writeln; end;
writeln('Konechnij rezultat:'); For i_m := 1 To m Do For j_m := m DownTo i_m + 1 Do If 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:=1 to M do begin for i_n:=1 to N do write(mat[i_n][i_m]:5); writeln; end;
И вручную и автоматически... так мне нужно еще вставить процедуру как должны переставляться элементы строки? Или ее нужно как-то по-другому заполнять? Я что-то не догоняю... :-(
Приведи данные, которые ты вводил !!! Почему когда я прогоняю программу, все работает, а как только кто-то другой запускает - у них обязательно появляются баги?
Для теста - попробуй, например, задать НЕ таблицу умножения, а вот это: