Консультация № 176777
18.02.2010, 22:01
0.00 руб.
0 6 2
Здравствуйте, уважаемы эксперты! Помогите, пожалуйста, решить задачи:
1. Проверить, является ли число совершенным
2. Ввести из файла двумерный массив с числами. Преобразовать его в одномерный (и вывести на экран) ) в котором элементы записаны: а)змейкой, б) по диагоналям.
а) двумерный массив:
1 3 4 10 11 21
2 5 9 12 20 22
6 8 13 19 23 30
7 14 18 24 29 31
15 17 25 28 32 35
16 26 27 33 34 36

Привести к виду 1 2 3 4 .. 33 34 35 36

б)
1 3 6 10 15
2 5 9 14 19
4 8 13 18 22
7 12 17 21 24
11 16 20 23 25

Привести к виду 1 2 3 4 .. 23 24 25

Обсуждение

Неизвестный
19.02.2010, 00:27
общий
19.02.2010, 20:04
это ответ
Здравствуйте, Архипова Светлана Анатольевна.
В приложении решение задачи о проверке числа на совершенство.

Приложение:
{
Проверить, является ли число совершенным
Справка: совершенное число - число равное сумме всех своих делителей
6 = 1 + 2 + 3
28 = 1 + 2 + 4 + 7 + 14
}
Uses
Crt;
Var
i, Num, Sum: Word;
begin
ClrScr;
Write('?Num: ');
Readln(Num);
Sum := 0;
{
До октября 2008 года найдено 46 совершенных чисел.
Все они ЧЕТНЫЕ.
}
if Not (Odd(Num)) then
for i:=1 to (Num div 2) do
if (Num mod i = 0) then
Sum := Sum + i;
if (Sum = Num) then
Write('Number ', Num, ' is perfect.')
else
Write('Sorry, number ', Num, ' is NOT perfect.');
readkey;
end.
Неизвестный
19.02.2010, 01:34
общий
Архипова Светлана Анатольевна:
Ввести из файла двумерный массив с числами. Преобразовать его в одномерный (и вывести на экран) в котором элементы записаны: а)змейкой, б) по диагоналям.

Замечание:
в такой формулировке задача представляет интерес только в случае необходимости научиться читать данные из файла и сохранять их в некоторую структуру (в данном случае - массив).
Тогда для решения достаточно определить размер стороны массива и в цикле заполнить одномерный массив (или вывести на экран) числа 1..N^2 (где N - сторона массива)
Гораздо более интересной является задача заполнения двумерного массива по приведенным правилам :).

PS: А вот цитата из раздела Отправка вопросов:
# Не задавайте несколько разных вопросов в одном.
Не задавайте несколько разных, не связанных с друг другом вопросов, в одном. Это не запрещено (если все вопросы относятся к теме рассылки), но вероятность того, что Вы получите на них ответы, будет гораздо выше, если Вы зададите их по отдельности. Например, мало кому из экспертов захочется отвечать на вопрос, в котором просто перечислено несколько задач из задачника. Отвечать на такие вопросы неудобно, ответы трудно читаются в выпусках рассылок, затрудняется обсуждение в форуме. Поэтому большинство экспертов просто игнорируют вопросы, в которых под видом одного дано несколько вопросов или задач. Гораздо лучше, если Вы в одном вопросе спросите про решение одной проблемы, особенно, если Вы покажете, что пытались решить ее самостоятельно, и укажете, что именно вызвало трудности. Тогда многие захотят Вам помочь.

Неизвестный
19.02.2010, 08:08
общий
Andrew Kovalchuk:
При Num = 1 программа неправильно рапортует о совершенном числе
давно
Старший Модератор
31795
6196
19.02.2010, 11:04
общий
coremaster1:
coremaster1 & Andrew Kovalchuk:

Эти строчки должны быть записаны так:
Sum := 0;for i:=1 to (Num div 2) do
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
19.02.2010, 15:32
общий
Зенченко Константин Николаевич:
[i]coremaster1, Зенченко Константин Николаевич,[/i]
Спасибо за указание ошибки и вариант ее исправления.
Единичку-то я и не проверил
Неизвестный
23.02.2010, 18:42
общий
это ответ
Здравствуйте, Архипова Светлана Анатольевна.

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

Код:
6
1 3 4 10 11 21
2 5 9 12 20 22
6 8 13 19 23 30
7 14 18 24 29 31
15 17 25 28 32 35
16 26 27 33 34 36


Программа проверена в среде Borland Pascal 7.0. Не забудьте преобразовать исходный текст в кодировку DOS (CP-866) перед компиляцией.

Успехов!

Приложение:
program q176777;
uses crt;

{$R-} { отключаем проверку индексов }
type t_array = array[0..0] of word;
p_array = ^t_array;

{ чтение массива из файла }
function readArray( var n: word; var p: p_array; fname: string ) : boolean;
var f: text;
i, j, i_row: integer;
begin
readArray := false;
{$I-}
assign( f, fname );
FileMode := 0; { устанавливаем доступ "только для чтения" }
reset( f );
if IOResult = 0 then begin
readln( f, n ); { читаем число строк (= числу столбцов) }
if n > 1 then begin
getmem( p, n*n*sizeof(integer) ); { выделяем память для квадратной матрицы }
{ элемены матрицы в памяти будем располагать по строкам }
for i := 0 to n-1 do begin
i_row := i*n; { индекс начала i-той строки }
for j := 0 to n-2 do
read( f, p^[i_row + j] );
readln( f, p^[i_row + n-1] );
end;
if IOResult = 0 then
readArray := true;
end;
end;
{$I+}
close( f );
end;

procedure snake( p: p_array; n: word );
var
i, j, k, d, s: integer;
begin
d := 1;
for s := 0 to n-1 do begin
if d > 0 then i := 0 else i := s;
for k := 0 to s do begin
j := s-i;
write( p^[i*n + j]:3 );
i := i + d;
end;
d := -d;
end;
for s := n to 2*(n-1) do begin
if d > 0 then i := s-n+1 else i := n-1;
for k := s to 2*(n-1) do begin
j := s-i;
write( p^[i*n + j]:3 );
i := i + d;
end;
d := -d;
end;
end;

procedure diag( p: p_array; n: word );
var
i, j, s: integer;
begin
for s := 0 to n-1 do begin
for i := s downto 0 do begin
j := s-i;
write( p^[i*n + j]:3 );
end;
end;
for s := n to 2*(n-1) do begin
for i := n-1 downto s-n+1 do begin
j := s-i;
write( p^[i*n + j]:3 );
end;
end;
end;

var fname: string;
n: word;
p: p_array;
ch : char;

begin
clrscr;
while true do begin
writeln( #13#10#10'Преобразовать квадратную матрицу в одномерный массив:' );
writeln( '1 - элементы записаны змейкой' );
writeln( '2 - элементы записаны по диагоналям' );
writeln( '-----------------------------------' );
writeln( '0 - выход из программы' );
repeat
ch := readkey;
until ch in ['0'..'2'];
if ch = '0' then exit;

write( #13#10'Введите имя файла: ' );
readln( fname );

if readArray( n, p, fname ) then begin
case ch of
'1': snake( p, n );
'2': diag( p, n );
end;
freemem( p, n*n*sizeof(integer) );
end;
end;
end.
Форма ответа