IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Программирование (http://www.imho.ws/forumdisplay.php?f=40)
-   -   Вопрос по TurboPascal'ю (http://www.imho.ws/showthread.php?t=42635)

Warchief 05.11.2003 17:55

Вопрос по TurboPascal'ю(safe Warchief)
 
Ребята помогите пожалуйста со следующей програмой.
Програма должна перевести введённые числа в тип string,
и короткую строку дополнить спереди нулями до длины большей строки и вывести на экран.Это тот кусок проги который я и сам могу, а вот дальше никак.Помогите плиз очень надо!

Program ASD;
uses wincrt;
var dlina1, dlina2:byte;
chislo1,chislo2:string[40];

begin
writeln ('задайте первое число');
readln(chislo1);
writeln ('задайте второе число')
readln (chislo2);
dlina1:= length (chislo1);
dlina2:= length (chislo2);
if dlina1>dlina2 then
dlina1:= abs(dlina1-dlina2);

YAS 05.11.2003 18:51

а если dlina2 больше dlina1, то что тогда? и еще, в данном участке у тебя теряется значение dlina1.

даже этот участок кода содержит алгортмическую ошибку.

постараюсь сегодня вечером набросать пример и прикрепить.

YAS 05.11.2003 22:08

Заголовок проги допишешь сам. Я приведу только тело.

begin
writeln ('задайте первое число');
readln(chislo1);
writeln ('задайте второе число')
readln (chislo2);
dlina1:= length (chislo1);
dlina2:= length (chislo2);
dlina:= abs(dlina1-dlina2);
strdop := '';
for i := 1 to dlina do
strdop := concat('0', strdop);
if dlina1 > dlina2 then
chislo2 := concat(strdop, chislo2)
else
chislo1 := concat(strdop, chislo1);
writeln ('вывод первого числа: '); writeln (chislo1);
writeln ('вывод второго числа: '); writeln (chislo2);
end.

Warchief 05.11.2003 23:08

Спасибо большое друг!

YAS 06.11.2003 12:43

Warchief
Если что, обращайся! ;)

Warchief 01.06.2004 20:15

Помогите решить ещё одну задачу на ТурбоПаскале плиз!

Вот сама задача:

В двумерном массиве должны быть сгенирированы 20 случайных чисел из любого интервала(скажем от 1 до 255) и нужно вычислить сколько чисел из этих 20 не делятся
на 2 без остака, и вывести эти числа на экран.


Плиз помогите очень нужноо!!! :молись:

Slanj 01.06.2004 22:20

Warchief
Не волнуйся, сщас с работы домой приду и посмотрю. (На работе паскаля нет ;) )

nibl 01.06.2004 23:29

Код:

VAR
  a:                array[1..4,1..5] of Integer;
  i,j,Count: Integer;

BEGIN
  Randomize;
  for i := 1 to 4 do
        for j := 1 to 5 do
          a[i,j] := Random(255)+1;
  Count := 0;
  for i := 1 to 4 do
        for j := 1 to 5 do
          if (a[i,j] mod 2) <> 0 then
                begin
                  Inc(Count);
                  Write(a[i,j],'  ');
                end;
  WriteLn;
  WriteLn('Найдено ',Count,' нечетных чисел.');
  ReadLn;
END.

Не делятся на 2, то есть нечетные => можно использовать функцию Odd().
Код:

if Odd(a[i]) then и т.д.

Warchief 02.06.2004 01:29

nibl

Спасибо ОГРОМНОЕ, очень сильно выручил :yees: :yees: :yees: :yees: :beer: :ржать:, жаль нельзя поставить большое кол-во оценок, а то бы я наставил :biggrin:

Slanj

Спасибо и тебе, хотел помочьросто не успел :biggrin:

Ну и 2 вопроса ещё к вам: объясните пожалуйста, что означает строка:
array[1..4,1..5], а именно почему интервалы записаны через запятую и почему их тут два. И как он генерит 20 случайных чисел, если нигде в иходнике не упоминается число 20? :confused:

Slanj 02.06.2004 02:13

Ну уж если я не успел с прогой помочь, то хоть обьясню немного. array[1..4,1..5] - тебе же двухмерный массив нужен был, так вот ты и получил массив высотой 4 и шириной 5 (еще можно сказать матрица). Через запятую интервалы (размерности) написаны потомучто у паскаля синтаксис такой. Программа генерирует 20 чисел, так как у твоего массива количество элементов 20 (помнож 5 на 4, примерно как площадь :) ) . Например, если ты создаш массив mas : array [1..7,1..4] - то у тебя массив высотой 7 и шириной 4, а обратившись к его элементу array[2,3], ты получиш элемент, который нахдится во втором столбце, третей стороке. Надеюсь, не очень плохо описал. Если что - спрашивай.

Warchief 02.06.2004 17:37

Slanj
Спасибо всё понятно объяснил :yees:

Тогда ещё один вопрос, если можно :rolleyes:
Как бы выглядела программа с массивом такого типа:
a: array[1..20] of Integer;

Так думаю я:

VAR
a: array[1..20] of Integer;
i,Count: Integer;

BEGIN
Randomize;
for i := 1 to 20 do
a[i] := Random(255)+1;
Count := 0;
for i := 1 to 20 do
if (a[i] mod 2) <> 0 then
begin
Inc(Count);
Write(a[i],' ');
end;
WriteLn;
WriteLn('Найдено ',Count,' нечетных чисел.');
ReadLn;
END.

Правильно ли это?

dr-evil 02.06.2004 18:48

1. Обращение a[i] к двумерному массиву (матрице) неверно, надо использовать a[i,j]
2. Немного сменится алгоритм -
например можно сделать так:
for i=1 to 20 do
for j=1 to 20 do
if (a[i,j] mod 2)=0 then inc(count);
end;
writeln('Найдено ', count, 'чисел');
вот и все.

PS тока не помню, mod остаток от деления или div =)

Warchief 02.06.2004 19:59

Цитата:

Обращение a[i] к двумерному массиву (матрице) неверно, надо использовать a[i,j]
В последнем вопросе я имел ввиду не двумерный массив, а простой тоесть не такого типа a:array [1..4,1..5], а такого [1..20]

Почему в ниже приведённом коде не прога не показывает кол-во нечётных чисел?

Код:

VAR
a: array[1..20] of Integer;
i,Count: Integer;

BEGIN
Randomize;
for i := 1 to 20 do
a[i] := Random(255)+1;
Count := 0;
for i := 1 to 20 do
if (a[i] mod 2) <> 0 then
begin
Inc(Count);
Write(a[i],'  ');
end;
WriteLn;
WriteLn('Найдено ',Count,' нечетных чисел.');
ReadLn;
END.


Slanj 03.06.2004 00:47

У меня вроде твоя заработала.
На, вот эта работает
program tipavot;
uses crt;
VAR
a: array[1..20] of Integer;
i,
Count: Integer;

BEGIN
clrscr;
Randomize;
for i := 1 to 20 do
a[i] := Random(255)+1;
Count := 0;
for i := 1 to 20 do
begin
if (a[i] mod 2) <> 0 then
begin
Inc(Count);
Write(a[i],' ' );
end;
end;
WriteLn;
WriteLn('Naideno ',Count,' nechetnih chisel.' );
ReadLn;
END.

Warchief 03.06.2004 01:01

Slanj

Спасибо большое, просмотрел внимательно ещё раз иходник, поудалял коментарии и всё тоже заработало :biggrin: . Я просто незаметил и поставил на коментарии обычную скобку ")", а не такую "}" .
Так бы и не нашёл причину если бы не ты. :молись:

Slanj 03.06.2004 01:06

Да ладно, ничего страшного. Просто я смотрю, вроде все нормально.

Warchief 28.06.2004 19:21

Людиии помогите пожалуйста ещё раз!!! Надо написать программу на TP которая бы генерировала в матрице(array[1..6,1..6]) восемнадцать случайных чисел и дублировала их все.Должно получиться 18 чисел в матрице каждое должно повторяться два раза, чтобы получилось в общей сложности 36, но положение этих чисел должно быть случайное(по типу игры "memory"). И в конце концов надо выдать эту матрицу в виде квадрата 6 на 6 в виде звёздочек.
Пожалуйста помогите написать прогу, а то я как ни бился могу только сгенирировать эти числа и выдать ввиде звёздочек только в строчку, а не в квадрате. :молись: :молись: :молись: :молись: :молись: :молись: .
Вопрос жизни и смерти :молись: Прога нужна на завтра :confused: :mad:

Ghost 28.06.2004 19:37

Сформировать, эт пожалуйста:
Код:

uses
  crt;

const
  n = 6;
  k = n * n div 2;

var
  a: array [1..n, 1..n] of byte;
  b: array [1..k] of byte;
  i, j, l, m, r: byte;
  p: boolean;

begin
  clrscr;
  randomize;

  for i := 1 to n do
    for j := 1 to n do
      a[i, j] := 0;

  for i := 1 to k do begin
    repeat
      p := true;
      b[i] := random (99) + 1;
      for j := 1 to pred (i) do
        p := p and (b[j] <> b[i]);
    until p;
    for l := 1 to 2 do begin
      repeat
        r := random(n) + 1;
        m := random(n) + 1;
      until a[r, m] = 0;
      a[r, m] := b[i];
    end;
  end;

  for i := 1 to n do begin
    for j := 1 to n do write (a[i, j]: 3);
    writeln;
  end;
  readkey;
end.

А вот с выводом "звездочками" объясни поподробней... :idontnow:

Warchief 28.06.2004 21:39

Ghost
Ты лучший!!!!! :claps: Ура!!

Со звёздочками я имел ввиду что эту матрицу он должен был написан не в числах а в виде звёздочек (*). А так это уже то, что мне нужно. :beer: :ржать: :claps: :молись:

Warchief 28.06.2004 23:40

Объясни пожалуйста, что делают переменные: l, m, r и p. А также какое действие выполняет фунция pred и следующий участок кода :
p := true;
b[i] := random (99) + 1;
for j := 1 to pred (i) do
p := p and (b[j] <> b[i]);
until p;
for l := 1 to 2 do begin
repeat
r := random(n) + 1;
m := random(n) + 1;
until a[r, m] = 0;
a[r, m] := b[i];

Никак не пойму, что здесь выполняется и зачем используется 2 array'я?
Спасибо!!!

Ghost 29.06.2004 10:20

Warchief
Функция pred вычисляет предыдущее число, т.е. вместо pred(i) можно ставить (i - 1).
Переменные i, j, l предназначены только для организации циклов. А r, m - содержат случайным образом выбранные два числа - номер строки и столбца в массиве.
Переменная p - логическая. Используется для проверки того, что новое сгенерированное число еще отсутствует в массиве. В принципе, это было можно решить с помощью множества (set of byte), только зачем... ;)
Участок кода
Код:

    repeat
      p := true;
      b[i] := random (99) + 1;
      for j := 1 to pred (i) do
        p := p and (b[j] <> b[i]);
    until p;

создает в массиве b новое число b[i], отличное от предыдущих. А
Код:

    for l := 1 to 2 do begin
      repeat
        r := random(n) + 1;
        m := random(n) + 1;
      until a[r, m] = 0;
      a[r, m] := b[i];
    end;

Вставляет это чило 2 раза на пустые места в массиве a.
Два массива нужно, чтобы сгенерированные random'ом числа не повторялись. Массив b содержит случайные неповторяющиеся числа, а массив a - по 2 таких же, но расположенные случайным образом.


Часовой пояс GMT +4, время: 04:13.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.