Другое > Hard'n'Soft
Вспоминаем Turbo Pascal и решаем задачи на нём
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, а вот хрен его знает. Однако если написать через запятую, то будут одного типа.
Навигация
Перейти к полной версии