Программирование

Давайте здесь устроим поле для обсуждения неясных моментов программирования на Паскале

Эффективное вычисления функции y=m^n.

  1. program stepen;
  2. var stm,m,n:integer;
  3. begin
  4.   writeln('Vvedite m,n');
  5.   readln(m,n);
  6.   stm:=1;
  7.   while n <>1 do begin
  8.   if n mod 2 = 0 then begin
  9.     m:=sqr(m);
  10.     n:=n div 2;
  11.   end else begin
  12.     stm:=stm*m;
  13.     n:=n-1;
  14.   end;
  15.   end;
  16.   writeln('Result:', m*stm);
  17.  end.

Задача про нули, минусы и плюсы. =)

Итак, решение задачи про расположение чисел. Сначала нули, потом положительные по убыванию, затем отрицательные по возрастанию. Я ее еще неделю назад сделал, выкладываю сейчас. =)

  1. program TRIMAS;
  2.    const lim=100;
  3.    type mas = array [1..lim] of integer;
  4.    var a:mas; i,g,tmp,j,n,s,k,h:integer;
  5. begin
  6.    readln(n);
  7.    for i := 1 to n do read(a[i]);
  8.    for i:=n downto 1 do begin \\сортируем по нулям, отрицательным и положительным.
  9.       for j:=n downto 1 do begin
  10.          if a[j]=0 then begin
  11.             tmp:=a[j]; a[j]:=a[j-1]; a[j-1]:=tmp
  12.          end
  13.          else if (a[j]>0) and ((abs(a[j])+abs(a[j-1]))>abs(a[j])) then begin
  14.                  tmp:=a[j]; a[j]:=a[j-1]; a[j-1]:=tmp
  15.               end;
  16.       end;
  17.    end;
  18.    for j := 1 to n do begin \\ищем начало положительных
  19.       if a[j]>0 then break
  20.    end;
  21.    s:=j; g:=j; k:=n-j+1;
  22.    for j:=s to n do begin \\ищем начало отрицательных
  23.       if a[j]<0 then break
  24.    end;
  25.    h:=j; k:=k-n+h-1;
  26.    for s:=1 to k do begin \\сортируем положительные
  27.       for j:=g to h do begin
  28.          if a[j]<a[j+1] then begin
  29.             tmp:=a[j]; a[j]:=a[j+1]; a[j+1]:=tmp
  30.          end;
  31.       end;
  32.    end;
  33.    k:=n-h+1;
  34.    for s:=1 to k do begin \\сортируем отрицательные
  35.       for j:=h to n-1 do begin
  36.          if a[j]>a[j+1] then begin
  37.             tmp:=a[j]; a[j]:=a[j+1]; a[j+1]:=tmp
  38.          end;
  39.       end;
  40.    end;
  41.    for j := 1 to n do write(a[j]);
  42.    readln; readln
  43. end.

Наворотил многовато, но всё работает. =)

Могу лишь сказать - мне не

Могу лишь сказать - мне не нравится ...

Не нравится что???

Не нравится что???

По умолчанию всегда комментирую

По умолчанию всегда комментирую непосредственно предшествующий моему комментарию пост. А по поводу Вашего, да и некоторых других решений, я пока жду какой-либо реакции общественности. Впечатление такое, что каждому интересно только своё (или не интересно вообще ничего).

Зиновьев Александр

за что отвечает переменная tmp?что-то не разберусь в 11 строчке

Переменная tmp-использутся

Переменная tmp-использутся для метода "пузырька", как я понимаю. Синтаксис там очевиден.

tmp нужна как промежуточная

tmp нужна как промежуточная переменная для того, чтобы поменять местами 2 соседних элемента массива.

Нули, минусы, плюсы

Проверял программу Зиновьева Александра, вычислил только то, что если у нас в массиве только 1 отрицательный элемент, то он обращяется в ноль и записывается после положительных, пока что не искал способа исправить эту ошибку. Больше, сколько бы я различных вариантов не подбирал, по-моему нет ошибок в вычислениях.

К задаче о сортировке

Вот потому и не нравится мне это решение (конкретно, цикл 8-й строки - уж очень он непрозрачен!). Жду более понятных решений.

Седловой элемент

  1. program matrix;
  2.    const lim=50;
  3.    type mas=array[1..lim,1..lim] of integer;
  4.    var min,k,max,i,j,m,n,r:integer; a:mas;
  5. begin
  6.    readln(m,n);
  7.    for i:=1 to m do begin
  8.       for j:=1 to n do readln(a[i,j]) //заполняем матрицу
  9.    end;
  10.    for i:=1 to m do begin
  11.       min:=a[i,1]; r:=1;
  12.       for j:=1 to n do begin //ищем минимальный элемент в строке
  13.          if min>a[i,j] then begin
  14.             min:=a[i,j];
  15.             r:=j
  16.          end;
  17.       end;
  18.       max:=a[1,r];
  19.       for k:=1 to m do begin //ищем максимальный элемент в столбце с минимальным
  20.          if max<a[k,r] then max:=a[k,r]
  21.       end;
  22.       if a[i,r]=max then begin //если они совпадают, то искомый седловой элемент найден
  23.          writeln(a[i,r]);
  24.          break
  25.       end;
  26.     end;
  27.     readln
  28. end.

Задача

Дана матрица целых чисел. Найти "седловой" элемент этой матрицы, т.е. элемент, котрорый одновременно наименьший в своей строке и наибольший в своём столбце.

  1. program mtrx1;
  2.  const lim = 100;
  3.  type mtrx = array[1..lim,1..lim] of integer;
  4.  var a:mtrx; i,j,k,m,n,st:1..lim; max:integer; f:boolean;
  5. begin
  6.  read(m,n);
  7.  for i:=1 to m do begin
  8.   for j:=1 to n do read(a[i,j])
  9.  end;
  10.  for k:=1 to m do begin
  11.   max:=a[k,1]+1;
  12.   for j:=1 to n do begin
  13.    if a[k,j]<max then begin
  14.     max:=a[k,j]; st:=j { Находим наименьший элемент в k-ой строке}
  15.    end
  16.   end;
  17.   f:=true;
  18.   for i:=1 to m do begin
  19.    if a[i,st]>max then begin {Проверяем, является ли он наибольшим в своём столбце}
  20.     f:=false; break
  21.    end
  22.   end;
  23.   if f then begin
  24.    writeln(max); break
  25.   end
  26.  end
  27. end.

Опоздал!

Опоздал!

мне Сашин вариант решения больше понятен))

И ОТ МЕНЯ ВАРИАНТ РЕШЕНИЯ ЗАДАЧИ"ПЕРВЫЙ ШАГ МЕТОДА ГАУСА"

  1. program Gaus;
  2. var a:array[1..100,1..100] of real;
  3.     i,j,n:byte;
  4.     c:real;
  5.    
  6. begin
  7.   writeln('vvedite razmernost matrizi');
  8.   readln(n);
  9.   for i:=1 to n do
  10.    for j:=1 to n do
  11.     read(a[i,j]);
  12.   if a[1,1]<>0 then begin //если первый элемент не нулевой выводим матрицу
  13.    for i:=1 to n do begin
  14.     writeln;
  15.     for j:=1 to n do
  16.      write(a[i,j]);
  17.     end end else begin //а если нулевой...
  18.       for i:=1 to n do
  19.        if a[i,1]<>0 then begin
  20.         for j:=1 to n do begin
  21.          c:=a[1,j];
  22.          a[1,j]:=a[i,j];//...то меняем первую строку на любую с первым не нулевым элементом
  23.          a[i,j]:=c
  24.         end; break end;
  25.       for i:=1 to n do begin
  26.     writeln;
  27.     for j:=1 to n do
  28.      write(a[i,j])//вывели измененную матрицу
  29.     end
  30.    end;//завершили else
  31.   readln
  32. end.

Задача2

Дана квадратная матрица. Если 1-ый элемент 1-ой строки равен 0, нужно 1-ую строку поменять местами с любой другой строкой, в которой 1-ый элемент отличен от нуля.

  1. program matrix2;
  2.  const lim = 100;
  3.  label m1;
  4.  type mtrx = array[1..lim,1..lim] of integer;
  5.  var a:mtrx; i,j,n,p:1..lim; s:integer;
  6. begin
  7.  readln(n);
  8.  for i:=1 to n do begin
  9.   for j:=1 to n do read(a[i,j])
  10.  end;
  11.  if not(a[1,1]=0) then goto m1;
  12.  for i:=2 to n do begin
  13.   if not(a[i,1]=0) then begin
  14.    p:=i; break
  15.   end
  16.  end;
  17.  for j:=1 to n do begin
  18.   s:=a[1,j]; a[1,j]:=a[p,j]; a[p,j]:=s
  19.  end;
  20.  m1:
  21.  for i:=1 to n do begin
  22.   writeln;
  23.   for j:=1 to n do write(a[i,j],' ')
  24.  end
  25. end.

Дима)))))))))

опять опоздал))))))))))

Дим,еще вопрос к тебе)))

обьясни незнающим,что делает "label m1",особенно что такое "label"?

а что конкретно можно про

а что конкретно можно про label сказать? если не ошибаюсь это поле для объявления меток....для оператора goto..больше не знаю что можно сказать=)

Label

Label - это то, что нам нельзя использовать.
Просто я решил, что так эффективней.

  1.  3: label m1; //Описание метки m1
  2.  11: if not(a[1,1]=0) then goto m1; {Если a[1,1] не равно 0, то пропускается часть кода ,и программа продолжает выполняться с 20-ого шага }

Так без метки ж даже проще

Так без метки ж даже проще получится.

  1. if a[1,1]=0 then begin
  2.    12-я - 19-я строки
  3. end;

А потом выводишь матрицу. Таким образом, если a[1,1] не равно 0, то как раз не будет выполняться то, что предусмотрено для a[1,1]=0. И матрица будет сразу выведена.

всем спасибо)))))

разобралась))))

Убедительно, Наташа. Но, к

Убедительно, Наташа. Но, к сожалению, есть люди,
для которых понятие "культура программирования" - пустой звук.

лучше поздно чем никогда))

program One;
begin
Writeln('Hello,World of students')
end.

может так вернее))

  1. program One;
  2. begin
  3.      Writeln('Helo,world of students!')
  4. end.

)))получается)))

  1. <Паскаль-программа> ::= <заголовок_программы>; <блок> <точка>
  2. <точка> ::= .

Исправление ошибки в задаче "Седловой элемент"

Алгоритм Александра будет работать не правильно если в одной строке найдётся хотя бы ещё один элемент равный минимальному.Так как он проверят только столбцы с индексом первого вхождения минимума.
Исправленный код:

  1. program Project1;
  2. {$APPTYPE CONSOLE}
  3. uses
  4.   SysUtils;
  5. const lim=50;
  6.   var a:array[1..lim,1..lim]of integer;
  7.   z,k,i,j,m,n:1..lim;
  8.   max,min:integer;
  9. begin
  10.   write('Vvedite razmernost masiva m,n: ');
  11.   readln(m,n);
  12.   for i:=1 to m do
  13.   begin
  14.     for j:=1 to n do
  15.     begin
  16.     write('a[',i,'][',j,']= ');
  17.     readln(a[i,j]);
  18.     end;
  19.   end;
  20.   for i:=1 to m do
  21.   begin
  22.      for j:=1 to n do write(a[i,j]:2);
  23.      writeln;
  24.   end;
  25.   for i:=1 to m do
  26.   begin
  27.     min:=a[i,1];
  28.     for j:=2 to n do if a[i,j]<min then min:=a[i,j];
  29.     for k:=1 to n do
  30.     begin
  31.       if a[i,k]=min then
  32.       begin
  33.         max:=a[1,k];
  34.         for z:=2 to n do if a[z,k]>max then max:=a[z,k];
  35.         if a[i,k]=max then
  36.         begin
  37.           writeln('sedlovoy element a[',i,'][',k,']=',a[i,k]);
  38.           break
  39.         end;
  40.       end;
  41.     end;
  42.   end;
  43. end.

Я согласен с Наташей. Без

Я согласен с Наташей. Без метки программа действительно проще и понятней. Моё решение ничем не лучше решения Оксаны. И если это так важно, то я больше не буду использовать метки.

Не будьте так строги, каждый

Не будьте так строги, каждый с чего-то начинает. И культура программирования со временем появится.

Валерий Шахамболетович

Не могли бы вы мне выложить вторую задачку который вчера был на контрольной работе пожалуйста я хотел бы порешать))) просто я условие не до конца помню.(((

Cпециально пришёл в нерабочий

Cпециально пришёл в нерабочий день на кафедру, чтобы поработать с сайтом - дома проблема с выходом в СЕТЬ. Говорю это для тех, кто элементарную лень прикрывает отсутствим особых условий дома. Теперь по порядку, несколько комментов на ваши последних посты.
1. Дмитрию М. "Покаяние" получилось уж слишком вымученным. Вы так ничего и не поняли. Никогда не стоит делать того, в чём Вы внутренне не убеждены. Даже под давлением" "начальников" .
2. Наталье С. Само собой , т.е без целенаправленного труда и жёсткой самоцензуры ничего не образуется. Особенно в сфере культуры (и не только профессиональной!).
3. Исламу М. Не знаю, так ли уж интересна задача, о которой Вы говорите, но раз просите, вот она:
Дана квадратная матрица целых чисел. Найти номер той её строки, которая содержит наименьший по модулю элемент (если таких строк несколько, то выбрать из них любую).

Мне кажется интересней следующая задача с матрицами, которую я предложил в другой группе (членов которой попрошу воздержаться от комментариев - решение я им уже объяснил):
Даны две квадратные целочисленные матрицы. Проверить совпадает ли главная диагональ первой матрицы с побочной диагональю второй (обе диагонали рассматриваются в порядке наростания индексов строк).

Решение задачи.

  1. program digonal;
  2. {$APPTYPE CONSOLE}
  3. uses
  4.   SysUtils;
  5.  
  6. const lim=50;
  7. var a,b:array[1..lim,1..lim]of integer;
  8. i,j,n:1..lim;
  9. f:boolean;
  10. begin
  11.   write('Введите размерность квадратных матриц (n):');
  12.   readln(n);
  13.   writeln('Введите элементы первой матрицы');
  14.   for i:=1 to n do
  15.   for j:=1 to n do
  16.   begin
  17.     write('a[',i,'][',j,']=');
  18.     readln(a[i,j]);
  19.   end;
  20.   writeln('Введите элементы второй матрицы');
  21.   for i:=1 to n do
  22.   for j:=1 to n do
  23.   begin
  24.     write('b[',i,'][',j,']=');
  25.     readln(b[i,j]);
  26.   end;
  27.   f:=true;
  28.   for i:=1 to n do
  29.   if a[i,i]<>b[i,abs(i-n-1)]then
  30.   begin
  31.    f:=false;
  32.    break;
  33.   end;
  34.   writeln('Матрица a:');
  35.   for i:=1 to n do
  36.   begin
  37.     for j:=1 to n do write(a[i,j]:2);
  38.     writeln;
  39.   end;
  40.   writeln('Матрица b:');
  41.   for i:=1 to n do
  42.   begin
  43.     for j:=1 to n do write(b[i,j]:2);
  44.     writeln;
  45.   end;
  46.   if f=true then writeln('диагонали равны') else writeln('Диагноали не равны ');
  47.   read(n);
  48. end.

Валерий Шахамболетович

спасибо большое )) щас попробую разобратся)))

Давай Ислам:)специально не

Давай Ислам:)специально не стал решать:)дерзай

задача 2. как то так)))) надеюсь правильно

  1. Program matrx;
  2.  const lim=50;
  3.  type MAS=array [1..lim,1..lim] of integer;
  4.  var a,b:MAS; i,j,n:integer; f:boolean;
  5. begin
  6.      write('ввеите матрицу (n):');
  7.      readln(n);//ввоим размерность квадратной матрицы n
  8.    for i:=1 to n do begin
  9.     for j:=1 to n do begin
  10.         writeln('ввести первый элемент матрицы');
  11.         readln(a[i,j]);// вводим элементы первой матрицы
  12.    end;
  13.     end;
  14.      for i:=1 to n do begin
  15.       for j:=1 to n do begin
  16.         writeln('ввести второй элемент матрицы');
  17.         readln(b[i,j]);// вводим элементы второй матрицы
  18.      end;
  19.       end;
  20.         f:=true;
  21.         for i:=1 to n do begin
  22.            if a[i,i]<>b[i,n-i+1] then
  23.             f:=false;
  24.         end;
  25.          writeln('матрица а:');
  26.          for i:=1 to n do begin
  27.            write(a[i,i]);
  28.            writeln;
  29.          end;
  30.           writeln('матрица b:');
  31.           for j:=1 to n do begin
  32.            write(b[i,n-i+1]);
  33.            writeln;
  34.           end;
  35.           writeln(f);
  36. end.

теперь доработаю первую

теперь доработаю первую задачку и выложу))))

Сережа

спасибо))) щас попробую

задача 1)) ну вот и первая)))))

Дана квадратная матрица целых чисел. Найти номер той её строки, которая содержит наименьший по модулю элемент (если таких строк несколько, то выбрать из них любую).

  1. Program matrx;
  2.  const lim=50;
  3.  type MAS=array [1..lim,1..lim] of integer;
  4.  var a:MAS; i,j,n,min,k:integer;
  5. begin
  6.      write('ввеите матрицу (n):');
  7.      readln(n);//ввоим размерность квадратной матрицы n
  8.    for i:=1 to n do begin
  9.     for j:=1 to n do begin
  10.         writeln('ввести элемент матрицы');
  11.         readln(a[i,j]);// вводим элементы матрицы
  12.    end;
  13.     end;
  14.      min:=abs(a[1,1]); k:=1;
  15.      for i:=1 to n do
  16.       for j:=1 to n do
  17.        if abs(a[i,j])<min then begin
  18.         min:=abs(a[i,j]);
  19.         k:=i;
  20.        end;
  21.       writeln(k);
  22. end.      

Сережа

ну во второй задачке ты опередил меня)))

к сожалению,только сейчас

к сожалению,только сейчас решила выложить решение новой задачи,но мое решение совпадает с Сережиным,так что выкладывать смысла нет...Ислам уже начал вьезжать,главное желание разобраться есть,поздравляю ;)

Валерий Шахамболетович

когда вам лекции принести?))

Ислама действительно можно

Ислама действительно можно поздравить, если это самостоятельно ... Ну, в этом мы разберёмся. Серёже очередной плюс. А конспект, Оксана, можно мне передать в среду.

Y=X^N.

Вариант решения задачи о быстром вычислении Y=X^N.
В принципе задача эта уже решена Иващенко Серёжей (Вс, 05/12/2010 - 17:55), но здесь я показываю, как можно было бы улучшить его решение.

  1. ...
  2.     Readln(X,N);
  3.     Y:=1;
  4.     While (N<>0) do Begin
  5.         If odd(N) Then Y:=X*Y;
  6.         N:=N div 2;  X:=sqr(X)
  7.     End;
  8.     Writeln(Y)
  9. ...

спасибо Оксана))))

действительно я начал понимать))) но бывают и неудачи но буду старатся чтобы их не было)))

Валерий Шахамболетович

А когда вопросы на экзамен будут?

ВНИМАНИЕ! Вопросы для 1 курса опубликованы!

ВНИМАНИЕ! Вопросы для 1 курса опубликованы в разделе "Статьи".
Они слегка подредактированы и чуть-чуть перекомпанованы. К тому же, добавлена пара вопросов по строковым типам. Можно начинать готовиться к экзамену хоть сейчас.
Если что-то не понятно, спрашивайте. Удачи!

Вопрос о вопросах

33. Особенности выполнения for-операторов. Оператор Break и пример его использования. Проблема “goto”.
Валерий Шахамболетович, скажите на сколько конкретезировать ответ насчет оператора "goto"? Просто своими словами передать почему данный оператор являеться "нежелательным" в применении?

Да, конечно своими словами.

Да, конечно своими словами. Но с сохранением сути.

Валерий Шахамболетович. Можно

Валерий Шахамболетович. Можно у вас узнать, сколько у меня балов за все 3 модуля?

пересдача

Валерий Шахамболетович, а когда будет пересдача у 1ПМ???? Или надо спросить в деканате???

Валерий Шахамболетович,

вот сегодня вы обьясняли про макросы,я не поняла один момент,а спросить забыла...библиотека макросов-где она находится?мы ее сами создаем или такая уже имеется,а мы будем туда лишь добавлять свои нововведения?))можно вот этот вопрос поподробней?