| Другое > 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, а вот хрен его знает. Однако если написать через запятую, то будут одного типа. |
| Навигация |
| Главная страница сообщений |
| Следующая страница |
| Предыдущая страница |