Другое > Hard'n'Soft
Вспоминаем Turbo Pascal и решаем задачи на нём
<< < (8/15) > >>
gepar:
topos84, оно звучит то не плохо , но пока не видеться мне в виде одной работающей программы с подпрограммами , сейчас попробую домучить параметры , так как с ними что-то у меня составлять подпрограммы пока не получается , тогда возможно будет легче приниматься за это задание .
topos84:

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

--- Цитата: topos84 ---Верно, сперва разберись с теорией, а потом и к практике приступай.
--- Конец цитаты ---
Да задание идёт до подпрограмм с параметрами после темы насчёт подпрограмм без параметров .
Что-то в гугле както глуховато (сразу вспомнилась выпадающая строка "Гугль глуховат полураздевшись" выпадающая раньше в гугле после вводе в поиск  слова "гугл" ) насчёт подпрограмм с параметрами  , а в учебнике не айс описали :(
Fly:

--- Цитата: topos84 от 08 Декабрь 2009, 00:53:19 ---Верно, сперва разберись с теорией, а потом и к практике приступай. ;)

--- Конец цитаты ---
А я всегда сначала к практике приступал, а потом с теорией разбирался.:D
topos84:
Параметры - это то, что в скобках после имени подпрограммы? Ну так это просто аргументы, как у фунции. Типа f(x)=x^2 - функция. x - ее аргумент (то, что подается ей на вход), а x^2 - ее значение, т.е. то, что она делает с аргументом. Если функция от нескольких переменных, то аргументов у нее несколько, например так mult(x, y)= x*y. А с параметрами процедур то же самое, только на выходе они дают не конкретное значение, а результат проделанной ими работы (в случае функции одним из результатов обязано быть некоторое значение (значение функции), а у процедуры такого особого, отличного от всех остальных результатов ее работы, значения нет; собственно, в этом и есть наглядное отличие между функцией и процедурой).

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

--- Код: ---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:

--- Цитата: gepar ---программа работает , а если в начале в процедуре я сразу присвою и s и a и b значение real то программа уже не будет правильно работать .

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


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

--- Цитата: 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:

--- Цитата: 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:

--- Цитата: topos84 ---Это тебе нужно знать номера символов в ASCII. А там уже легко разберешься сам.
--- Конец цитаты ---
Ну первый маленький символ латиници 97 , последний 122 , а как задать само условие что если символ находиться в этой границе .... а в прочем у меня уже появилась идея , если не справлюсь с заданием я отпишусь  :)
DeniSS:
2gepar в С++ я так с числом и сравнивал...
gepar:

--- Цитата: DeniSS ---2gepar в С++ я так с числом и сравнивал...
--- Конец цитаты ---
ну вот меня похожая мысль и посетила тобишь мысль о сравнении кодов .

Добавлено позже:

--- Цитата: topos84 ---Если мне память не изменяет, функция random выдает число типа real, а не integer. Или я не прав?
--- Конец цитаты ---
Там рендом целых чисел , это если бы я просто написал random то тогда бы генерировались числа от 0 до 1 типа real , так же генерируются целые числа .

Добавлено позже:
Такс , вот тут подсказали должно быть от 0 , а не от 1 :

--- Цитата: ---     for i:=1 to high(m) do if m>0 then mas:=m*2
--- Конец цитаты ---
Правда пока не ответили почему так .

Добавлено позже:
Насчёт high ответили что там просто идёт сходу увеличение на 1 .Впринципе с этим разобрался , а вот почему не работает вот это - нет .Код

--- Код: ---program proga274;
uses crt;
const
n=12;
var
m:array[1..12] of integer;
i:integer;
res4,resn:integer;
procedure chetnie(var r:integer;m:array of integer);
Begin
     r:=0;
     for i:=0 to high(m) do
     Begin
          if m[i] mod 2 =0 then r:=r+m[i];
     end;
end;
procedure ne4etnie(var re:integer;m:array of integer);
Begin
     re:=0;
     for i:=0 to high(m) do
     Begin
          if m[i] mod 2 <>0 then re:=re+m[i];
     end;
end;
Begin
     res4:=0;resn:=0;
     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(']');
     chetnie(res4,m);
     ne4etnie(resn,m);
     writeln;
     writeln('Summa 4etnih: ',res4,' Summa ne 4etnih: ',resn);
     readkey;
end.

--- Конец кода ---
Большая просьба разъяснить что я сделал не так потому как из прочитанного мной до этого материала всё так , но на практике то ведь по другому - вместо подсчета суммы чётных и нечётных чисел считается фиг знает что и это при том что я ведь изначально результаты обнулил так что откуда берутся ложные цифры в ответе вообще мне непонятно  :(
topos84:

--- Цитата: gepar ---Большая просьба разъяснить что я сделал не так потому как из прочитанного мной до этого материала всё так , но на практике то ведь по другому - вместо подсчета суммы чётных и нечётных чисел считается фиг знает что и это при том что я ведь изначально результаты обнулил так что откуда берутся ложные цифры в ответе вообще мне непонятно  Грустный
--- Конец цитаты ---
Да я тоже ошибки не вижу. Может, заменишь надпись "...<> 0" на надпись "...<0) or (...>0)"? Я опять забыл, есть в паскале такой знак или нет (<>).
gepar:

--- Цитата: topos84 ---Да я тоже ошибки не вижу. Может, заменишь надпись "...<> 0" на надпись "...<0) or (...>0)"? Я опять забыл, есть в паскале такой знак или нет (<>).
--- Конец цитаты ---
Это знак неравности .
В прикреплённом файле на всякий случай pas .
gepar:
Блин , я уже задолбался с этой прогой которая удаляет совпадающую строку в матрице .topos84,help please , хоть чемто , ато застрял по самое не балуйся , тут пара друзей пытались помочь , но все в конце концов отказываются .Пока что я лишь пришёл к выводам что както надо бы всё это дело сравнить , а потом некоторые мне советовали сдвигать строки , вот только как это сделать ?У меня ведь в массиве границы же есть сколько элементов должно быть в массиве , как я эти границы могу обойти ?

Добавлено позже:
Совместными мучениями пока что получился вот такой кусочек подпрограммы по сравнению рядов в матрице :

--- Код: ---procedure sravn(var a:matr; mas:matr);
Begin
for i:=1 to m do
begin
    f:=false;
    for g:=i+1 to m do
        for j:=1 to n do
        if mas[i,j]<>mas[g,j] then begin f:=true; break; end;
end;
if f=false then

--- Конец кода ---
Кстати вопрос :зачем мне преподаватель сказал обязательно добавить type matr=array [1..m,1..n] of integer иначе мол программа работать не будет , мне конечно не сложно , но разве это обязательно условие ?
topos84:

--- Цитата: gepar ---Кстати вопрос :зачем мне преподаватель сказал обязательно добавить type matr=array [1..m,1..n] of integer иначе мол программа работать не будет , мне конечно не сложно , но разве это обязательно условие ?
--- Конец цитаты ---
А ты знаешь такой стандартный тип как matr? Я нет. Массивы знаю, а matr - нет.

Добавлено позже:

--- Цитата: gepar ---Кстати вопрос :зачем мне преподаватель сказал обязательно добавить type matr=array [1..m,1..n] of integer иначе мол программа работать не будет , мне конечно не сложно , но разве это обязательно условие ?

--- Конец цитаты ---
Аха! Я в программе написал:

--- Код: ---function sravn(i,j:byte; mart:array[1..m,1..n] of integer):boolean;
--- Конец кода ---
И компилятор заругался на меня: "OF expected" и указал на сивом, сразу идущий за словом array. Из чего я делаю вывод, что в качестве параметров функции (а значит и процедуры) не все стандартные типы годятся. Значит препод прав: нужно перед описанием функции добавить новый тип:

--- Код: ---type matr=array[1..m,1..n] of integer;
--- Конец кода ---
gepar:

--- Цитата: topos84 ---А ты знаешь такой стандартный тип как matr? Я нет. Массивы знаю, а matr - нет.
--- Конец цитаты ---
Ну насколько я понял это посоветовал преподаватель для экономии времени в дальнейшем так как дальше она сказала указать :mas,a:matr . Хотя я вообще типами не пользуюсь .Ну да как дальше поступить ?Пусть без типов .Ато я конкретно на этом задании застрял , остальные по поводу подпрограмм я хоть знаю что делать (у меня там ещё задание насчёт магического квадрата) , что и с чем сравнивать , ав этом задании как проделать всё придумать немогу .

Добавлено позже:

--- Цитата: topos84 ---Из чего я делаю вывод, что в качестве параметров функции (а значит и процедуры) не все стандартные типы годятся.
--- Конец цитаты ---
Ну знать не только для экономии времени  :)
Fly:

--- Цитата: gepar ---Кстати вопрос :зачем мне преподаватель сказал обязательно добавить type matr=array [1..m,1..n] of integer иначе мол программа работать не будет , мне конечно не сложно , но разве это обязательно условие ?
--- Конец цитаты ---
Чтобы проблем поменьше было. Потому что если написать

--- Код: ---a:array [1..10] of integer;
b:array [1..10] of integer;
--- Конец кода ---
то переменные a и b будут считаться переменными разных типов.

--- Цитата: gepar ---Блин , я уже задолбался с этой прогой которая удаляет совпадающую строку в матрице .topos84,help please , хоть чемто , ато застрял по самое не балуйся , тут пара друзей пытались помочь , но все в конце концов отказываются .Пока что я лишь пришёл к выводам что както надо бы всё это дело сравнить , а потом некоторые мне советовали сдвигать строки , вот только как это сделать ?У меня ведь в массиве границы же есть сколько элементов должно быть в массиве , как я эти границы могу обойти ?
--- Конец цитаты ---
Идёшь по массиву снизу вверх, сравнивая последовательно сначала нижнюю строку с остальными, потом предпоследнюю и т. д. Если обнаруживается такая же строка, то как-нибудь это отмечаешь. Например, заполняешь строку нулями, или делаешь отдельный одномерный массив, где повторяющимся строкам ставишь единицы. А потом выводишь те строки, которым в одномерном массиве соответствуют нули.
Сравнивать строки можно поэлементно, а можно вообще записать матрицу как одномерный массив типа string[n] и тупо писать что-то типа

--- Код: ---if mas[i] = mas[j] then begin
  mas[i]:='';
  break
end
--- Конец кода ---
topos84:

--- Цитата: Fly ---то переменные a и b будут считаться переменными разных типов.
--- Конец цитаты ---
Это еще почему? o_0
Fly:
topos84, а вот хрен его знает. Однако если написать через запятую, то будут одного типа.
Навигация
Главная страница сообщений
Следующая страница
Предыдущая страница

Перейти к полной версии