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

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

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

> Не получается вставить цикл.
garry_m
сообщение 3.12.2005 21:31
Сообщение #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 - 5.11.2006 20:42
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 18)
volvo
сообщение 3.12.2005 21:42
Сообщение #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.

Сможешь его применить для своей программы?
 К началу страницы 
+ Ответить 
garry_m
сообщение 4.12.2005 12:09
Сообщение #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 - 5.11.2006 20:43
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 4.12.2005 12:11
Сообщение #4


Гость






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


Новичок
*

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

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


Сорри! Подвела невнимательность! Пасиб большое! :-)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
garry_m
сообщение 5.12.2005 21:57
Сообщение #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 
 К началу страницы 
+ Ответить 
volvo
сообщение 5.12.2005 22:09
Сообщение #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.
 К началу страницы 
+ Ответить 
garry_m
сообщение 5.12.2005 23:14
Сообщение #8


Новичок
*

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

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


volvo, все работает как надо! Кстати я только что этот цикл внедрил еще в одну программку! Спасибо огромное!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
garry_m
сообщение 6.12.2005 21:30
Сообщение #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 
 К началу страницы 
+ Ответить 
volvo
сообщение 6.12.2005 23:44
Сообщение #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. В следующий раз вопросы на другие темы задавай в новом топике...
 К началу страницы 
+ Ответить 
garry_m
сообщение 7.12.2005 17:12
Сообщение #11


Новичок
*

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

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


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


Гость






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

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


Новичок
*

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

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


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

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


Гость






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

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

, и убедись, что все работает ...
 К началу страницы 
+ Ответить 
garry_m
сообщение 7.12.2005 17:31
Сообщение #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 - 7.12.2005 17:32
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 7.12.2005 17:34
Сообщение #16


Гость






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

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


Гость






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


Новичок
*

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

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


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


Новичок
*

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

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


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

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

 



- Текстовая версия 20.07.2025 10:39
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"