• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Пара задач с олимпиады

  • Автор темы Автор темы ummasha
  • Дата начала Дата начала
Сегодня на курсах по информатике нам объясняли, как решать задачи типа С2 (из ЕГЭ). Вот одна из них:дан целый квадратный массив 10 на 10, описать алгоритм вычисления суммы максимальных элементов из каждой строки (в каждой строке только 1 такой элемент), напечатать значение суммы.

Program C2;
Var a:array [1..10,1..10]of integer;
i,j,m,S:integer;
BEGIN
For i:=1 to 10 do
begin
For j:=1 to 10 do a[i,j]:=random(1000);
end;

For i:=1 to 10 do
begin
For j:=1 to 10 do write(a[i,j],' ');
writeln;
end;

S:=0;
For i:=1 to 10 do
begin
m:=a[i,1];
For i:=1 to 10 do
If a[i,j]>m then m:=a[i,j];
S:=S+m;
end;
writeln('S=',S);
END.

Программа нормально работает, но преподаватель сказал, что это и это действия можно объединить в одно. Как это сделать?
 
Полагаю, что так:

For i:=1 to 10 do
begin
For j:=1 to 10 do
begin
a[i,j]:=random(1000);
write(a[i,j],' ');
end;
writeln;
end;
 
Спасибо! :) А то преподаватель показал нам предыдущий вариант, а этот не стал: сказал, что не поймем и не запомним(((
 
Возникла проблема со следующей задачей: дан двумерный массив 5 на 6, заполненный целыми числами. Сформировать одномерный массив, каждый элемент которого равен произведению четных положительных элементов соответствующего столбца.
Решение:
Program K4_W1_1;
Var a:array[1..100,1..100] of integer;
b:array[1..100] of integer;
i,j,p,n,m:integer;
BEGIN
writeln;
randomize;
write('n=');readln(n);
write('m=');readln(m);
For i:=1 to n do
begin
For j:=1 to m do
begin
a[i,j]:=random(45)-22;
write(a[i,j]:4);
end;
writeln;
end;
For j:=1 to m do
begin
p:=1;
For i:=1 to n do
If (a[i,j]>0)and(a[i,j] mod 2=0) then
p:=p*a[i,j];
If p<>1 then
begin
writeln('столбец ',j,' p=',p);
b[j]:=p;
end
else
begin
writeln('в столбце ',j,' нет четных положительных чисел');
b[j]:=0;
end;
For i:=1 to n do
write(b[j],' ');
readln;
end;
END.

Получается все, кроме заполнения одномерного массива(((((

n=5
m=6
-11 5 -15 13 11 -14
8 -4 -17 -17 -4 -14
-5 -13 5 9 7 -8
11 -3 6 -22 -10 10
-14 -7 -15 8 20 -10
столбец 1 p=8
8 8 8 8 8 в столбце 2 нет четных положительных чисел
0 0 0 0 0 столбец 3 p=6
6 6 6 6 6 столбец 4 p=8
8 8 8 8 8 столбец 5 p=20
20 20 20 20 20 столбец 6 p=10
10 10 10 10 10

Подскажите, как это сделать.
 
Подскажите, как это сделать.

Да просто исправить ошибку в пятой строке снизу. Должно быть
For j:=1 to m do
а у Вас
For i:=1 to n do

Да, еще одно - end в предпоследней строке не на месте: его надо поставить ПЕРЕД последним циклом. Т.е. конец программы должен быть таким:

b[j]:=0;
end;
end;
For j:=1 to m do
write(b[j],' ');
readln;
END.
 
Последнее редактирование:
Спасибо большое за помощь! :) Опечатки в книге просто достали!
Программу изменила, и теперь она нормально работает! :)
 
Последнее редактирование:
Я попробовала написать программу на Паскале, похожую на "ЭКГ" ( http://www.tehnari.ru/showthread.php?t=18977 ), которая выводит в блокнот данные (имя, фамилия, год рождения и т.д.), но запуталась в незнакомых типах данных. Скажите, как сделать такую программу.
 
Я попробовала написать программу на Паскале, похожую на "ЭКГ" ( http://www.tehnari.ru/showthread.php?t=18977 ), которая выводит в блокнот данные (имя, фамилия, год рождения и т.д.), но запуталась в незнакомых типах данных. Скажите, как сделать такую программу.

Маша, опишите, пожалуйста, подробнее - что требуется? Что вводится, в каком виде Вы хотите вывести, в каких типах данных запутались?
 
Я бы очень хотела разобраться с типами данных "строка" и "символьный". Во-первых, их не объясняли в школе, во-вторых, данные таких типов есть в ЕГЭ, а в-третьих, я стала решать эти задачи из ЕГЭ, но ничего не получается((( Пробовала набирать программу как в книжке, а Паскаль выдает ошибку.
 
Вот одна из задач, которые я пыталась решить:
picture.php


Вот решение, приведенное в книге и набранное мной в Паскале:
Program C4;
Var a:array[1..300] of record
Name:string;
Sum:integer;
end;
C:char;
i,j,S,m,n:integer;
BEGIN
readln(n);
For i:=1 to n do
begin
a.name:='';
repeat
read(C);
a.name:=a.name+c
until c='';
repeat
read(C);
a.name:=a.name+c
until c='';
S:=0;
For j:=1 to 3 do
begin
read(m);a.Sum:=m;
If a.Sum>=30 then S:=S+1;
end;
If S=3 then writeln(a.name);
readln;end;
END.

У меня возникло несколько вопросов:
1)Зачем здесь нужен end и почему перед ним не стоит begin;
2)Что за странное "приглашение";
3)Что требуется поставить здесь - кавычки или апострофы (в книге их вообще было 3 штуки, но программа указывала на ошибку).
 
Последнее редактирование:
Я бы очень хотела разобраться с типами данных "строка" и "символьный". Во-первых, их не объясняли в школе, во-вторых, данные таких типов есть в ЕГЭ, а в-третьих, я стала решать эти задачи из ЕГЭ, но ничего не получается((( Пробовала набирать программу как в книжке, а Паскаль выдает ошибку.

Ну раз уж набивали - покажите, что за программа. Разберемся. А в самИх типах, в принципе, ничего сложного. Тип Char это литерный тип, переменная этого типа принимает значение буквы, цифры, знака или символа. Строка (тип STRING) это что-то вроде одномерного массива литер. "Что-то вроде" потому что есть некоторые тонкости. Например, присваивать литерной переменной значение элемента строки можно, а вот обратная манипуляция не проходит (впрочем не исключаю, что это свойство моего транслятора). Например, программа

VAR
name:STRING;
letter:Char;
BEGIN
name:='Masha';
letter:=name[3];
Writeln(letter);
Readln;
END.

пройдет абсолютно нормально и выдаст как результат литеру "s". А вот такая:

VAR
name:STRING;
BEGIN
name[1]:='M';
name[2]:='a';
name[3]:='s';
name[4]:='h';
name[5]:='a';
Writeln(name);
Readln;
END.

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

P.S. Вообще-то странно вас учат в школе, потому как всегда считалось, что Паскаль прежде всего ориентирован на работу со всякими там строками, символами и прочим таким разным.
 
Vladimir_S, спасибо огромное за объяснение))) Одну из задач и вопросы по ней я выложила, а про то, что Паскаль предназначен для работы со строками и символами, слышу первый раз((( В школе мы остановились на двухмерных массивах, а сейчас у нас новая тема, вообще не связанная с программированием(((
 
У меня возникло несколько вопросов:
1)Зачем здесь нужен end и почему перед ним не стоит begin;
2)Что за странное "приглашение";
3)Что требуется поставить здесь - кавычки или апострофы (в книге их вообще было 3 штуки, но программа указывала на ошибку).

Так, давайте последовательно. В Паскале существуют, если не ошибаюсь, 3 случая, когда возникает оператор "end" без предшествующего "begin". С одним из них Вы и столкнулись. Эти случаи таковы:
1. Оператор выбора ("Case"). Употребляется когда, например, нужно в зависимости от значения какой-либо целой переменной выполнить ту или иную операцию. Конечно, можно написать так:
IF i=1 THEN ... ELSE IF i=2 THEN ... ELSE IF i=3 THEN ... ну и т.п. (здесь многоточиями обозначены некие операции - неважно какие). Но лучше использовать CASE. Выглядит это так:
CASE i OF
1: ... ;
2: ... ;
3: ... ;
END;

2. - Ваш случай. Используется тип Запись (Record). Запись - это нечто вроде одномерного массива, элементами которого являются переменные РАЗНЫХ ТИПОВ. Например, Вы хотите составить некую справку по Вашим одноклассникам, указав такие данные: фамилия, возраст, пол. Вот тут очень удобно использовать тип Запись.
TYPE
Class = Record
Surname: STRING;
Age: BYTE;
Sex: Char;
END;

VAR
My_Classmates: ARRAY[1..15] of Class;

Surname, Age и Sex это так называемые ПОЛЯ записи. Как присваивать им значения? А вот как. Заполним элемент нашего массива для одной ученицы, первой в списке. Поля такие: Utjuzova, 16, w. Синтаксис такой: ИмяПеременной-Точка-ИмяПоля-Присваивание. Т.е. в данном случае:

My_Classmates[1].Surname:= 'Utjuzova';
My_Classmates[1].Age:= 16;
My_Classmates[1].Sex:= 'w';

3. Еще "end" без "begin" употребляется при написании модулей, там вместо "begin" ставится "Implementation". Но этого мы разбирать не будем.
 
Вот как раз эта программа на моем Паскале не идет по указанной в #51 причине. Но это сугубо мои проблемы.
 
Я проверила, у меня первая программа идет, а вторая - нет(#51). Спасибо вам большое за пост #53 - подробное и доступное объяснение)))
 
Решали сегодня на курсах задачу на исполнителя, но не решили. Вот текст задачи:

picture.php


В книге указан 4-й вариант ответа, но преподаватель не объяснил, почему, и сказал, что где-то в условии есть опечатка: то ли неправильно указано число повторов, то ли угол поворота(((
 
Число повторов точно правильно -- потому что в противном случае мы не получим восьмиугольник. С градусами скорее всего напороли -- должно быть 135 (или 55 -- не до конца понимаю логику алгоритма). В данном случае мы получаем недостроенный 9-ти угольник. Достаточно вспомнить формулу из геометрии -- сумма углов любого многоугольника подчиняется формуле 180(n-2)=S, где S и есть сумма.
Далее объясню свое решение -- при повороте скорее всего мы получаем угол 180 - RT. Тогда просто считаем -- 180(n-2)=(180-RT)n Подставив RT40, получим
180n-360=140n;
40n=360
n=9
 
Но в ответах нет 9-угольника(((
 
Я понимаю. Да мы его и не получим таким образом -- число поворотов маленькое. То есть мы не можем получить что-то нормальное с таким условием. Скорее всего неправильны углы, потому что
в ответах нет 9-угольника(((
 
Кстати, вдруг кому-то интересно будет -- МГУ проводит интернет-олимпиаду по нанотехнологиям для школьников, студентов, аспирантов, научных сотрудников и т.д.

www.nanometer.ru
 
Назад
Сверху