IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Не получается вставить цикл.
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 37
Пол: Мужской

Репутация: -  0  +


Привет всем! Я недавно начал работать с Паскалем и у меня возникли некоторые вопросы... Вы не могли бы подсказать как правильно поступить?
Допустим есть такой код:

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 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Вот общий принцип (чтобы не было ошибок при неверном вводе):
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.

Сможешь его применить для своей программы?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 37
Пол: Мужской

Репутация: -  0  +


Ну применить это у меня получилось, но только для переменной 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');

write('Nazhmite Enter...');
readln;
end.


Сообщение отредактировано: volvo -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






А если {SI-} поменять на {$I-} ? И с плюсом то же самое?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 37
Пол: Мужской

Репутация: -  0  +


Сорри! Подвела невнимательность! Пасиб большое! :-)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Новичок
*

Группа: Пользователи
Сообщений: 37
Пол: Мужской

Репутация: -  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');

end;
readln;
end.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






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';

end.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Новичок
*

Группа: Пользователи
Сообщений: 37
Пол: Мужской

Репутация: -  0  +


volvo, все работает как надо! Кстати я только что этот цикл внедрил еще в одну программку! Спасибо огромное!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Новичок
*

Группа: Пользователи
Сообщений: 37
Пол: Мужской

Репутация: -  0  +


Блин тут возникла проблема небольшая... программу-то я составил, но только она не выполняет поставленную задачу... Да и поправьте меня 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;

end;

end.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Гость






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:=1 to m do
for i_n:=1 to n do

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;


{Perestanovka strok}
write('Dlja vivoda konechnoj matrici nazhmite Enter...'); readln;


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;

write('Dlja prodolzhenija nazhmite Enter...'); readln;

end.


P.S. В следующий раз вопросы на другие темы задавай в новом топике...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Новичок
*

Группа: Пользователи
Сообщений: 37
Пол: Мужской

Репутация: -  0  +


Странно... а почему в программе, которую ты написал начальная и конечная матрицы совпадают? (они абсолютно одинаковые)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Гость






А потому, что таблица умножения уже упорядочена по возрастанию blum.gif

А какие данные ты вводил? Вручную?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Новичок
*

Группа: Пользователи
Сообщений: 37
Пол: Мужской

Репутация: -  0  +


И вручную и автоматически... так мне нужно еще вставить процедуру как должны переставляться элементы строки? Или ее нужно как-то по-другому заполнять?
Я что-то не догоняю... :-(

Сообщение отредактировано: garry_m -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Гость






Приведи данные, которые ты вводил !!! Почему когда я прогоняю программу, все работает, а как только кто-то другой запускает - у них обязательно появляются баги? dry.gif

Для теста - попробуй, например, задать НЕ таблицу умножения, а вот это:
      else
mat[i_n][i_m] := - i_m * i_n; { <--- Добавь минус }

, и убедись, что все работает ...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Новичок
*

Группа: Пользователи
Сообщений: 37
Пол: Мужской

Репутация: -  0  +


Ну я вводил данные вручную...
Вводил числа 1,2,3,4,5, ... 25 по порядку...


1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25

Сообщение отредактировано: garry_m -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Гость






garry_m, а как ты думаешь, числа, образующие последнюю строку (т.е. 21, 22, 23, 24, 25) не упорядочены по неубыванию?

Попробуй ввести от 25 до 1, и почувствуй разницу...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Гость






Стоп... Тебе нужно по невозрастанию... blink.gif Тогда там, где знак закомментирован, поменяй условие:
If mat[Pred(j_m)][n] < mat[j_m][n] Then ...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Новичок
*

Группа: Пользователи
Сообщений: 37
Пол: Мужской

Репутация: -  0  +


Ну разница есть... :-)
Но задача стояла упорядочить по невозрастанию элементов последней строки...
Или я не правильно понял поставленную задачу?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Новичок
*

Группа: Пользователи
Сообщений: 37
Пол: Мужской

Репутация: -  0  +


Отлично! Теперь все пучком! Пасиб!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 7.09.2025 23:11
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name