Другое > 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? (Обычный поэлементный вывод строки матрицы).

Ну вот, сооруди две такие подпрограммы и задача будет решена.
Навигация
Главная страница сообщений
Следующая страница
Предыдущая страница

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