Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 25.01.2011, 09:35   #1 (permalink)
Mr.Програмист
Banned
 
Регистрация: 25.01.2011
Сообщений: 27
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Паскаль: обсуждение вариантов решения задач

Задача:
Для массива Х [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.
Mr.Програмист вне форума   Ответить с цитированием

Старый 25.01.2011, 09:35
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Не проходите мимо похожих тем, они помогут вам в решении проблемы

Помогите выбрать ноутбук из двух вариантов
Турбо Паскаль или Фри Паскаль. Задание по теме Типизированный файл
Проверить правильность решения – Паскаль.
Обсуждение пиратских ОС

Старый 25.01.2011, 09:56   #2 (permalink)
Vladimir_S
Специалист
 
Аватар для Vladimir_S
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 26,343
Сказал(а) спасибо: 288
Поблагодарили 507 раз(а) в 165 сообщениях
Репутация: 91953
По умолчанию

Цитата:
Сообщение от Mr.Програмист Посмотреть сообщение
Вот мой вариант:
Между прочим - куча ошибок. Не говоря уже о том, что использование меток и переходов по меткам - вообще дурной стиль.
Цитата:
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;
__________________
With Mozilla Firefox - straight to communism!
Vladimir_S вне форума   Ответить с цитированием
Старый 25.01.2011, 12:08   #3 (permalink)
Mr.Програмист
Banned
 
Регистрация: 25.01.2011
Сообщений: 27
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию


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.
Mr.Програмист вне форума   Ответить с цитированием
Старый 25.01.2011, 12:40   #4 (permalink)
Vladimir_S
Специалист
 
Аватар для Vladimir_S
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 26,343
Сказал(а) спасибо: 288
Поблагодарили 507 раз(а) в 165 сообщениях
Репутация: 91953
По умолчанию

Уже лучше, но вот эта строка:
Цитата:
a[i]:=random(10000)-10000;
по-прежнему никуда не годится.
Операция Random(N) возвращает случайно выбранное целое число в диапазоне 0..(N-1); соответственно Random(N)-N возвращает число в диапазоне -N..-1, т.е. опять ВСЕ БЕЗ ИСКЛЮЧЕНИЯ элементы массива оказываются отрицательными и задача полностью теряет смысл.
P.S. Чтобы не путать заказчицу, перенесу обсуждение Вашей программы в отдельную тему.
__________________
With Mozilla Firefox - straight to communism!
Vladimir_S вне форума   Ответить с цитированием
Старый 25.01.2011, 15:17   #5 (permalink)
Mr.Програмист
Banned
 
Регистрация: 25.01.2011
Сообщений: 27
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

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

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 25.01.2011, 16:02   #6 (permalink)
Vladimir_S
Специалист
 
Аватар для Vladimir_S
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 26,343
Сказал(а) спасибо: 288
Поблагодарили 507 раз(а) в 165 сообщениях
Репутация: 91953
По умолчанию

Цитата:
Сообщение от Mr.Програмист Посмотреть сообщение
Уважаемый Vladimir S [SPOILER]Не подумайте что я ноль в Паскале я его довольно хорошо знаю просто я ещё учусь в школе 9 класс и всех тонкостей не знаю[/SPOILER]
Расскажите как сделать так как надо по задаче.
Ну... один из вариантов решения "так, как надо" был мною выложен:
Паскаль массивы
Посмотрите внимательно.
P.S. К сожалению, тег "Spoiler" на этом форуме не задействован.
P.P.S. И еще пара замечаний. Во-первых, если Вы видите, что кто-то из программистов уже выложил решение задачи, то не следует выкладывать своё (по принципу "А вот мой вариант!"), если только Вы не уверены, что Вам удалось найти существенно лучшее решение или что выложенное содержит принципиальные ошибки - это просто невежливо по отношению к коллеге. Кроме того, даже если на Ваш взгляд программа совсем простая, нужно обязательно провести ее тестирование: оттранслировать, запустить и т.д., а не просто "написал-выложил".
__________________
With Mozilla Firefox - straight to communism!
Vladimir_S вне форума   Ответить с цитированием
Старый 25.01.2011, 18:46   #7 (permalink)
Fenix
404
 
Аватар для Fenix
 
Регистрация: 10.01.2010
Сообщений: 1,749
Записей в дневнике: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 3868
По умолчанию

полностью согласен с Vladimir_S. ну и что что ты в 9-м учишься? я допустим учусь в 11м и паскаль также проходил только в 9-м классе. В любом случае если ты помогаешь решать кому-то, то сам сначала реши. причем не на литске бумаги, а в самом паскале. Протестируй на предельные значения и прочее. Со всем уважением. Успехов в изучении паскаля.
Fenix вне форума   Ответить с цитированием
Старый 26.01.2011, 14:29   #8 (permalink)
Mr.Програмист
Banned
 
Регистрация: 25.01.2011
Сообщений: 27
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Сделаем немного эффективнее
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;
Я тоже не проверял, но думаю заработает
Mr.Програмист вне форума   Ответить с цитированием
Старый 26.01.2011, 18:24   #9 (permalink)
AlexZir
support
 
Аватар для AlexZir
 
Регистрация: 19.08.2007
Адрес: Зея
Сообщений: 14,452
Записей в дневнике: 56
Сказал(а) спасибо: 123
Поблагодарили 149 раз(а) в 61 сообщениях
Репутация: 59583
По умолчанию

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

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

Просьба к вам - используйте тег [ code ] для оформления листинга
__________________
Убить всех человеков!
AlexZir вне форума   Ответить с цитированием
Старый 13.02.2011, 04:23   #10 (permalink)
Mr.Програмист
Banned
 
Регистрация: 25.01.2011
Сообщений: 27
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Вот моя задача чтобы раскачать тему. Разбирайте.
Код:
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.

Последний раз редактировалось Mr.Програмист; 13.02.2011 в 04:28
Mr.Програмист вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




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

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.