Автор Тема: Вспоминаем Turbo Pascal и решаем задачи на нём  (Прочитано 49296 раз)

0 Пользователей и 3 Гостей просматривают эту тему.

Оффлайн Fly

  • Пользователь
  • Сообщений: 1896
  • Пол: Мужской
    • Steam
    • Youtube
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #120 : 06 Декабрь 2009, 04:14:59 »
А тут, кстати, цикл вообще не обязателен. В задании написано, что матрица 4х3, значит, можно тупо написать
writeln('Сумма первой строки равна ', matr[1,1]+matr[1,2]+matr[1,3],';');
writeln('cумма второй строки равна ', matr[2,1]+matr[2,2]+matr[2,3],';');
writeln('cумма третьей строки равна ', matr[3,1]+matr[3,2]+matr[3,3],';');
writeln('cумма четвёртой строки равна ', matr[4,1]+matr[4,2]+matr[4,3],'.');
readkey
end.
Задание выполнено.:)
« Последнее редактирование: 06 Декабрь 2009, 04:17:17 от Fly »

Оффлайн topos84

  • Emu-Land Team
  • Сообщений: 2762
  • Пол: Мужской
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #121 : 06 Декабрь 2009, 11:57:04 »
А тут, кстати, цикл вообще не обязателен. В задании написано, что матрица 4х3, значит, можно тупо написать
writeln('Сумма первой строки равна ', matr[1,1]+matr[1,2]+matr[1,3],';');
writeln('cумма второй строки равна ', matr[2,1]+matr[2,2]+matr[2,3],';');
writeln('cумма третьей строки равна ', matr[3,1]+matr[3,2]+matr[3,3],';');
writeln('cумма четвёртой строки равна ', matr[4,1]+matr[4,2]+matr[4,3],'.');
readkey
end.
Задание выполнено.:)
Ну знаешь ли, это уже как-то не по-программистски.
Лучше действительно оформить решение с константами размерности матрицы, а то ведь потом может попасться другая, сходная с этой, задачка, но потруднее, и, если gepar не усвоит общий вид решения таких задач (т.е. с произвольной размерностью матрицы), то ему будет трудно эту новую задачу решить.

Короче, не всегда нужно искать самый простой путь решения задачи, потому что пользы в будущем от него может быть меньше, чем в настоящем, а обучение чему бы то ни было все-таки направлено на овладение знаниями и умениями для применения их в будущем (как минимум на зачете/экзамене ;)).

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #122 : 06 Декабрь 2009, 16:09:30 »
Ну я то первое задание решил вот так :
program proga211;
uses crt;
const
m=4;
n=3;
var
matr:array[1..m,1..n] of integer;
i,j,s:integer;
Begin
     for i:=1 to m do
     for j:=1 to n do
     Begin
          writeln('Enter element ',i,' ',j,' ');
          read(matr[i,j]);
     end;
     for i:=1 to m do Begin
     for j:=1 to n do
     write(matr[i,j]:4);
     writeln;
     end;
     for i:=1 to m do
     Begin
     for j:=1 to n do
     s:=s+matr[i,j];
     writeln('Summa ',i,' stroki = ',s);
     s:=0;
     end;
end.
Вот только я дальше застрял на других заданиях посложнее . Определите сумму элементов  расположенных выше главной диагонали (матрица 4х4) . Я это задание решил тем что определял сумму по типу a[1,2]+a[1,3] ну и т.д тобишь просто выписал индексы тех элементов что над главной диагонали , но это как-то неправильно по моему -
Цитата: topos84
это уже как-то не по-программистски
  .Ну и второе место где застрял это поменять местами строки и столбци  матрици (размер 4x4) . Как это сделать что-то не придумаю , может быть у кого-то из посетителей даной темы есть идеи как это реализовать ?

Оффлайн Fly

  • Пользователь
  • Сообщений: 1896
  • Пол: Мужской
    • Steam
    • Youtube
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #123 : 06 Декабрь 2009, 16:57:41 »
Цитата: gepar
Определите сумму элементов  расположенных выше главной диагонали (матрица 4х4) .
Складывай элементы, у котоых j > i.
Цитата: gepar
Ну и второе место где застрял это поменять местами строки и столбци  матрици (размер 4x4) .
Ну делаешь как обмен значениями переменных. Допустим, надо поменять строки a и b. Делаешь цикл по i, а там
buf:=matr[a,i];
matr[a,i]:=matr[b,i];
matr[b,i]:=buf;

Оффлайн topos84

  • Emu-Land Team
  • Сообщений: 2762
  • Пол: Мужской
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #124 : 06 Декабрь 2009, 16:58:27 »
Цитата: gepar
Я это задание решил тем что определял сумму по типу a[1,2]+a[1,3] ну и т.д тобишь просто выписал индексы тех элементов что над главной диагонали , но это как-то неправильно по моему -
Неправильно в смысле не в общем случае решено (т.е. без введения константы n, а просто для конкретного случая n=4)? Ну никто не заставляет, наверное, тебя решать в общем случае. В задаче не указано, как требуется ее решать. Однако, я бы тебе посоветовал решать в общем случае, так как это всегда оказывает положительное воздействие на преподов по программированию. В этом случае, решение уже будет явно "по-программистски".

Цитата: gepar
Ну и второе место где застрял это поменять местами строки и столбци  матрици (размер 4x4) . Как это сделать что-то не придумаю , может быть у кого-то из посетителей даной темы есть идеи как это реализовать ?

Поменять местами строки и столбцы квадратной матрицы это значит транспонировать ее, что в свою очередь означает произвести симметрию относительно главной диагонали. Т.е. нужно обменять значения элементов a(i, j) и a(j, i) для всех i, j = 1, ..., n (вспомни фокус с переменной buf).

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #125 : 06 Декабрь 2009, 20:38:42 »
Спасибо за подсказки Fly и topos84 . Сейчас попробую домучать матрицы , а там за строки примусь   :)

Добавлено позже:
Цитата: Fly
Ну делаешь как обмен значениями переменных. Допустим, надо поменять строки a и b. Делаешь цикл по i, а тамbuf:=matr[a,i];matr[a,i]:=matr[b,i];matr[b,i]:=buf;
Что-то это не получаеться -не происходит обмен чисел , не пойму что же я указал не верно .
Код
program proga218;
uses crt;
const
m=4;
n=4;
var
a:array[1..m,1..n] of integer;
i,j,buf:integer;
Begin
     randomize;
     for i:=1 to m do
     for j:=1 to n do a[i,j]:=random(21)-5;
     writeln('Your array : ');
     for i:=1 to m do
     Begin
          for j:=1 to n do write (a[i,j]:4);
          writeln;
     end;
     for i:=1 to m do
     for j:=1 to n do
          Begin
               buf:=a[i,j];
               a[i,j]:=a[j,i];
               a[j,i]:=buf;
          end;
     writeln('Now array is : ');
     for i:=1 to m do
     Begin
          for j:=1 to n do write(a[i,j]:4);
          writeln;
     end;
end.

Оффлайн topos84

  • Emu-Land Team
  • Сообщений: 2762
  • Пол: Мужской
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #126 : 06 Декабрь 2009, 21:46:19 »
gepar, у тебя цикл какой-то наобумный. Во-первых, уточни, код к какой задаче ты тут представил ("транспонирование матрицы" или "поменять местами две строки")?

Если поменять местами две строки, то тогда там будет цикл ''for i:=1 to n do begin buf:=m[a,i]; m[a,i]:=m[b,i]; m[b,i]:=buf; end'', где a и b - номера строк, которые нужно поменять местами (как правильно тебе написал Fly). Никаких вложенных циклов (с j:=1 to n) тут быть не должно.

А если ты имел в виду транспонирование матрицы, то тут нужно лишь симметрично отразить элементы матрицы относительно главной диагонали, т.е. (n*n-n)/2 = n(n-1)/2 элементов матрицы, находящихся сверху от главной диагонали переместить в нижнюю часть, а нижние в верхнюю +  нужно будет устроить еще и проверку факта, был ли данный элемент в конкретной итерации уже заменен на симметричный ему в одной из предыдущей итерации или нет, иначе каждый элемент будет переставлен дважды, т.е. вернется на свое прежнее место, так как повторное транспонирование матрицы приводит к первоначальной матрице (транспонирование - инволютивное преобразование, если уж ругаться математикой)).

Оффлайн Fly

  • Пользователь
  • Сообщений: 1896
  • Пол: Мужской
    • Steam
    • Youtube
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #127 : 06 Декабрь 2009, 22:50:41 »
Кстати, подумал тут, если решать задачу транспонирования матрицы в общем случае, то обмен значениями делать нельзя, нужно записывать в новую матрицу размерности n x m. Или использовать массив m x m (при условии, что m > n), но не полностью.

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #128 : 06 Декабрь 2009, 23:49:22 »
Это было транспонирование матрицы , задание по смене местами двух строк у меня не было , там  в строках запара с удалением символов , ну да сейчас всё же попытаюсь покорить эту задачу на матрицы  :)

Цитата: topos84
А если ты имел в виду транспонирование матрицы, то тут нужно лишь симметрично отразить элементы матрицы относительно главной диагонали, т.е. (n*n-n)/2 = n(n-1)/2 элементов матрицы, находящихся сверху от главной диагонали переместить в нижнюю часть, а нижние в верхнюю +  нужно будет устроить еще и проверку факта, был ли данный элемент в конкретной итерации уже заменен на симметричный ему в одной из предыдущей итерации или нет, иначе каждый элемент будет переставлен дважды, т.е. вернется на свое прежнее место, так как повторное транспонирование матрицы приводит к первоначальной матрице (транспонирование - инволютивное преобразование, если уж ругаться математикой)).
Ну оно в принципе заметно что ты математик , вышку небось где-то в универе читаешь ? :)
Можешь помочь кодом ?Ато я транспонирование матрицы понимаю лишь как замену местами столбцов и строк , о симметрии относительно главной диагонали на вышке как-то у меня и не вспоминали .

Цитата: topos84
иначе каждый элемент будет переставлен дважды, т.е. вернется на свое прежнее место, так как повторное транспонирование матрицы приводит к первоначальной матрице (транспонирование - инволютивное преобразование, если уж ругаться математикой)).
Вот обратное транспонирование у меня какраз в коде как я теперь понял и происходит  :(

Оффлайн Fly

  • Пользователь
  • Сообщений: 1896
  • Пол: Мужской
    • Steam
    • Youtube
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #129 : 07 Декабрь 2009, 00:00:27 »
Цитата: gepar
Вот обратное транспонирование у меня какраз в коде как я теперь понял и происходит 
А вот чтобы не происходило, внутренний цикл делай от i. А лучше от i+1:
     for i:=1 to m-1 do
     for j:=i+1 to m do
          Begin
               buf:=a[i,j];
               a[i,j]:=a[j,i];
               a[j,i]:=buf
          end;
И да, если использовать одну матрицу, то она обязана быть квадратной, а значит константу n вводить не надо.

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #130 : 07 Декабрь 2009, 00:55:33 »
Fly, работает , m и n я знаю что одинаковые , но это я уже тоже по привычке , привык задавать колличество столбцов и строк двумя переменными и тогда уже и в квадратных матрицах их двумя задаю , ну да это ведь на результат не влияет .Спасибо за помощ кодом !
Я вот тут строками занялся , хотел бы узнать а с этим "pos" какие-то фишки можно делать ?Ну например искать указанную комбинацию из нескольких символов для последующего их удаления .Или можно только искать первый указанный символ и всё ?

Добавлено позже:
И ещё вопросик по заданию : в задании нужно подсчитать колличество гласных букв в строке , я это делаю по принципу
(if a=a) or (a=e) or (a=u) ... then inc(c) . Есть более быстрый способ перечислять кучу условий для которых нужно делать одну и ту же операцию ?

Оффлайн topos84

  • Emu-Land Team
  • Сообщений: 2762
  • Пол: Мужской
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #131 : 07 Декабрь 2009, 01:20:37 »
Цитата: gepar
(if a=a) or (a=e) or (a=u) ... then inc(c) . Есть более быстрый способ перечислять кучу условий для которых нужно делать одну и ту же операцию
Есть! Множество организуй. Множество задашь перечислением в разделе объявления переменных. А затем, уже в теле программы, будет условие im a in M then, где М - то самое множество гласных букв, которое ты опишешь в разделе переменных.

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #132 : 07 Декабрь 2009, 01:45:44 »
Цитата: topos84
Есть! Множество организуй. Множество задашь перечислением в разделе объявления переменных. А затем, уже в теле программы, будет условие im a in M then, где М - то самое множество гласных букв, которое ты опишешь в разделе переменных.

Значит пока никак  :lol: Множество у меня немного дальше идёт  , пока не читал ещё о нём .
Ну и очередное задание где застрял :
Введённую строку А записать в обратном порядке в строку Б .Строку Б вывести на экран.
Код:
program proga228;
uses crt;
var
a:string;
b:string;
i,c:integer;
Begin
     writeln('Enter string A');
     read(a);
     c:=0;
     for i:=length(a) downto 1 do
     Begin
         c:=c+1;
         b[c]:=a[i];
     end;
     writeln('String B :');
     writeln(b);
end.

Немогу понять почему не происходит присваивания строке Б .Явно что-то не так , вот только что .

Добавлено позже:
Методом проверки а присвоиться ли b хоть что-то понял что не присвоиться , знать я так понял метод присваивания по типу b[n]:=a[n] со строками работать не будет , а жаль .

Добавлено позже:
Уже разобрался что нужно было изначально указать длину  B чтобы присваивание по такому типу происходило .Странно , ведь изначально длина была не указана , а знать она была должна быть 255 и символы должны были нормально присваиваться  :?

Оффлайн Fly

  • Пользователь
  • Сообщений: 1896
  • Пол: Мужской
    • Steam
    • Youtube
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #133 : 07 Декабрь 2009, 01:54:19 »
Во-первых, в строку b символы строки a записываются, но её длина не увеличивается (не меняется b[0]), в результате паскаль выводит 0 символов. Во-вторых, куда проще элементы строки a не присваивать элементам b, а дописывать к b.
     b:='';
     for i:=length(a) downto 1 do b:=b+a[i];


Добавлено позже:
И да, тебя кто так учил задавать переменные одного типа?:)
Цитата
a:string;
b:string;

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #134 : 07 Декабрь 2009, 02:07:55 »
Цитата: Fly
И да, тебя кто так учил задавать переменные одного типа?Цитатаa:string;b:string;
Да никто , я когда b ничего не присваивалось решил что строки нельзя задавать по две сразу поэтому разделил их .
Цитата: Fly
Во-первых, в строку b символы строки a записываются, но её длина не увеличивается (не меняется b[0]), в результате паскаль выводит 0 символов. Во-вторых, куда проще элементы строки a не присваивать элементам b, а дописывать к b.Код:     b:='';     for i:=length(a) downto 1 do b:=b+a;
Учту .

Добавлено позже:
Теперь застрял на вот таком задании :Определить и вывести на экран длину самого большого слова во введённой строке .
Идей что-то по поводу его реализации у меня нет так как если через i задавать чтобы считалось колличество символов до пробела , а иначе break и дальше следующий цикл i так же до пробела то ... много кода будет да и это будет как-то не правильно помоему , или по другому покрасивее это задание сделать всё же не получиться ?

Оффлайн Fly

  • Пользователь
  • Сообщений: 1896
  • Пол: Мужской
    • Steam
    • Youtube
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #135 : 07 Декабрь 2009, 02:40:55 »
Можно так:
var a,i:byte;
    s,w:string;
begin
  write('Введите строку: ');
  readln(s);
  a:=1; s:=s+#32; w:='';
  for i:=1 to length(s) do
  if s[i]=#32 then begin
    if length(copy(s,a,i-a)) > length(w) then w:=copy(s,a,i-a);
    a:=i+1
  end;
  writeln(w)
end.

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #136 : 07 Декабрь 2009, 19:23:35 »
Fly,довольно интересное решение  :)Спасибо за помощ .
Задание :Есть матрица NxM. Получить последовательно все строки матрицы, за исключением тех, для которых есть равные среди строк с меньшими номерами.
Сделать нужно это используя подпрограммы .
Есть идеи как "это" решать используя подпрограммы ?Данное задание в отличии от предыдущих мне нужно будет сдавать поэтому пропустить его я не могу , а как подобраться к нему что-то идеи не возникают :(
« Последнее редактирование: 07 Декабрь 2009, 22:43:35 от gepar »

Оффлайн topos84

  • Emu-Land Team
  • Сообщений: 2762
  • Пол: Мужской
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #137 : 07 Декабрь 2009, 20:53:56 »
gepar, знать бы еще, как на русский переводится "ряды матриц". Тогда можно было бы и начать думать, как "это" решать. ;)

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #138 : 07 Декабрь 2009, 22:43:49 »
topos84,ряд-строка .

Оффлайн topos84

  • Emu-Land Team
  • Сообщений: 2762
  • Пол: Мужской
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #139 : 07 Декабрь 2009, 23:32:36 »
gepar, короче тебе нужно вывести на экран последовательность всех элементов матрицы, выводя их построчно, исключая лишь те строки, которые в этой последовательности строк уже встречались ранее? Ну, если так, то это не такое уж и трудное задание. Тебе нужны подпрограммы? Выбирай: процедуры или функции. Можешь и то и другое.

Как тебе функция sovpad(t), которая выдает true, если строка с номером t уже встречалась в матрице среди строк с номером, меньшим чем t, и false в противном случае? (Нужно будет лишь организовать поэлементное сравнение t-ой строки с i-ой строкой, для всех i:=1 to t-1).

А как тебе процедура vyvod(matr, s) вывода на экран s-той строки матрицы matr? (Обычный поэлементный вывод строки матрицы).

Ну вот, сооруди две такие подпрограммы и задача будет решена.

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #140 : 08 Декабрь 2009, 00:44:28 »
topos84, оно звучит то не плохо , но пока не видеться мне в виде одной работающей программы с подпрограммами , сейчас попробую домучить параметры , так как с ними что-то у меня составлять подпрограммы пока не получается , тогда возможно будет легче приниматься за это задание .

Оффлайн topos84

  • Emu-Land Team
  • Сообщений: 2762
  • Пол: Мужской
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #141 : 08 Декабрь 2009, 00:53:19 »
Цитата: gepar
сейчас попробую домучить параметры , так как с ними что-то у меня составлять подпрограммы пока не получается , тогда возможно будет легче приниматься за это задание
Верно, сперва разберись с теорией, а потом и к практике приступай. ;)

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #142 : 08 Декабрь 2009, 01:00:33 »
Цитата: topos84
Верно, сперва разберись с теорией, а потом и к практике приступай.
Да задание идёт до подпрограмм с параметрами после темы насчёт подпрограмм без параметров .
Что-то в гугле както глуховато (сразу вспомнилась выпадающая строка "Гугль глуховат полураздевшись" выпадающая раньше в гугле после вводе в поиск  слова "гугл" ) насчёт подпрограмм с параметрами  , а в учебнике не айс описали :(

Оффлайн Fly

  • Пользователь
  • Сообщений: 1896
  • Пол: Мужской
    • Steam
    • Youtube
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #143 : 08 Декабрь 2009, 01:37:27 »
Верно, сперва разберись с теорией, а потом и к практике приступай. ;)
А я всегда сначала к практике приступал, а потом с теорией разбирался.:D

Оффлайн topos84

  • Emu-Land Team
  • Сообщений: 2762
  • Пол: Мужской
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #144 : 08 Декабрь 2009, 01:58:36 »
Параметры - это то, что в скобках после имени подпрограммы? Ну так это просто аргументы, как у фунции. Типа f(x)=x^2 - функция. x - ее аргумент (то, что подается ей на вход), а x^2 - ее значение, т.е. то, что она делает с аргументом. Если функция от нескольких переменных, то аргументов у нее несколько, например так mult(x, y)= x*y. А с параметрами процедур то же самое, только на выходе они дают не конкретное значение, а результат проделанной ими работы (в случае функции одним из результатов обязано быть некоторое значение (значение функции), а у процедуры такого особого, отличного от всех остальных результатов ее работы, значения нет; собственно, в этом и есть наглядное отличие между функцией и процедурой).

Добавлено позже:
Если на пальцах объяснять, что такое подпрограммы, то я наверно объяснил бы так.

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #145 : 10 Декабрь 2009, 01:33:28 »
Что-то сложно мне даются конкретно подпрограммы .
Например непойму почему вот так :
program proga;
uses crt;
var
x,y,rez:real;
procedure suma(var s:real;a,b:real);
Begin
s:=a+b;
end;
Begin
    writeln('Enter x,y');
    read(x,y);
    suma(rez,x,y);
    writeln('Suma ',rez);
end.
программа работает , а если в начале в процедуре я сразу присвою и s и a и b значение real то программа уже не будет правильно работать .

Добавлено позже:
С назначением var в описании к процедуре немного разобрался , немного потому что пока что среди 3х методов передачи данных в подпрограмму пока мало вижу разницы .

Добавлено позже:
Немного почитал о подпрограммах , topos84, подкинь свои идеи в более расширенном виде если можно , попробую соорудить что ты говоришь  , ну а не получиться то буду знать над чем ещё поработать чтобы получилось :)

Оффлайн topos84

  • Emu-Land Team
  • Сообщений: 2762
  • Пол: Мужской
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #146 : 10 Декабрь 2009, 02:24:19 »
Цитата: gepar
программа работает , а если в начале в процедуре я сразу присвою и s и a и b значение real то программа уже не будет правильно работать .

Добавлено позже:
С назначением var в описании к процедуре немного разобрался , немного потому что пока что среди 3х методов передачи данных в подпрограмму пока мало вижу разницы .
Эмм, ну тут тонкий момент один есть, в подпрограммах-то. Нужно уметь различать глобальные переменные от локальных (глобальные переменные распространяются на всю программу, а локальные - только на конкретную подпрограмму; при этом локальная переменная [кстати говоря, про константы - та же песня] может иметь одинаковое с глобальной имя и даже тип, вот только тогда можно запутаться с их значениями, а потому лучше локальным переменным задавать другие имена, кроме тех случаев, где одноименная глобальной локальная переменная позволяет сэкономить на введении дополнительных переменных [но это уже изврат, нечего на них экономить]). Больше тонких моментов там, если мне не изменяет память, нет.

Цитата: gepar
topos84, подкинь свои идеи в более расширенном виде если можно , попробую соорудить что ты говоришь  , ну а не получиться то буду знать над чем ещё поработать чтобы получилось
Сначала ты свои подкинь. :)
Не буду же я за тебя задачи решать. Я только советом подсобить могу, да на ошибки в твоем коде могу указать, если ты их не можешь найти сам. ;)

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #147 : 11 Декабрь 2009, 01:16:17 »
Цитата: topos84
Сначала ты свои подкинь. Не буду же я за тебя задачи решать. Я только советом подсобить могу, да на ошибки в твоем коде могу указать, если ты их не можешь найти сам.
Так мне не код нужен , мне нужно что-то более чем
Цитата: topos84
Как тебе функция sovpad(t), которая выдает true, если строка с номером t уже встречалась в матрице среди строк с номером, меньшим чем t, и false в противном случае? (Нужно будет лишь организовать поэлементное сравнение t-ой строки с i-ой строкой, для всех i:=1 to t-1).
Это если у тебя идеи хорошие есть конечно же так как мне же все строки нужно по сравнивать , а не одну а для этого подпрограмма которая будет одну строчку t сравнивать будет маловато .

Добавлено позже:
Хм , написал программу при выполнении упражнений из самоучителя , но первый элемент всегда 0 , кто-нибудь  может подсказать почему ?
program proga271;
uses crt;
const
n=10;
var
m:array[1..n] of integer;
s:array[1..n] of integer;
i:integer;
procedure sorting(var mas:array of integer;m:array of integer);
var
i:integer;
Begin
     for i:=1 to high(m) do if m[i]>0 then mas[i]:=m[i]*2
     else mas[i]:=m[i];
end;
Begin
     clrscr;
     randomize;
     for i:=1 to n do m[i]:=random(20)-10;
     writeln('Your array is:');
     write('[ ');
     for i:=1 to n do write(m[i],' ');
     write(']');
     sorting(s,m);
     writeln;
     writeln('Now your array is:');
     write('[ ');
     for i:=1 to n do write(s[i],' ');
     write(']');
     readkey;
end.

P.S Тупой паскаль abc не понимает толком массивов заданных в процедурах без границ  <_<

Добавлено позже:
И ещё есть задание мол есть массив и нужно преобразовать все маленькие латинские буквы в нём в большие .Подскажите пожалуйста как задать условие что мол если элемент массива это маленькая латинская буква то тогда  ...
P.S В прикреплённом файле прога , с массивом первый элемент которого почему то всегда равен 0 .

Оффлайн topos84

  • Emu-Land Team
  • Сообщений: 2762
  • Пол: Мужской
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #148 : 11 Декабрь 2009, 02:15:20 »
Цитата: gepar
Это если у тебя идеи хорошие есть конечно же так как мне же все строки нужно по сравнивать , а не одну а для этого подпрограмма которая будет одну строчку t сравнивать будет маловато .
Блин, ну а кто же тебе запретит устроить потом в теле программы цикл
for i:=2 to t do if sovpad(t)=false then vyvod(matr,t)?

Добавлено позже:
Цитата: gepar
Хм , написал программу при выполнении упражнений из самоучителя , но первый элемент всегда 0 , кто-нибудь  может подсказать почему ?
Смотрим сюда:
for i:=1 to n do m[i]:=random(20)-10;А теперь сюда:
program proga271;
uses crt;
const
n=10;
var
m:array[1..n] of integer;
Если мне память не изменяет, функция random выдает число типа real, а не integer. Или я не прав?

Добавлено позже:
Цитата: gepar
И ещё есть задание мол есть массив и нужно преобразовать все маленькие латинские буквы в нём в большие .Подскажите пожалуйста как задать условие что мол если элемент массива это маленькая латинская буква то тогда  ...
Это тебе нужно знать номера символов в ASCII. А там уже легко разберешься сам.

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #149 : 11 Декабрь 2009, 14:33:56 »
Цитата: topos84
Это тебе нужно знать номера символов в ASCII. А там уже легко разберешься сам.
Ну первый маленький символ латиници 97 , последний 122 , а как задать само условие что если символ находиться в этой границе .... а в прочем у меня уже появилась идея , если не справлюсь с заданием я отпишусь  :)