IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Выбор из двузначных чисел, Задача
Саня
сообщение 6.11.2004 22:29
Сообщение #1


Гость






Такая задача: "Выбор из двузначных чисел". Даны n (n>=12) различных двузначных чисел. Написать программу выбора из них двух чисел так, чтобы их разность давала двузначное число, записываемое двумя одинаковыми числами.

У меня ни как не получаеться sad.gif sad.gif sad.gif Может у кого нибудь получится....
 К началу страницы 
+ Ответить 
volvo
сообщение 6.11.2004 22:31
Сообщение #2


Гость






Цитата
У меня ни как не получаеться


Значит, пробовал? Какие есть идеи? Исходники (если есть) - в студию...
:D
 К началу страницы 
+ Ответить 
Саня
сообщение 6.11.2004 22:50
Сообщение #3


Гость






Идеи просто кончилисьsad.gif
 К началу страницы 
+ Ответить 
volvo
сообщение 6.11.2004 22:54
Сообщение #4


Гость






Тогда держи:

Код

type
 numset = set of byte;
const
 n = 15;
 arr: array[1 .. n] of byte =
   (23, 53, 71, 96, 34, 56, 29, 43, 56, 32, 68, 50, 49, 24, 67);

var
 x: array[1 .. n] of integer;
 nums: array[1 .. n] of numset;
 i: integer;

procedure writeset(i: integer);
 var x, count: byte;
 begin
   if nums[i] = [] then exit;

   writeln( 'набор #', i );
   count := 0;

   for x := 10 to 99 do
     if x in nums[i] then
       begin
         write(x:4); inc(count)
       end;

   if count < 2 then
     write( ' - нет пары' );
   writeln;
 end;

begin
 for i := 1 to n do
   begin
     x[i] := arr[i] mod 11;
     nums[ x[i] ] := nums[ x[i] ] + [ arr[i] ];
   end;

 writeln( 'любые из этих чисел:' );
 for i := 1 to n do
   writeset(i);

end.


Набирал без компилятора, так что могут быть ошибки ... Проверь ;)
 К началу страницы 
+ Ответить 
Altair
сообщение 7.11.2004 9:07
Сообщение #5


Ищущий истину
******

Группа: Модераторы
Сообщений: 4 824
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


синтаксических ошибок нет. smile.gif
Цитата
Написать программу выбора из них двух чисел

так надо всего 2 числа произвольных таких указать, или все пары чисел, удовлетворяющих этому правилу?


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Саня
сообщение 7.11.2004 12:17
Сообщение #6


Гость






Я тут немного доработал прогу под себя, проверьте: И есть еще пара вопросов..
Код

type
numset = set of byte;

const
MaxN=100;

var
x: array[1 .. maxN] of integer;
arr: array[1 .. maxN] of byte;
nums: array[1 .. maxN] of numset;
i,n,m: integer;

procedure writeset(i: integer);
var x, count: byte;
begin
  if nums[i] = [] then exit;

  writeln( 'nabor #', i );
  count := 0;

  for x := 10 to 99 do
    if x in nums[i] then
      begin
        write(x:4); inc(count)
      end;

  if count < 2 then
    write( ' - net par' );
  writeln;
end;

begin

repeat  
 writeln('Vvedite kolichestvo elementov');
readln(n)
until n<=MaxN;
For m:=1 to n do
begin
write('a[',m,']= ');
readln(arr[m])
end;

for i := 1 to n do
  begin
    x[i] := arr[i] mod 11;
    nums[ x[i] ] := nums[ x[i] ] + [ arr[i] ];
  end;

writeln( 'Lubie is chisel:' );
for i := 1 to n do
  writeset(i);
  readln;
end.

А как сделать, что бы допустим, при вводе чисел проверялось, являються ли они двузначными? И чтобы в ответе выдовал только одну пару чисел и делал запрос на вывод следующей?
 К началу страницы 
+ Ответить 
volvo
сообщение 7.11.2004 12:35
Сообщение #7


Гость






Саня

1. Зачем тебе нужно объявлять массив из 100 элементов, если использоваться будут, скажем, 10 из них... Не лучше ли выделить массив динамически?

2.
Цитата
А как сделать, что бы допустим, при вводе чисел проверялось, являються ли они двузначными?


Код

For m:=1 to n do
 repeat
   write('a[',m,']= ');
   readln(arr[m])
 until arr[m] in [10 .. 99];


3.
Цитата
И чтобы в ответе выдовал только одну пару чисел и делал запрос на вывод следующей?


Код

writeln( 'Lubie is chisel:' );
for i := 1 to n do
 begin
 writeset(i);
 writeln( 'press enter to print the next set' )
 readln;
 end;
end.
 К началу страницы 
+ Ответить 
Altair
сообщение 7.11.2004 13:03
Сообщение #8


Ищущий истину
******

Группа: Модераторы
Сообщений: 4 824
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


Век живи, век учись.
Цитата
Не лучше ли выделить массив динамически

Покажи пожалуйста пример... что-то не понял что ты имеешь ввиду...


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 7.11.2004 13:11
Сообщение #9


Гость






Oleg_Z

Вместо:
Код

var
...
arr: array[1 .. maxN] of byte;

...

repeat  
writeln('Vvedite kolichestvo elementov');
readln(n) { допустим, ввели 10 }
until n<=MaxN;
...
{ использование 10 элементов arr (остальные 90 не используются) }



я бы сделал так:

Код

type
 arrType = array[1 .. 1] of integer;
var
 arr: ^arrType;

...

repeat  
writeln('Vvedite kolichestvo elementov');
readln(n) { допустим, ввели 10 }
until n<=MaxN;
GetMem( arr, n*sizeof(integer));

{ и продоллжаем работать с arr^[i] вместо arr[i] }
...
FreeMem( arr, n*sizeof(integer));

 К началу страницы 
+ Ответить 
Altair
сообщение 7.11.2004 13:17
Сообщение #10


Ищущий истину
******

Группа: Модераторы
Сообщений: 4 824
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


круто ... не знал об этом... намотаю на ус.... smile.gif


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 7.11.2004 13:27
Сообщение #11


Гость






Саня

У тебя объявлен лишний массив ...
Вместо

Код

var
x: array[1 .. maxN] of integer;
...
for i := 1 to n do
 begin
   x[i] := arr[i] mod 11;
   nums[ x[i] ] := nums[ x[i] ] + [ arr[i] ];
 end;


можно сделать так:
Код

var
x: integer;
...
for i := 1 to n do
 begin
   x := arr[i] mod 11;
   nums[ x ] := nums[ x ] + [ arr[i] ];
 end;


Вот к чему приводит Ctrl-V :D
 К началу страницы 
+ Ответить 
Guest
сообщение 7.11.2004 22:15
Сообщение #12


Гость






Спасибо volvo
:D :D :D :D
 К началу страницы 
+ Ответить 
Саня
сообщение 8.11.2004 12:32
Сообщение #13


Гость






У меня возникло еще пара вопросов (надеюсь я не надоел :D ) :
проверку чисел на двузначность я сделал так
Код

write('a[',m,']= ');
 readln(arr[m]);
 for t:=1 to 3 do begin
   if ((arr[m]<10)) or ((arr[m]>99)) then begin
     writeln('Chisla dolzhny byt dvyznach');
     write('Vvedite zanovo: a[',m,']=');
     readln(arr[m]);
     dec(t);
   end;

Но она 100% работает только с однозначными числами, а с трехзначными - через раз? unsure.gif

И еще, ответ выходит в таком виде:
Lubie is chisel:
nabor #1
12 - net par
press enter to print the next set
press enter to print the next set

nabor #3
14 36
press enter to print the next set
nabor #4
37 48 92
press enter to print the next set ...

Нельзя ли сделать так, что бы в ответ выводились только по 2 цифры, и не писалось в противном случае, что нет пар.
Заранее благодарен!
 К началу страницы 
+ Ответить 
volvo
сообщение 8.11.2004 13:11
Сообщение #14


Гость






1.
Код

 for t:=1 to 3 do begin
  if ((arr[m]<10)) or ((arr[m]>99)) then begin
    writeln('Chisla dolzhny byt dvyznach');
    write('Vvedite zanovo: a[',m,']=');
    readln(arr[m]);
    dec(t); { Внутри цикла изменяется его параметр !!! }
  end;


я же уже писал выше проверку на двузначность числа... чем она не подходит?

2.
Цитата
Нельзя ли сделать так, что бы в ответ выводились только по 2 цифры


Цитата
nabor #4
37 48 92


какие именно 2 цифры? 37 и 48? или 48 и 92? а может 37 и 92? по какому критерию выбирать числа? или выводить все возможные перестановки по 2 числа? blink.gif
 К началу страницы 
+ Ответить 
Саня
сообщение 8.11.2004 15:23
Сообщение #15


Гость






Просто я хотел, что бы, если число не верное, выводилось об эом сообщение, и предложение его исправить.

Нужно что бы выводились все возможные переборы по 2 числа.
Примерно так:
37 48
press enter
48 92
press enter
37 92
 К началу страницы 
+ Ответить 
volvo
сообщение 8.11.2004 15:29
Сообщение #16


Гость






1.
Цитата
если число не верное, выводилось об эом сообщение, и предложение его исправить

Код

var
 good: boolean;
...
repeat
  write('a[',m,']= ');
  readln(arr[m]);
  good := arr[m] in [10 .. 99];
  if not good then
    writeln('Chisla dolzhny byt dvyznach. Eshe raz...');
until good;


2.
Цитата
Нужно что бы выводились все возможные переборы по 2 числа

Для этого придется переделывать программу полностью...
 К началу страницы 
+ Ответить 
volvo
сообщение 8.11.2004 15:53
Сообщение #17


Гость






Проверь вот это... Я думаю, это - то, что тебе нужно ...

Код

type
 numset = set of byte;
const
 maxn = 15;

var
 arr: array[1 .. maxn] of byte;

var
 x: integer;
 cnt: array[1 .. maxn] of integer;
 nums: array[1 .. maxn] of numset;
 i: integer;

procedure writeset(i: integer);
 var
   x, count: byte;
   numbers: array[1 .. maxn] of integer;
   ii, jj: integer;
 begin
   count := 0;

   for x := 10 to 99 do
     if x in nums[i] then
       begin
         inc(count); numbers[count] := x;
       end;

   for ii := 1 to count do
     for jj := ii + 1 to count do
       begin
         writeln( 'para:', numbers[ii], ' ', numbers[jj] );
         writeln( 'enter to view next pair' );
         readln;
       end;
 end;

var
 n: integer;
 good: boolean;

begin
 repeat
   writeln('Vvedite kolichestvo elementov');
   readln(n)
 until n <= maxN;

 for i := 1 to n do
   begin
     repeat
       write('a[',i,']= ');
       readln(arr[i]);
       good := arr[i] in [10 .. 99];
       if not good then
         writeln('Chisla dolzhny byt dvyznach. Eshe raz...');
     until good;

     x := arr[i] mod 11;
     nums[ x ] := nums[ x ] + [ arr[i] ];
     inc( cnt[ x ] );
   end;

 writeln;
 writeln( 'results:' );
 writeln;
 for i := 1 to n do
   if cnt[i] > 1 then
     writeset(i);

end.
 К началу страницы 
+ Ответить 
Саня
сообщение 8.11.2004 18:09
Сообщение #18


Гость






volvo
Это круто!!!!!
спасибо, спасибо, спасибо, спасибо !!!!!!!
 К началу страницы 
+ Ответить 
Саня
сообщение 7.01.2005 22:38
Сообщение #19


Гость






Не моглибы помочь еще немного?
к этой программе нужно какое ни буудь меню приделать, чтобы там было типа такого - пункты:
- Ввод данных в файл;
- Запуск самой программы ( в нем запрос имени файла, возможность ввода с клавиатуры или запуск счетчика случайных чисел; когда получен результат запросить сохранить результат в файл или нет);
- И пункт Help;
,если не сложно huh.gif huh.gif
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 21.06.2025 20:18
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"