Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Задача про билеты (Турбо паскаль)

Автор: South Fruit 10.04.2007 16:17

В зрительном зале 25 рядов в каждом из которых 36 мест (кресел). Информация о проданных билетах хранится в двухмерном массиве , номера строк которого соответствуют номерам рядов , а номера столбцов - номера мест. Если билет на то или иное место продан , то соответствующий элемент массиваимеет значение 1, в противном случае - 0. Составить программу , определяющую число проданных билетов на места в 12-ом ряду.

Срочно помогите решить данную задачу.
Извините за заголовок, времечко давит sad.gif

Автор: Lapp 10.04.2007 16:43

В программе должен участвовать массив, описанный ниже, и цикл:

var
Zal:array[1..25,1..36]of integer;
...
n:=0;
for i:=1 to 36 do n:=n+Zal[12,i];

Автор: South Fruit 10.04.2007 16:47

А если полный код программы с комментариями, то платно?

Автор: Lapp 10.04.2007 16:53

Ну, попробуй сам, а?.. Хоть основное допиши. Мы дополним..
Не за что там деньги брать, ей-Богу..
и спотыкаться не обо что.. соберись, сядь, возьми примеры.. smile.gif давай, у тебя получится!

Автор: Айра 10.04.2007 17:04

Первым пунктом программы должно быть создание массива (можно вводить вручную, а можно и заставить комп поработать). Далее проверяешь продан билет или нет, увеличиваешь количество проданных и выводишь результат на экран. Все просто)))

p.s. Могу выложить код, но лучше попробуй сам)))

Автор: South Fruit 10.04.2007 17:44

Ой ребята, как у вас здорово smile.gif спсибо за поддержку smile.gif сейчас попробую smile.gif

Добавлено через 14 мин.
ну у Lapp выше уже указан массив...правильно?

Добавлено через 3 мин.

  n:=0;
for i:=1 to 36 do n:=n+Zal[12,i];


Вот это не пойму...
 for i:=1
- это продан билет?

Добавлено через 2 мин.
Книги вот заказал жду, а сейчас вот даже не знаю что писать ребята sad.gif но выучить очень хочу, не хочу халявщиком быть! nea.gif

Автор: Айра 10.04.2007 19:00

for i:=1 to 36 do 

это значит, что переменная i будет изменяться от 1 до 36 (1,2,3...34,34,35). В твоем случае это места в зале.

Вот код программы, попробую объяснить как она работает:
uses wincrt;
{Начнем по порядку. Массив Lapp естественно указал правильно. Тебе понадобятся еще три}
{переменные: i - чтобы проходить циклом по креслам, j - чтобы проходить по рядам и k - количество}
{ проданных билетов}
var m: array[1..25,1..36] of integer;
k,i,j: integer;
begin
k:=0; {изначально количество проданных у нас равно 0}
{Сначала надо создать массив из проданных и свободных кресел. Так как вводить с клавиатуры 900 мест}
{ достаточно проблематично))) предлагаю заполнить его с помощью функции random (генератор случайных }
{чисел):}
randomize; {включаем генератор}
for j:= 1 to 25 do {в этих циклах компьютер проходит по каждому креслу каждого ряда}
for i:=1 to 36 do
begin
m[j,i]:=random(2); {а сдесь случайным образом задается 0 или 1}
end;
for i:=1 to 36 do {пробегаем по креслам 12-го ряда}
k := k + m[12, i]; {почему так, ниже объяснил volvo}
writeln(k); {выводим результат}
end.

Вот вроде и все, если что непонятно - спрашивай)))

p.s. "Оля, вот этого я от тебя никак не ожидал... smile.gif" Спасибо за исправление, проскакивают еще глупые ошибки)))

Автор: volvo 10.04.2007 19:04

Оля, вот этого я от тебя никак не ожидал... smile.gif Если уже работаем с 0/1, то не проще посчитать сумму элементов строки? Лишний If в программе, все-таки...

for i:=1 to 36 do
k := k + m[12, i];
writeln(k);

Автор: South Fruit 10.04.2007 19:18

uses wincrt; 

до begin идет массив от Lapp да?
и переменные тоже прописать? (integer...?)

Добавлено через 17 мин.
Error 15: File not found WINCRT.TPU blink.gif это что значит? При компиляции выскакивает..

Автор: Tan 10.04.2007 19:44

пиши просто uses crt;

Автор: Айра 10.04.2007 19:46

Цитата
Цитата
uses wincrt;

Добавлено через 17 мин.
Error 15: File not found WINCRT.TPU это что значит? При компиляции выскакивает..

Это значит что библиотека не найдена, у меня компилятор недоделанный какой-то, поэтому без этой строчки ни одна программа не работает. Удали ее и все будет нормально или замени на
uses crt;


Цитата
до begin идет массив от Lapp да?
и переменные тоже прописать? (integer...?)

Все правильно))) Только смотри, чтоб названия переменных дальше в программе совпадали. Я же массив обозвала m, а у Lapp'а Zal.

Автор: South Fruit 10.04.2007 23:48

Ребята вот гляньте пожалуйста, все вроде правильно, а массив то у тебя Айра ведь итак прописан уже..или я ошибаюсь?
Проблема в том что при запуске (Run) просто промаргивает черный экран и все ... может задержку как то прописать?

Вот при вводе вроде нигде не ошибся, а она только моргает unsure.gif

Изображение

Добавлено через 2 мин.

program zadacha;
uses crt;


и т.д. как ты написала unsure.gif

Автор: arhimag 10.04.2007 23:53

readln;
в конец и все хорошо smile.gif
P.S. до "End." конечно.
P.P.S. Что бы посмотреть результат, можно Alt+f5

Автор: South Fruit 10.04.2007 23:55

Вообщем поставил

Delay(10000);
теперь можно смотреть.
Выводит вот что blink.gif

Изображение


Добавлено через 1 мин.
readln;? пасиб буду знать smile.gif

Добавлено через 32 сек.
А почему значение всегда разное...?

Добавлено через 1 мин.
Что то я смысла не пойму, получается она при разных обстоятельтвах показывает кол-во проданных билетов на 12 ряд?

Автор: Dark Vova 11.04.2007 0:10

Цитата
А почему значение всегда разное...?

Потому что количество проданных билетов берется рандомом.

Автор: South Fruit 11.04.2007 0:27

Точно, спасибо smile.gif

Автор: Айра 11.04.2007 1:29

Когда ты ставишь в конце readln программа будет ждать от тебя ввода, а это в ней лишнее. Разве что так, для себя поставить, а когда сдавать программу будешь, убрать. Так что просто жми Alt+F5 smile.gif
Кстати, если убрать строчку randomize, то числа всегда будут одни и теже и результат соответственно тоже.

Автор: South Fruit 11.04.2007 9:14

Так без readln просто промаргивает экран черный blink.gif

Добавлено через 1 мин.
А чем отличается Alt+F5 от Ctrl+F9 ? smile.gif

Автор: Lapp 11.04.2007 9:40

Цитата(South Fruit @ 11.04.2007 6:14) *

А чем отличается Alt+F5 от Ctrl+F9 ? smile.gif

Ctrl-F9 - это запуск задачи на выполнение.
Alt-F5 - это просто просмотр уже полученных результатов.

Представь себе, что окно с программным текстом как бы находится поверх обычного окна с командной строкой (знаешь командную строку?). Задача твоя запускается в командной строке. Считается она быстро, поэтому если ее не задержать, отрабатывает и снова тебе показывают текст. Если вставить ReadLn, то программа не закончит работу, пока ты не нажмешь Enter. Это дает тебе возможность просмотреть, что она выдала.
Но если даже ReadLn'а нету, то ты все равно можешь просмотреть резульат, убрав окно с текстом программы и заглянув "под него". Для этого и служит Alt-F5. Это просто просмотр, ты ничего в этом режиме не можешь сделать оеально. Нажатие любой клавиши врзвращает тебя в окно текста программы.

Понятно?

Добавлено через 5 мин.
Если ты запустил задачу, она отработала, а потом ты изменил что-то в программе, то нужно нажимать только Ctrl-F9. А Alt-F5 тебе не поможет - она только опять покажет старые результаты.

Загляни в меню Run и Compile. Там ты увидишь эти "горячие клавиши" напротив тех действий, которые они выполняют. И может, найдешь еще что-то полезное.. smile.gif

Автор: South Fruit 11.04.2007 16:35

Цитата
(знаешь командную строку?).

Конечно smile.gif
Все понял smile.gif

Насчет задачки, то не правильно у нас sad.gif
Дело в том что нужна матрица которая как бы покажет номера рядов и номера столбцов и в ней наглядно должно быть видно точное кол-во билетов на 12 ряд blink.gif

Автор: Айра 11.04.2007 18:12

Цитата
Дело в том что нужна матрица которая как бы покажет номера рядов и номера столбцов и в ней наглядно должно быть видно точное кол-во билетов на 12 ряд

Т.е. надо чтоб каждый раз одно и тоже число проданных билетов было и матрицу надо вывести на экран? Всю или только 12 ряд?

Добавлено через 1 мин.
Или нужно просто вывести номера свободных кресел и уже занятых?

Автор: South Fruit 11.04.2007 20:35

Ну сказали что должна быть матрица, из рядов и столбцов и чтоб все было в ней видно и понятно, что где продано и свободно и т.д. Ну вобщем подробно должно быть все unsure.gif

Автор: arhimag 11.04.2007 22:00

Код

var zal: array[1..25,1..36] of integer;
Radi : array [1..36] of integer;
k : integer;

procedure Buy_ticket;
var i,j,x,y : integer;
begin
  for i:= 36 downto 1 do begin
    if i>9 then
      write(i,': ')
    else
      write(i,' : ');
    for j:= 1 to 25 do
      write(zal[j,i],'|');
    writeln;
  end;
  Writeln('Vvedite rad, v kotorom Vi hotite sidet(ili 0, chtobi zakrit kassu):');
  Read(y);
  if y=0 then begin
    Writeln('Kassa zakrita:');
    Writeln('Vvedite nomer rada, kolichestvo zanatih mest kotorogo nuzno poschitat:');
    Read(k);
  end else begin
    Writeln('Vvedite mesto, na kotorom hotite sidet:');
    Read(x);
    If zal[x,y]=0 Then begin
      zal[x,y]:=1;
      inc(Radi[y]);
      Writeln('Pozdravlajem, Vi kupili bilet!');
    end else
      Writeln('K sozaleniju eto mesto uze zanato!');
  end;
end;


var i,j,count : integer;
begin
  for i:= 1 to 36 do begin
     Radi[i]:=0;
     for j:=1 to 25 do
        zal[j,i]:=0;
  end;
  k:=0;
  while k=0 do
    buy_ticket;
  write(radi[k]);
  readln;
  readln;
end.

Если я правильно все понял, то вот.

Автор: South Fruit 11.04.2007 23:50

arhimag
Спасибо огромное, хотя я не доконца уверен что это именно и есть решение задачи, так как билет всегда один..
Извините, а можно прокомментировать как можно подробнее что где как и зачем в этом коде, так как хотелось бы самому во всем разобраться и понять unsure.gif

Автор: Айра 12.04.2007 0:04

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

Ну тогда сделай так:
Program zadacha;
var m: array[1..25,1..36] of integer;
k,i,j: integer;
begin
k:=0;
randomize;
for i:= 1 to 25 do
begin
write('ряд ',i,' '); {сдесь выводим подряд}
for j:=1 to 36 do
begin
m[i,j]:=random(2);
write('',m[i,j],' '); {и тут}
end;
writeln; {а тут переходим на новую строчку}
end;
for j:=1 to 36 do
k := k + m[12, j];
writeln('В 12 ряду ',k,' проданных билетов');
end.


Добавлено через 11 мин.
arhimag, задумка конечно неплохая, но прога доработки требует smile.gif

Автор: South Fruit 12.04.2007 0:21

Айрочка
Вот как то по красивее smile.gif если не сложно укажи пожалуйста какие мы функции используем, только если это не сложно и не займет много времени.

P.S. Почему я репу поднять не могу? unsure.gif

Автор: arhimag 12.04.2007 0:33

Код
var zal: array[1..25,1..36] of integer;{Наш массив, где мы храним кинотеатральный зал}
Radi : array [1..36] of integer;{Массив в котором будем хранить сколько билетов купленно на этом ряду}
k : integer;{Номер, ряда количество купленнов билетов надо вывести}

procedure Buy_ticket;{ Процедура покупки билета}
var i,j,x,y : integer; {Две переменные цикла, и переменные означающие координаты купленного билета}
begin
  for i:= 36 downto 1 do begin {Начало вывода зала. Сначала будем рассматривать последний ряд, потом предпоследний ..., а потом первый}
    if i>9 then { Это чисто для красоты, чтобы зал был ровным, т.к. у нас есть и двузначные номера ряда и однозначные, то после однозначных надо поставить лишний пробел, а все однозначные - это меньшие 10, а все двузначные - большие 9}
      write(i,': '){Выводим номер ряда и двоеточие с пробелом после него, до двоеточия пробела нет, т.к. эти числа двузначяные}
    else
      write(i,' : ');{Выводим номер ряда и пробел и двоеточие и пробел после него, пробел есть так как числа однозначные}
    for j:= 1 to 25 do {Пробегаем по всему ряду с первого места до последнего}
      write(zal[j,i],'|');{И выводим, куплено ли это место или нет(1 - если купленно и 0 - если нет) ну и конечно, для красоты разделитель}
    writeln;{Переводим курсор на следующую строчку}
  end;
  Writeln('Vvedite rad, v kotorom Vi hotite sidet(ili 0, chtobi zakrit kassu):');{Выводим сообщение с инструкциями}
  Read(y);{Считываем номер ряда, в котором желает сидеть клиент}
  if y=0 then begin {Если нам надоест вводить данные, то мы закрываем кассу, что бы закончить покупку билетов, а закрываем мы кассу, вводя в номер ряда 0}
{Если закрыли, то}
    Writeln('Kassa zakrita:');{Выводим сообщение с инструкциями}
    Writeln('Vvedite nomer rada, kolichestvo zanatih mest kotorogo nuzno poschitat:');{Выводим сообщение с инструкциями}
    Read(k);{Считываем номер ряда, что бы вывести количество проданых на нем билетов}
  end else begin {А если нет, то}
    Writeln('Vvedite mesto, na kotorom hotite sidet:');{Выводим сообщение с инструкциями}
    Read(x);{Считываем номер места в ряду, на котором хочет сдеть клиент}
    If zal[x,y]=0 Then begin {Если это место свободно, то}
      zal[x,y]:=1; {Оно становится занятым}
      inc(Radi[y]); {И мы увеличиваем количество занятых мест на этом ряду на единицу}
      Writeln('Pozdravlajem, Vi kupili bilet!');{Выводим сообщение с поздравлением}
    end else{А если это место занято, то}
      Writeln('K sozaleniju eto mesto uze zanato!');{выводим сообщение об этом}
  end;
end;


var i,j : integer;{переменные цикла}
begin {Начало Главной Процедуры, ну программы тоесть}
  for i:= 1 to 36 do begin          {Пробегаем по все рядам с первого до последнего}
     Radi[i]:=0;                    {Выставляем количество занятых мест на этом ряду равным 0}
     for j:=1 to 25 do              {Пробегаем по всем местам с первого до последнего}
        zal[j,i]:=0;                {И устанавливаем, что это место свободно}
  end;
  k:=0;                             {Выставляем переменную K равной нулю, для того что бы отследить, когда она изменится}
  while k=0 do                      {Пока т.к. 0 ряда не существует, то когда пользователь закроет кассу и захочит посмотреть результат по ряду, то переменная К не будет равна 0, 100% }
    buy_ticket;                     {Ну а раз касса не закрыта, то мы можем продавать билеты, что мы  и делаем, вызывая ранее написанную процедуру}
  write(radi[k]);                   {Выводим количество занятых мест в ряду К, просто выведя значения элемента массива, соответсвующего этому ряду}
  readln;                           {Ждем нажатия Enter}
  readln;                           {Ждем нажатия Enter}
end.

Автор: South Fruit 12.04.2007 0:47

arhimag
Ого, спасибо огромное, буду разбираться.

Автор: Артемий 12.04.2007 1:04

Цитата
P.S. Почему я репу поднять не могу?

blum.gif blum.gif blum.gif 25 постов!

Автор: Айра 12.04.2007 2:57

Цитата
Вот как то по красивее если не сложно укажи пожалуйста какие мы функции используем, только если это не сложно и не займет много времени.

Воть, если еще нужно:
Program zadacha;
uses crt;
var m: array[1..25,1..36] of integer; {естественно массив и переменные, с ними ты уже наверно разобрался}
k,i,j: integer;
begin
k:=0; {обнуляем количество проданных}
randomize; {включаем генератор случайных чисел}
for i:= 1 to 25 do {это цикл со счетчиком, здесь он проходит по рядам}
begin
write('ряд ',i,' '); {оператор write выводит все в одну строку}
for j:=1 to 36 do
begin
m[i,j]:=random(2); {функция random генерирует целые числа в пределах 0<=x<диапазон,}
{ а 2-йка тут - это и есть диапазон, начиная с нее числа не берутся}
write('',m[i,j],' '); {опять вывод в строчку}
end;
writeln; {оператор writeln каждый результат будет выводить на новой строчке}
end;
for j:=1 to 36 do {опять цикл со счетчиком, только здесь идем по креслам}
k := k + m[12, j]; {суммируем значения и получаем количество проданных}
writeln('В 12 ряду ',k,' проданных билетов'); {выносим его на всеобщее обозрение)))}
end.


p.s. прости за задержку, не было возможности выйти в инет(((

Автор: volvo 12.04.2007 3:13

Цитата
{ Это чисто для красоты, чтобы зал был ровным, т.к. у нас есть и двузначные номера ряда и однозначные, то после однозначных надо поставить лишний пробел, а все однозначные - это меньшие 10, а все двузначные - большие 9}
Специально чтобы избежать подобного кодирования, кстати, в Паскале придумали форматный вывод:

write(i:2, ':');

и программе все равно, один или 2 символа в представлении i - оно все равно займет 2 места...

Автор: South Fruit 12.04.2007 8:26

Цитата
Воть, если еще нужно:

Конечно нужно smile.gif спасибо большое!

Цитата
25 постов!

Понятно blum.gif

Цитата
Специально чтобы избежать подобного кодирования, кстати, в Паскале придумали форматный вывод:

write(i:2, ':');


и программе все равно, один или 2 символа в представлении i - оно все равно займет 2 места...

Интересная информация.

Автор: South Fruit 12.04.2007 19:16

Айрочка все супер все объяснил здал и еще модифицировал ;) если хочешь кину код глянуть smile.gif

У меня к тебе еще просьбочка будет с этой задачей (ниже) это не мне просто попросили на вашем форуме разместить, если тебе не сложно реши пожалуйста (или может кто еще решить сможет? unsure.gif )

Дан файл товар, который содержит сведения об экспортируемых товарах с указанным наименованием товара страна импорта товара и объемом постоянной партии. Составить список стран в которые экспортируются данные товары и указать общий объем его экспорта.
Вот такая задача, нужно до завтра человеку.

Автор: Айра 12.04.2007 19:28

Другую задачу надо сделать отдельной темой, а то правила нарушаем.

Добавлено через 3 мин.

Цитата
все супер все объяснил здал и еще модифицировал ;) если хочешь кину код глянуть

Можешь выложить здесь или отправить в личку)))


Автор: South Fruit 12.04.2007 19:40

 Program zadacha;
uses crt;
var m: array[1..25,1..36] of integer;
k,i,j: integer;
begin
k:=0; {obnulyaem kol-vo prodannih}
randomize;
write(' ');
for i:= 1 to 36 do
begin
if i<10 then write (i,' ') else write(i);
end;
writeln;
for i:= 1 to 25 do {cikl so schtchikom prohodit po ryadam}
begin
if i <10 then
write(i ,' ')
else write(i,' '); {operator write vivodit vse v odnu stroku}
for j:=1 to 36 do
begin
m[i,j]:=random(2); {funkciya random generirue3t celie chisla v predelah 0<=x<diapazon,}
{ a 2-yka eto diapazon, nachinaya s nee chisla ne berutsya}
write('',m[i,j],' ');
end;
writeln;
end;
for j:=1 to 36 do {cikl so schetchikom po kreslam}
k := k + m[12, j]; {summiruem znachenie i poluchaem kol-vo prodannih}
writeln('v 12 ryadu ',k,' prodannih biletov');
readln;
end.


rolleyes.gif rolleyes.gif rolleyes.gif

Добавлено через 50 сек.
Воть - http://forum.pascal.net.ru/index.php?showtopic=16644

Автор: Айра 12.04.2007 19:56

Молодец! smile.gif Но только лучше было бы воспользоваться форматным выводом, как объяснил volvo. Это правильнее и проще. Попробуй так сделать)))