Технический форум

Технический форум (http://www.tehnari.ru/)
-   Delphi, Kylix and Pascal (http://www.tehnari.ru/f43/)
-   -   Помогите с объяснением задач (http://www.tehnari.ru/f43/t61721/)

mango 24.12.2011 21:54

Помогите с объяснением задач
 
Ребят помогите пожалуйста с объяснением каждой строки в задачах пожалуйста, если можно по подробнее, очень нуждаюсь в этом. Буду душевно благодарен.
---
1. (Двумерный массив)Дан двумерный массив размера M x N. Найти максимальный среди минимальных элементов ее строк.

Цитата:

const n=3; m=4;
var a: array [1...n, 1...m] of integer;
b: array [1...m] of integer;
max i,j: integer;
begin
randomize;
for i:=1 to n do
begin
for j:=1 to m do
begin
a[i,j]:=random(10);
write (a[i,j]:4);
end;
writeln
end;
for i:=1 to n do
begin
b[i]:=a[i,1];
for j:=1 to m do
if b[i] < a[i,j], then
b[i]:=a[i,j];
writeln(' ');
end;
min:=b[1];
for i:=1 to n do begin
if b[i] < min then min:=a[i];
readkey;
end.
---
2.(Строки)Даны строки S и S0. Найти количество вхождений строки S0 в строку S.

Цитата:

var
S,S0 : string;
flag : boolean;
cout : integer;
begin
write ('введите S:');
readln(S);
write ('введите S0:');
readln (S0);
flag:=false;
if (length (S) < length (S0)) then
write (flag);
else
begin
cout:=0;
temp:=copy (S,1,length (S0));
for i:=2 to length (S)-length(S0) do
begin
inc(cout);
temp:=copy (S,i,length (S0));
end;
else;
begin
temp:=copy (S,i,lenght (S0));
end;
end;
end;
writeln (cout);
end.

mango 24.12.2011 23:39

Паскаль здесь)

Vladimir_S 25.12.2011 10:28

Код:

const
 n=3; {количество строк}
 m=4; {количество столбцов}
var
 a: array [1...n, 1...m] of integer; {задание целочисленной матрицы}
 b: array [1...m] of integer; {ОШИБКА! Взята не та константа. Строку - убрать!}
 b: array [1...n] of integer; {задание целочисленного вектора с количеством элементов, равным количеству СТРОК матрицы}
max i,j: integer; {После max отсутствует запятая. Строку - убрать!}
 max,i,j: integer; {Задание служебных переменных}
begin {Начало программы}
 randomize; {Инициализация генератора случайных чисел}
 for i:=1 to n do {Организация цикла по строкам}
  begin {начало цикла по строкам}
  for j:=1 to m do  {Организация цикла по столбцам}
    begin {начало цикла по столбцам}
    a[i,j]:=random(10); {присвоение случайного значения элементу матрицы}
    write (a[i,j]:4); {вывод элемента матрицы на экран}
    end; {конец цикла по столбцам}
  writeln {перевод строки на экране}
  end; {конец цикла по строкам}
 for i:=1 to n do {организация цикла поиска минимальных элементов строк, сохраняемых в векторе b}
  begin {начало цикла}
  b[i]:=a[i,1]; {i-тому элементу вектора b присваивается исходное значение первого элемента строки матрицы}
  for j:=1 to m do {цикл по столбцам; можно и так, но красивее начинать с j:=2}
   if b[i] < a[i,j], then {ГРУБЕЙШАЯ ошибка: запятая после квадратной скобки НЕДОПУСТИМА! Строку - убрать!}
    if b[i] < a[i,j] then b[i]:=a[i,j]; {путём последовательного перебора элемент вектора b[i] получает значение наименьшего элемента строки}
  writeln('  '); {Абсолютно лишняя ненужная строка. Убрать!}
  end; {конец цикла}
 min:=b[1]; {Требуется найти МАКСИМАЛЬНЫЙ элемент из полученных минимальных, а не минимальный! Строку - убрать!}
 max:=b[1]; {присвоение исходного значения искомому максимуму}
 for i:=1 to n do {организация цикла по элементам вектора b; опять же - лучше начинать с i:=2}
  begin {лишняя строка - убрать!}
  if b[i] < min then min:=a[i]; {мало того, что вместо максимальных идет отбор по минимальным, так еще и вместо b[i] всунуто a[i]. Строку - убрать!}
  if b[i] > max then max:=b[i]; {путём последовательного перебора max получает значение наименьшего элемента вектора b}
readkey; {Абсолютно недопустимо! Readkey - это команда вспомогательного модуля CRT, каковой у Вас не присоединен.
  Если хотите пользоваться командами CRT, то соблаговолите в самом начале программы поставить uses CRT;
  Впрочем, здесь это не нужно: достаточно воспользоваться стандартным оператором Readln. А потому строку - убрать!}

 writeln('Max= ',max); {вывод результата (между прочим, у Вас напрочь отсутствующий!)}
 readln {остановка программы}
end. {конец  программы}


Vladimir_S 25.12.2011 11:04

Теперь по второй задаче. Там мало того, что куча ошибок (достаточно заметить, что переменные i и temp не определены вовсе, что в Паскале недопустимо), так еще и путь решения этой глупейшей задачки выбран типа "достать правое ухо через-под левое колено". А потому предлагаю свой вариант, куда более простой, компактный и с комментариями.
Код:

VAR
 S,S0,T:String; {описание строковых переменных}
 i,n:byte; {описание целых переменных}
Begin {начало программы}
 Writeln('Enter S:'); {экранная подсказка ввода строки S}
 Readln(S); {ввод строки S}
 Writeln('Enter S0:'); {экранная подсказка ввода строки S0}
 Readln(S0); {ввод строки S0}
 n:=0; {ввод исходного количества искомого числа вхождений}
 For i:=1 to Length(S)-Length(S0)+1 do {организация цикла по всем номерам строки S,
начиная с первого и до разности длин строк S и S0 плюс 1;
дальнейшая проверка - бессмысленна)}
  begin {начало цикла}
  T:=Copy(S,i,Length(S0)); {переменной T присваивается значение части строки S длиной,
  равной длине S0 и начинающейся с текущего значения переменной цикла}
  If T=S0 then INC(n); {проверка совпадения строк T и S0; если совпали, то значение счетчика n увеличивается на 1}
  end; {конец цикла}
 Writeln(n,' times'); {вывод результата на экран}
 Readln; {останов}
End. {всё!}


mango 25.12.2011 11:34

От души за помощь.
Выручил, еще раз огромное тебе спасибк.


Часовой пояс GMT +4, время: 22:24.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.