Помощь - Поиск - Пользователи - Календарь
Полная версия: Две задачки
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Dushka
Учитель по информатике сказал что задачки простые, но для меня они темный лес. Может сможете мне помочь. Заранее благодарна .
1. Найти количество цифр кратных старшей цифре числа
2. В массиве 7*7 расставить строки в порядке возрастания количество четных чисел в их
Unconnected
Первая:

var i,n,res:integer;

begin
writeln('Vvedite chislo');
readln(n);res:=0;
while (n>9) do n:=n div 10;
for i:=1 to 9 do if (i mod n=0) then inc(res);
writeln(res);
readln;
end.



Dushka
Спасибо большое тебе Unconnected, осталась еще одна и я спасенаsmile.gif
Ozzя
Цитата
Учитель по информатике сказал что задачки простые, но для меня они темный лес. Может сможете мне помочь. Заранее благодарна .

Принципиально - не БУДУ. Ровно до тех пор, пока не исправите ошибки. Касающиеся не программирования "что Вы!?". А чиста русккаго языку.
Надеюсь, Вы Свой язык уважаете? norespect.gif
Dushka
Запятые, перед "что" и перед "сможете". wub.gif
Unconnected
№2:
const m=7;
var mas:array [1..m,1..m] of byte;
i,j:byte;

function getodd(st:byte):byte;
var i:byte;
begin
result:=0;
for i:=1 to m do if not(odd(mas[st,i])) then inc(result);
end;

Procedure swap(p1,p2:byte);
var i,buf:byte;
begin
for i:=1 to m do begin
buf:=mas[p1,i];
mas[p1,i]:=mas[p2,i];
mas[p2,i]:=buf;
end;
end;

Procedure output;
var i,j:byte;
begin
for i:=1 to m do begin
for j:=1 to m do write(mas[i,j],' ');
writeln;
end;
writeln;
end;

begin
randomize;
for i:=1 to m do for j:=1 to m do mas[i,j]:=random(50);
output;
for i:=1 to m-1 do
for j:=m-1 downto i do if getodd(j)>getodd(j+1) then swap(j,j+1);
output;
end.


Ozzя
, да вроде не так всё запущено, бывает и хуже smile.gif Я, кстати, рад, что хоть кому-то в школе задачки дают..)
Ozzя
Цитата
Запятые, перед "что" и перед "сможете".

Молодец. Еще тире после "они".
Жду Вашего варианта решения проблемы.
Dushka
ААААААааааааааааааааааааа, расцеловала бы, большое спасибо за помощь.
Ozzя
Цитата
Ozzя, да вроде не так всё запущено, бывает и хуже

Знаю. sad.gif

Dushka
Добрый дедушка Unconnected таки Вам помог. Не забудьте оному + поставить в рейтинг. ;)
Dushka
Не могу поставить, не нажимается. Почему?
Ozzя
Цитата
Не могу поставить, не нажимается. Почему?

Постов - маловато будет. Я поставлю за Вас, ежели не возражаете.
Гость
Спасибо и вамsmile.gif Возражении не имею!
Dushka
Я снова вернулась smile.gif , попросили обосновать задачки, а я ни бе ни ме ни кукареку mega_chok.gif , не могли бы вы еще пояснить алгоритм этих задачек, как-нибудь доступным языком все объяснить? wub.gif
Krjuger
Хех еще 9 дней и был бы ровно год с того момента как вам ответили.Вы более конкретно скажите что не можете описать словами?уж вывод на экран вы должны понимать как производиться в процедуре output.Если в кратце,то функция getodd считает количество НЕчетных чисел в строке и выводит в качестве результата.Функция swap меняет местами 2 строки.
А дальше остновная программа.В цикле проверяем,если количество нечетных в текущей строке больше чем в следующей,то меняем местами.
Dushka
Саму суть задач мне бы разжевать unsure.gif
Krjuger
Ну смотри у тебя есть массив 7х7 в нем в произвольном порядке записаны числа ты смотриш сколько у тебя в каждой строке четный чисел.Например в первой строке 1, во второй 4, в третьей 2, и тд.Ну и потом надо переставить строки так,чтобы вот эти самые числа были в порядке возрастания,тобиш в каждой следующей строке было как минимум не меньше,чем в предыдущей,тобиш первая строка останется на месте, а вторая и третья поменяются местами.Для примера,который я привел.
Dushka
Так, во вторую задачу вроде как вклинилась, а можно еще первую? smile.gif
IUnknown
Ну, первую, для начала, надо правильно решить, прежде чем объяснять... Ибо то, что сейчас в посте №2 - оно, конечно, решает какую-то задачу, только не заданную в условии. Не верю я, что требовалось найти, сколько всего есть цифр, кратных старшей цифре числа. Наверняка задание стояло так: найти количество цифр числа, кратных его старшей цифре... Скажем, в 47854 их будет 3, а в 7889 - одна, если саму старшую цифру считать. Кстати, вот еще подвох: а считать ли?

Возможно, если бы это задание было решено верно - то продолжения бы не последовало...
Unconnected
Ну, если задание и правда такое, то вот, лучше поздно)

var oldest,c:char;
oldestv,r:byte;
begin
r:=1;
read(oldest);
oldestv:=ord(oldest)-ord('0');
repeat
read©;
if ((ord©-ord('0')) mod oldestv=0) then inc®; //добавить в условие "and (c<>#13)"
until (c=#13);
writeln®;
readln;readln;//второй нужен, потому что при выходе из цикла первый сразу срабатывает..
end.
IUnknown
Это неправильное решение. Введи 5735, и удивись, а с чего бы это 5-ка встречается 3 раза? smile.gif Открою тайну: Ord(#13) - Ord('0') = -35, хотим остаток от деления на 5 - получаем что? Ага, он самый, 0...

А насчет двух ReadLn подряд - ну сколько же можно говорить? После цикла прочитай из буфера #10 еще одним Read-ом, и не надо будет магические несколько ReadLn-ов добавлять для ожидания...
Unconnected
Огоо, вот это бы я долго ловил..) Добавил в тот пост поправку.
Dushka
Почему-то результат теперь не показывает.
Unconnected
var oldest,c:char;
oldestv,r:byte;
begin
r:=1;
read(oldest);
oldestv:=ord(oldest)-ord('0');
repeat
read©;
if ((ord©-ord('0')) mod oldestv=0) and (c<>#13) then inc®;
until (c=#13);
read©;
writeln®;
readln;
end.

У меня показывает..
Dushka
Мне предлагается все время вводить число wink.gif
Unconnected
Ну так ввела число и энтэр вводи.)
Dushka
Ввожу, нажимаю и опять ввожу и опять нажимаю ....
IUnknown
Если у тебя PascalABC - то просто убери последний ReadLn, программа закончится сразу же после обработки введенного числа...
Dushka
не помогло wink.gif
IUnknown
Цитата
не помогло
Значит, выкини свой старый компилятор и возьми на сайте новый. Я СНАЧАЛА проверяю, ПОТОМ советую.
Dushka
запустила в делфи, заработало, спасибо, а можно теперь объяснить? rolleyes.gif
Lapp
Цитата(Unconnected @ 16.06.2011 16:19) *
var oldest,c:char;
oldestv,r:byte;
begin
r:=1;
read(oldest);
oldestv:=ord(oldest)-ord('0');
...

Ой, не по нутру мне это.. Препод, может, эту писанину и примет (я б - ни за что!)), но по большому счету - так нельзя..
А если я поставлю пробел перед вводом числа?.. или, если начну его с нуля? или введу в шестнадцатиричной форме, $25 или 0x25? И потом - кто сказал, что число положительное??.. или - что оно целое??? blink.gif в условии этого нет.. no1.gif В конце концов, нужно уметь хотя бы остановить программу по ошибке ввода, когда препод попробует "пошутить" и введет буковку - твоя прога прилееееежно все просчитает и выдаст чушь wacko.gif.

Уж либо ты пользуешь стандартный числовой ввод, либо сам обрабатываешь все подобные ситуации. А последнее, мне кажется, в данном контексте - просто абсурд )). Мне кажется, лучше вернуться к первому варианту ввода, но добавить обработку отрицательных и извиниться перед дамой, что ниасилил дробные (в надежде, что она уточнит условие, и они не понадобятся)).
Unconnected
Цитата
$25 или 0x25

Не знаю, мне кажется не подразумевались в условии такие выкидоны) А поддержку отрицательных можно сделать незначительной доработкой(и буквы тоже ею отрезать, одним условием). Ну вообще ни разу тут не видел try-except в подобных задачках)
Lapp
Цитата(Unconnected @ 17.06.2011 10:25) *
Не знаю, мне кажется не подразумевались в условии такие выкидоны)
Какие это выкидоны? Пробел перед числом - выкидон? Минус - выкидон?.. Всегда, когда дашь человеку полный анализ всех аспектов - обязательно зацепится за самую незначительную деталь и начнет возражать вместо спасиба..

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