![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
liverpool85 |
![]()
Сообщение
#1
|
Группа: Пользователи Сообщений: 8 Пол: Мужской Репутация: ![]() ![]() ![]() |
Здравствуйте! Напишите программу, выводящую все трехзначные номера (от 001 до
999), сумма цифр которых равна N (значение N вводит пользователь). Мой код- var i,a,b,c,w:integer;
n,p:string;
begin
writeln('Vvedite chislo ot 0 do 999: ');
readln(n);
begin
for i:=1 to 999 do
a:=i div 100;
b:=i div 10 mod 10;
c:=i mod 10;
w:=a+b+c;
p:=IntToStr(w);
if p=n then writeln(p,' ');
end;
end.
И еще один - uses crt;
var n,i,a,b,c,w,k:integer;
s:string;
begin
write('Сумма цифр n=');
readln(n);
writeln('Номера с суммой цифр, равной ',n);
k:=0;
for i:=1 to 999 do
begin
a:=i div 100;
b:=i div 10 mod 10;
c:=i mod 10;
w:=a+b+c;
if w=n then
begin
k:=1;
str(i,s);//чтобы на всех Паскалях шло
//s:=IntToStr(i); //для АВС
if i<10 then s:='00'+s
else if i in [10..99] then s:='0'+s;
write(s:4);
end;
end;
if k=0 then write('Таких номеров нет')
end.
Почему то не выводит все номера))) |
IUnknown |
![]()
Сообщение
#2
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Во-первых, не надо вводить число от 0 до 999 (я о первой программе, если что). Максимальная сумма цифр = 27, вот и вводи число 0 .. 27.
Второе: зачем ты ввод пользователя воспринимаешь как строку? Вводишь число - так опиши n как Integer, тут же избавишься от необходимости преобразовывать постоянно Integer -> String (или обратно) для сравнения. Третье - у тебя не в том месте стоит begin. Надо поменять 6 и 7 строки местами. Ну, и четвертое - не то печатаешь. Надо напечатать число, а не сумму цифр, сумма тебе и так известна, ты ж ее сам и вводил. Итого: var
i, a, b, c, w: integer;
n: integer;
begin
writeln('Vvedite chislo ot 0 do 27: ');
readln(n);
for i:=1 to 999 do
begin
a:=i div 100;
b:=i div 10 mod 10;
c:=i mod 10;
w:=a+b+c;
if n=w then writeln(i,' ');
end;
end.
Это если не менять алгоритм решения, а править только реализацию. |
liverpool85 |
![]()
Сообщение
#3
|
Группа: Пользователи Сообщений: 8 Пол: Мужской Репутация: ![]() ![]() ![]() |
![]() |
liverpool85 |
![]()
Сообщение
#4
|
Группа: Пользователи Сообщений: 8 Пол: Мужской Репутация: ![]() ![]() ![]() |
Упс, а нужно выводить не 1,2,3 а 001,002,003!!!
|
IUnknown |
![]()
Сообщение
#5
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата //чтобы на всех Паскалях шло - проще всего сделать так: if n=w then
begin
if a = 0 then write(0); // Первая цифра - 0? Выводим этот 0...
if (a + b = 0) then write(0); // Первая И ВТОРАЯ - нули: добавляем еще один 0
writeln(i,' '); // А потом уже выводим само число...
end;
|
liverpool85 |
![]()
Сообщение
#6
|
Группа: Пользователи Сообщений: 8 Пол: Мужской Репутация: ![]() ![]() ![]() |
var
k, n, i, a, b, c, w: integer;
s: string;
begin
writeln('Vvedite chislo ot 0 do 27: ');
readln(n);
for i:=1 to 999 do
begin
a:=i div 100;
b:=i div 10 mod 10;
c:=i mod 10;
w:=a+b+c;
if n=w then
begin
k:=1;
str(i,s);
if i<10 then s:='00'+s
else if i in [10..99] then s:='0'+s;
writeln(s:4,' ');
end;
end;
if k=0 then write ('Takih nomerov net');
end.
Теги ставь, пожалуйста Lapp |
Lapp |
![]()
Сообщение
#7
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
- проще всего сделать так: if n=w then
begin
if a = 0 then write(0); // Первая цифра - 0? Выводим этот 0...
if (a + b = 0) then write(0); // Первая И ВТОРАЯ - нули: добавляем еще один 0
writeln(i,' '); // А потом уже выводим само число...
end;
IUnknown, что-то это не похоже на тебя.. Не выспался? )) Почему не так: WriteLn(a,b,c);
- ? ![]() 2 liverpool85: Не забывай инициализировать переменные - я имею в виду k в данном случае. Кстати, лучше ее сделать типа boolean, раз уж на используется для проверки. Переменная w - абсолютно лишняя, сумму можно находить прямо в if. Все числовые параметры задавай константами. Например: const
n1= 1;
n2= 999;
...
for i:=n1 to n2 do ...
И совет: по возможности избегай слова "таких" в выводе результатов. Пиши полностью, не ленись: WriteLn('Чисел с суммой цифр ',n,' в диапазоне от ',n1,' до ',n2,' не найдено');
Иначе ты запустишь эту прогу через неделю, и ни фига не поймешь, что это она такое сделала )). И твой преп тебе скажет спасибо - у него много студентов, много групп, много вариантов. Ему проще, когда видно, что делает прога. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
liverpool85 |
![]()
Сообщение
#8
|
Группа: Пользователи Сообщений: 8 Пол: Мужской Репутация: ![]() ![]() ![]() |
Спасибо за дельные советы!!
Подправил малость const
n1=1;
n2=999;
var
n, i, a, b, c: integer;
s: string;
k: boolean;
begin
writeln('Vvedite chislo ot 0 do 27: ');
readln(n);
for i:=n1 to n2 do
begin
a:=i div 100;
b:=i div 10 mod 10;
c:=i mod 10;
if n=a+b+c then
begin
k:=true;
str(i,s);
if i<10 then s:='00'+s
else if i in [10..99] then s:='0'+s;
writeln(s:4,' ');
end;
end;
if k=false then write ('Chisel s summoj zifr ',n,' v diapazone ot ',n1,' do ',n2,' net');
end.
|
Lapp |
![]()
Сообщение
#9
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
Подправил малость Однако, приятно, когда советы не игнорируются! Тогда пойдем до конца )). Я тоже подправил, смотри комментарии по тексту. const
n1=1; { сдвигай! }
n2=999;
var
n, i, a, b, c: integer;
{ s не нужна, убери
s: string; }
k: boolean;
begin
{ я бы убрал диапазон.. ну, выдаст, что нет таких - что такого? это тоже результат }
{ вставил "целое" }
writeln('Vvedite celoe chislo ot 0 do 27: ');
readln(n);
k:= false; { обязательно инициализируй! не полагайся на компилятор }
for i:=n1 to n2 do begin
a:= i div 100;
b:= i div 10 mod 10;
c:= i mod 10;
if n=a+b+c then begin { привыкай ставить begin в конце строки, если преп не против )) }
k:=true; { после begin - сдвигать, однозначно}
WriteLn(a,b,c) { не нужно никаких ухищрений, у тебя же уже есть цифры (см. мой коммент на пост IUnknown) }
end; { end стоит точно в той позиции, где начинается строка с begin }
end;
{ не k=false, а not k }
if not k then write ('Chisel s summoj zifr ',n,' v diapazone ot ',n1,' do ',n2,' net');
end.
-------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
IUnknown |
![]()
Сообщение
#10
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата { я бы убрал диапазон.. ну, выдаст, что нет таких - что такого? это тоже результат } Таких не просто "нет", их "быть не может", так что я бы как раз и добавил диапазон:var
n : 0 .. 27; // или 1 .. 27
, и если введено не то значение - пусть программа сразу вылетает (или обрабатывать ошибку до тех пор, пока не будет введено правильное значение, попадающее в интервал). var
n : 0 .. 27;
Ok : boolean;
begin
writeln('Введите число от 0 до 27:');
repeat
Ok := true;
try
readln(n);
except
writeln('Нет, число должно быть 0 .. 27');
Ok := false;
end;
until Ok;
// Всё, число введено, едем дальше...
writeln('n = ', n);
end.
Правда, позволяет ли это PascalABC - сказать сложно (не помню, а проверять негде). Но всегда можно заставить вводить пользователя значение из заданного интервала. Хотя бы даже и так: var n : integer;
begin
repeat
{$I-} Readln(n); {$I+}
until (IOResult = 0) and (n > 0) and (n <= 27);
end.
P.S. Ну, или совсем просто: не делая никаких проверок при вводе - сразу же проверять введенное число на 1 .. 27. Если принадлежит этому интервалу - то что-то можно начинать вычислять. Иначе сразу выдавать сообщение, что, мол, "при таких входных данных - какие вы хотите получить результаты? Вот, вы их и получили. Ничего нет и быть не может" Сообщение отредактировано: IUnknown - 10.09.2011 9:21 |
liverpool85 |
![]()
Сообщение
#11
|
Группа: Пользователи Сообщений: 8 Пол: Мужской Репутация: ![]() ![]() ![]() |
Если делать согласно последнему комменту, то отпадает потребность в булеан :
const
n1=1;
n2=999;
var
n: 0 .. 27;
i, a, b, c: integer;
begin
writeln('Vvedite chislo ot 0 do 27: ');
repeat
readln(n);
until (n>0) and (n<=27);
for i:=n1 to n2 do begin
a:=i div 100;
b:=i div 10 mod 10;
c:=i mod 10;
if n=a+b+c then begin
writeln(a,b,c);
end;
end;
end.
|
-Lapp- |
![]()
Сообщение
#12
|
Гость ![]() |
Таких не просто "нет", их "быть не может", так что я бы как раз и добавил диапазон: Немного странно мне это.. 27 - это же жесткая привязка к диапазону. А завтра преп скажет: сделай мне для диапазона 0000 - 9999. Менять 27 на 36? Хорошо, а если скажет от 015 до 456? Если 27 появляется в программе и зависит от диапазона - оно должно вычисляться по диапазону. А как вычислять для диапазона 03 - 12? Да вот так и вычислять - прогнать через цикл.. Предложи способ вычисления диапазона ввода для произвольного диапазона чисел - отстану ![]() |
sheka |
![]()
Сообщение
#13
|
![]() Я. ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 809 Пол: Мужской Реальное имя: Саша Репутация: ![]() ![]() ![]() |
Цитата привыкай ставить begin в конце строки А это еще почему? |
-TarasBer- |
![]()
Сообщение
#14
|
Гость ![]() |
Потому что если строка начинается с ключевого слова (if,for,while), то это слово и так выглядит ярко, оно отлично (в паре с закрывающим ендом) выделяет блок кода, поэтому лишний раз переносить бегин не надо.
А если его переносить, то будут отвратительные заборы из ключевых слов, долгое смотрение на которые может привести к эпилепсии. |
liverpool85 |
![]()
Сообщение
#15
|
Группа: Пользователи Сообщений: 8 Пол: Мужской Репутация: ![]() ![]() ![]() |
Потому что если строка начинается с ключевого слова (if,for,while), то это слово и так выглядит ярко, оно отлично (в паре с закрывающим ендом) выделяет блок кода, поэтому лишний раз переносить бегин не надо. А если его переносить, то будут отвратительные заборы из ключевых слов, долгое смотрение на которые может привести к эпилепсии. ![]() |
Lapp |
![]()
Сообщение
#16
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
А это еще почему? лучше 1 раз попробовать, чем 10 раз спросить ))Добавлено через 7 мин. liverpool85, со сдвигами у тебя еще бардак.. const
n1=1;
n2=999;
...
if n=a+b+c then begin
writeln(a,b,c);
end;
end;
end.
Даже если вносишь заведомо врЕменное изменение в прогу - все равно не ленись форматировать. Лучше сдвинуть нескобко раз туда-сюда, чем оставить неправильно и запутаться в двух строчках. И уж тем более, если показываешь свой код другим.. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
volvo877 |
![]()
Сообщение
#17
|
Гость ![]() |
Цитата лучше 1 раз попробовать, чем 10 раз спросить )) Пробовали. Вернулись к варианту исходников VCL, то естьif cond then
begin
expr1;
end
else
begin
expr2;
end;
Цитата лишний раз переносить бегин не надо. Лично мне гораздо проще читать исходники той же VCL, чем FPC-шные (и Лазарусовские, кстати) исходники, где begin-ы в основном не переносятся А если его переносить, то будут отвратительные заборы из ключевых слов, долгое смотрение на которые может привести к эпилепсии. ![]() |
liverpool85 |
![]()
Сообщение
#18
|
Группа: Пользователи Сообщений: 8 Пол: Мужской Репутация: ![]() ![]() ![]() |
Огромное спасибо всем!
|
Гость |
![]() ![]()
Сообщение
#19
|
Гость ![]() |
Спасибо за дельные советы!! Подправил малость const
n1=1;
n2=999;
var
n, i, a, b, c: integer;
s: string;
k: boolean;
begin
writeln('Vvedite chislo ot 0 do 27: ');
readln(n);
for i:=n1 to n2 do
begin
a:=i div 100;
b:=i div 10 mod 10;
c:=i mod 10;
if n=a+b+c then
begin
k:=true;
str(i,s);
if i<10 then s:='00'+s
else if i in [10..99] then s:='0'+s;
writeln(s:4,' ');
end;
end;
if k=false then write ('Chisel s summoj zifr ',n,' v diapazone ot ',n1,' do ',n2,' net');
end.
|
![]() ![]() |
![]() |
Текстовая версия | 18.07.2025 19:43 |