| Другое > Hard'n'Soft |
| Вспоминаем Turbo Pascal и решаем задачи на нём |
| << < (7/15) > >> |
| Fly:
А тут, кстати, цикл вообще не обязателен. В задании написано, что матрица 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. --- Конец кода --- Задание выполнено.:) |
| topos84:
--- Цитата: Fly от 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. --- Конец кода --- Задание выполнено.:) --- Конец цитаты --- Ну знаешь ли, это уже как-то не по-программистски. Лучше действительно оформить решение с константами размерности матрицы, а то ведь потом может попасться другая, сходная с этой, задачка, но потруднее, и, если gepar не усвоит общий вид решения таких задач (т.е. с произвольной размерностью матрицы), то ему будет трудно эту новую задачу решить. Короче, не всегда нужно искать самый простой путь решения задачи, потому что пользы в будущем от него может быть меньше, чем в настоящем, а обучение чему бы то ни было все-таки направлено на овладение знаниями и умениями для применения их в будущем (как минимум на зачете/экзамене ;)). |
| gepar:
Ну я то первое задание решил вот так : --- Код: ---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:
--- Цитата: 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:
--- Цитата: gepar ---Я это задание решил тем что определял сумму по типу a[1,2]+a[1,3] ну и т.д тобишь просто выписал индексы тех элементов что над главной диагонали , но это как-то неправильно по моему - --- Конец цитаты --- Неправильно в смысле не в общем случае решено (т.е. без введения константы n, а просто для конкретного случая n=4)? Ну никто не заставляет, наверное, тебя решать в общем случае. В задаче не указано, как требуется ее решать. Однако, я бы тебе посоветовал решать в общем случае, так как это всегда оказывает положительное воздействие на преподов по программированию. В этом случае, решение уже будет явно "по-программистски". --- Цитата: gepar ---Ну и второе место где застрял это поменять местами строки и столбци матрици (размер 4x4) . Как это сделать что-то не придумаю , может быть у кого-то из посетителей даной темы есть идеи как это реализовать ? --- Конец цитаты --- Поменять местами строки и столбцы квадратной матрицы это значит транспонировать ее, что в свою очередь означает произвести симметрию относительно главной диагонали. Т.е. нужно обменять значения элементов a(i, j) и a(j, i) для всех i, j = 1, ..., n (вспомни фокус с переменной buf). |
| gepar:
Спасибо за подсказки 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:
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:
Кстати, подумал тут, если решать задачу транспонирования матрицы в общем случае, то обмен значениями делать нельзя, нужно записывать в новую матрицу размерности n x m. Или использовать массив m x m (при условии, что m > n), но не полностью. |
| gepar:
Это было транспонирование матрицы , задание по смене местами двух строк у меня не было , там в строках запара с удалением символов , ну да сейчас всё же попытаюсь покорить эту задачу на матрицы :) --- Цитата: topos84 ---А если ты имел в виду транспонирование матрицы, то тут нужно лишь симметрично отразить элементы матрицы относительно главной диагонали, т.е. (n*n-n)/2 = n(n-1)/2 элементов матрицы, находящихся сверху от главной диагонали переместить в нижнюю часть, а нижние в верхнюю + нужно будет устроить еще и проверку факта, был ли данный элемент в конкретной итерации уже заменен на симметричный ему в одной из предыдущей итерации или нет, иначе каждый элемент будет переставлен дважды, т.е. вернется на свое прежнее место, так как повторное транспонирование матрицы приводит к первоначальной матрице (транспонирование - инволютивное преобразование, если уж ругаться математикой)). --- Конец цитаты --- Ну оно в принципе заметно что ты математик , вышку небось где-то в универе читаешь ? :) Можешь помочь кодом ?Ато я транспонирование матрицы понимаю лишь как замену местами столбцов и строк , о симметрии относительно главной диагонали на вышке как-то у меня и не вспоминали . --- Цитата: topos84 ---иначе каждый элемент будет переставлен дважды, т.е. вернется на свое прежнее место, так как повторное транспонирование матрицы приводит к первоначальной матрице (транспонирование - инволютивное преобразование, если уж ругаться математикой)). --- Конец цитаты --- Вот обратное транспонирование у меня какраз в коде как я теперь понял и происходит :( |
| Fly:
--- Цитата: 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:
Fly, работает , m и n я знаю что одинаковые , но это я уже тоже по привычке , привык задавать колличество столбцов и строк двумя переменными и тогда уже и в квадратных матрицах их двумя задаю , ну да это ведь на результат не влияет .Спасибо за помощ кодом ! Я вот тут строками занялся , хотел бы узнать а с этим "pos" какие-то фишки можно делать ?Ну например искать указанную комбинацию из нескольких символов для последующего их удаления .Или можно только искать первый указанный символ и всё ? Добавлено позже: И ещё вопросик по заданию : в задании нужно подсчитать колличество гласных букв в строке , я это делаю по принципу (if a=a) or (a=e) or (a=u) ... then inc(c) . Есть более быстрый способ перечислять кучу условий для которых нужно делать одну и ту же операцию ? |
| topos84:
--- Цитата: gepar ---(if a=a) or (a=e) or (a=u) ... then inc(c) . Есть более быстрый способ перечислять кучу условий для которых нужно делать одну и ту же операцию --- Конец цитаты --- Есть! Множество организуй. Множество задашь перечислением в разделе объявления переменных. А затем, уже в теле программы, будет условие im a in M then, где М - то самое множество гласных букв, которое ты опишешь в разделе переменных. |
| gepar:
--- Цитата: 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:
Во-первых, в строку 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:
--- Цитата: 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:
Можно так: --- Код: ---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:
Fly,довольно интересное решение :)Спасибо за помощ . Задание :Есть матрица NxM. Получить последовательно все строки матрицы, за исключением тех, для которых есть равные среди строк с меньшими номерами. Сделать нужно это используя подпрограммы . Есть идеи как "это" решать используя подпрограммы ?Данное задание в отличии от предыдущих мне нужно будет сдавать поэтому пропустить его я не могу , а как подобраться к нему что-то идеи не возникают :( |
| topos84:
gepar, знать бы еще, как на русский переводится "ряды матриц". Тогда можно было бы и начать думать, как "это" решать. ;) |
| gepar:
topos84,ряд-строка . |
| topos84:
gepar, короче тебе нужно вывести на экран последовательность всех элементов матрицы, выводя их построчно, исключая лишь те строки, которые в этой последовательности строк уже встречались ранее? Ну, если так, то это не такое уж и трудное задание. Тебе нужны подпрограммы? Выбирай: процедуры или функции. Можешь и то и другое. Как тебе функция sovpad(t), которая выдает true, если строка с номером t уже встречалась в матрице среди строк с номером, меньшим чем t, и false в противном случае? (Нужно будет лишь организовать поэлементное сравнение t-ой строки с i-ой строкой, для всех i:=1 to t-1). А как тебе процедура vyvod(matr, s) вывода на экран s-той строки матрицы matr? (Обычный поэлементный вывод строки матрицы). Ну вот, сооруди две такие подпрограммы и задача будет решена. |
| Навигация |
| Главная страница сообщений |
| Следующая страница |
| Предыдущая страница |