Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Паскаль: обсуждение вариантов решения задач (http://www.tehnari.ru/f41/t46331/)

Mr.Програмист 25.01.2011 09:35

Паскаль: обсуждение вариантов решения задач
 
Задача:
Для массива Х [1..40] вывести первый отрицательный элемент и его порядковый номер.

Вот мой вариант:
Uses Crt;
Label met1;
Var a:array[1..40] of Word;
i,k:integer;
Begin
randomize; {я могу ошибиться}
For i:=1 to 40 do
a[i]:=random(1000)-1000;
For i:=1 to 40 do
begin
if a[i]<0 then begin
k:=i; Writeln(a[i],k); goto met1;
end;
end;
met1:Readkey;
End.

Vladimir_S 25.01.2011 09:56

Цитата:

Сообщение от Mr.Програмист (Сообщение 452568)
Вот мой вариант:

Между прочим - куча ошибок. Не говоря уже о том, что использование меток и переходов по меткам - вообще дурной стиль.
Цитата:

Uses Crt;
Label met1;
Var a:array[1..40] of Word;
i,k:integer;
Begin
randomize; {я могу ошибиться}
For i:=1 to 40 do
a[i]:=random(1000)-1000;
Итак, вы определили тип массива Word. Но тип Word вообще не допускает отрицательных значений! А вот присваиваете Вы значение элементам массива в диапазоне -1..-1000, что плохо по двум причинам: во-первых, как уже говорилось, явная нестыковка по типам, во-вторых, при такой выборке ВСЕ БЕЗ ИСКЛЮЧЕНИЯ элементы массива будут отрицательными, а потому исходная задача (поиск первого отрицательного элемента) теряет смысл.
Цитата:

k:=i; Writeln(a[i],k);
Непонятно, зачем вообще нужно k? Почему не написать просто Writeln(a[i],i);? Между прочим, и сам вывод сделан безграмотно: без форматов или пробелов оба числа просто сольются в одно целое. Ну очень удобно!
P.S. Мне кажется, рановато Вы такой ник выбрали. Учитесь!
P.P.S. А если Вы не знаете, как без меток выйти из цикла - подскажу. Для этого в Паскале предусмотрен оператор Break. С его помощью блок выбора первого отрицательного числа можно преобразовать, например, так:
Код:

For i:=1 to 40 do
  if a[i]<0 then
  begin
    Writeln(i,'  ',a[i]);
    break;
  end;
Readkey;


Mr.Програмист 25.01.2011 12:08

:tehnari_ru_657:
Uses Crt;
Var a:array[1..40] of longint;
i,k:integer;
Begin
randomize; {я могу ошибиться}
For i:=1 to 40 do
a[i]:=random(10000)-10000;
For i:=1 to 40 do
begin
if a[i]<0 then begin
Writeln(a[i],' ',i); break;
end;
end;
Readkey;
End.

Vladimir_S 25.01.2011 12:40

Уже лучше, но вот эта строка:
Цитата:

a[i]:=random(10000)-10000;
по-прежнему никуда не годится.
Операция Random(N) возвращает случайно выбранное целое число в диапазоне 0..(N-1); соответственно Random(N)-N возвращает число в диапазоне -N..-1, т.е. опять ВСЕ БЕЗ ИСКЛЮЧЕНИЯ элементы массива оказываются отрицательными и задача полностью теряет смысл.
P.S. Чтобы не путать заказчицу, перенесу обсуждение Вашей программы в отдельную тему.

Mr.Програмист 25.01.2011 15:17

Уважаемый Vladimir S [SPOILER]Не подумайте что я ноль в Паскале я его довольно хорошо знаю просто я ещё учусь в школе 9 класс и всех тонкостей не знаю[/SPOILER]
Расскажите как сделать так как надо по задаче.

Vladimir_S 25.01.2011 16:02

Цитата:

Сообщение от Mr.Програмист (Сообщение 452711)
Уважаемый Vladimir S [SPOILER]Не подумайте что я ноль в Паскале я его довольно хорошо знаю просто я ещё учусь в школе 9 класс и всех тонкостей не знаю[/SPOILER]
Расскажите как сделать так как надо по задаче.

Ну... один из вариантов решения "так, как надо" был мною выложен:
http://www.tehnari.ru/f41/t46278/#post452337
Посмотрите внимательно.
P.S. К сожалению, тег "Spoiler" на этом форуме не задействован.
P.P.S. И еще пара замечаний. Во-первых, если Вы видите, что кто-то из программистов уже выложил решение задачи, то не следует выкладывать своё (по принципу "А вот мой вариант!"), если только Вы не уверены, что Вам удалось найти существенно лучшее решение или что выложенное содержит принципиальные ошибки - это просто невежливо по отношению к коллеге. Кроме того, даже если на Ваш взгляд программа совсем простая, нужно обязательно провести ее тестирование: оттранслировать, запустить и т.д., а не просто "написал-выложил".

Fenix 25.01.2011 18:46

полностью согласен с Vladimir_S. ну и что что ты в 9-м учишься? я допустим учусь в 11м и паскаль также проходил только в 9-м классе. В любом случае если ты помогаешь решать кому-то, то сам сначала реши. причем не на литске бумаги, а в самом паскале. Протестируй на предельные значения и прочее. Со всем уважением. Успехов в изучении паскаля.

Mr.Програмист 26.01.2011 14:29

Сделаем немного эффективнее
Uses Crt;
var A,B,D: array[1..10] of integer;
m,i:integer;
begin
clrscr;
write('введите число элементов массивов <=10 - ');
readln(m);
writeln('введите элементы массива A и B');
for i:=1 to m do
begin
write ('A[',i,']= ');
readln (A[i]);
Writeln;
write ('B[',i,']= ');
readln (B[i]);
D[i]:=A[i]-B[i];
end;
writeln;
writeln('вывод массивов');
for i:=1 to m do
write (A[i]:5);
writeln;
write (B[i]:5);
writeln;
write (D[i]:5);
writeln;
readkey;
end;
Я тоже не проверял, но думаю заработает

AlexZir 26.01.2011 18:24

Mr.Програмист Приставки з в русском языке нет!

В чем заключается эффективность вашего варианта? В неправильной организации вывода массивов? К тому же, в вашей программе при заполнении исходных массивов легко запутаться в выборе нужного значения для ввода. Программа на языке Pascal согласно синтаксису должна заканчиваться точкой, а не точкой с запятой.

Просьба к вам - используйте тег [ code ] для оформления листинга

Mr.Програмист 13.02.2011 04:23

Вот моя задача чтобы раскачать тему. Разбирайте.
Код:

Program bankomat;
Uses Crt;
Label met1,met2,met3,met4,met5,met6,met7,met8;
Var a,c,b,d,i,n,k5000,k1000,k500,k100,k50:integer;
Begin
k5000:=10000;
k1000:=10000;
k500:=10000;
k100:=10000;
k50:=10000;
met3:
i:=1;
n:=5;
Repeat
Begin
Writeln('Введите пинкод');
Readln(a);
If a=1973
Then begin Writeln('Пин код веден верно'); goto met1; end
Else Writeln('Вы ошиблись');
If i=4
Then
begin
Writeln('Карточка заблокирована'); goto met2;
end;
i:=i+1;
end;
Until i>n;
met1: Writeln('Введите какую сумму вы хотите получить');
Readln(b);
c:=b div 5000;
d:=b mod 5000;
If k5000<c
then begin
k1000:=k1000+(c-k5000); goto met4; end
Else
For i:=1 to c do
begin
Writeln('5000 руб;');
k5000:=k5000-1;
end;
met4:c:=d div 1000;
d:=d mod 1000;
If k1000<c
then begin
k500:=k500+(c-k1000); goto met5; end
Else
For i:=1 to c do
begin
Writeln('1000 руб');
k1000:=k1000-1;
end;
met5:c:=d div 500;
d:=d mod 500;
If k500<c
then begin
k500:=k500+(c-k1000); goto met6; end
Else
For i:=1 to c do
begin
Writeln('500 руб');
k500:=k500-1;
end;
met6:c:=d div 100;
d:=d mod 100;
If k100<c
then begin
k100:=k100+(c-k500); goto met7; end
Else
For i:=1 to c do
begin
Writeln('100 руб');
k100:=k100-1;
end;
met7:c:=d div 50;
d:=d mod 50;
If k5000<c
then
goto met8;
For i:=1 to c do
begin
Writeln('50 руб');
k50:=k50-1;
end;
met8:Writeln(d,'удержано');
Writeln('Введите 1 чтобы повторить, 2 чтобы выйти');
Readln(d);
If d=1
Then goto met3
Else
readkey;
met2:end.



Часовой пояс GMT +4, время: 08:12.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.