Автор Тема: Turbo Pascal. Помогите найти ошибку, пожалуйста.  (Прочитано 7239 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Lvenke

  • Новичок
  • *
  • Сообщений: 6
    • Просмотр профиля
Задание. Найти сумму всех n- значных чисел (1 <= n <= 4).

Проблема. При вводе значения 3 он выдает число "-29738". Ну по логике: я же положительные числа складываю, откуда отрицательное в сумме? оО.

Мой текст программы.

Program Cikly_2;
Var
i, s : integer;
n : byte;
Begin
s:= 0;
WriteLn('Vvedite kolichestvo razryadov (ot 1 do 4)');
ReadLn(n);
      case n of
      1: begin
              i := 1;
              while i <= 9 do
              begin
              s := s + i;
              i := i + 1;
              end;
              WriteLn('Summa = ',s);
         end;
      2: begin
              i := 10;
              while i <= 99 do
              begin
              s := s + i;
              i := i + 1;
              end;
              WriteLn('Summa = ',s);
         end;
      3: begin
              i := 100;
              while i <= 999 do
              begin
              s := s + i;
              i := i + 1;
              end;
              WriteLn('Summa = ',s);
         end;
      4: begin
              i := 1000;
              while i <= 9999 do
              begin
              s := s + i;
              i := i + 1;
              end;
              WriteLn('Summa = ',s);
         end;
      else WriteLn('Nevernye dannye!');
      end;
ReadLn;
End.
Вот спишь, спишь, спишь, потом просыпаешься... а одеяло всё ещё спит. (с)

Оффлайн sir. Andrey

  • Ветеран
  • *****
  • Сообщений: 1943
    • Просмотр профиля
Re: Turbo Pascal. Помогите найти ошибку, пожалуйста.
« Ответ #1 : 23 Октября 2010, 19:45:01 »
Я кстати тоже не понимаю в чем дело!!!

Проверил этот код, такая же тема!

З.Ы. Вот этот код оптимальнее!

Program Cikly_2;
Var
i, s, n : integer;

Begin
s:= 0;
WriteLn('Vvedite kolichestvo razryadov (ot 1 do 4)');
ReadLn(n);
      case n of
      1: begin
           for i:=1 to 9 do s:=s+i;
           WriteLn('Summa = ',s);
         end;
      2: begin
           for i:=10 to 99 do s:=s+i;
           WriteLn('Summa = ',s);
         end;
      3: begin
           for i:=100 to 999 do s:=s+i;
           WriteLn('Summa = ',s);
           end;
      4: begin
           for i:=1000 to 9999 do s:=s+i;
           WriteLn('Summa = ',s);
         end;
      else WriteLn('Nevernye dannye!');
      end;
ReadLn;
End.

Оффлайн Lvenke

  • Новичок
  • *
  • Сообщений: 6
    • Просмотр профиля
Re: Turbo Pascal. Помогите найти ошибку, пожалуйста.
« Ответ #2 : 23 Октября 2010, 20:00:39 »
Спасибо большое, но Ваш код выдаёт мне при вводе тройки тот же результат с минусом.

У меня задание написать три программы с помощью циклов: со счётчиком, с постусловием и с предусловием. Кстати, цикл со счётчиком я тоже сделала, и там тоже при вводе тройки отрицательный результат (только что заметила) =(.

Кстати, операторные скобки внутри оператора case ... of необязательны, я без них делала =)
Вот спишь, спишь, спишь, потом просыпаешься... а одеяло всё ещё спит. (с)

Оффлайн sir. Andrey

  • Ветеран
  • *****
  • Сообщений: 1943
    • Просмотр профиля
Re: Turbo Pascal. Помогите найти ошибку, пожалуйста.
« Ответ #3 : 23 Октября 2010, 20:09:02 »
В минус уходит при i=256 summa=-32685
Как будто резко умножили на -1!  :)
Ну а так, понятия не имею в чем проблема,
с типами данных вроде все в порядке!

Оффлайн sir. Andrey

  • Ветеран
  • *****
  • Сообщений: 1943
    • Просмотр профиля
Re: Turbo Pascal. Помогите найти ошибку, пожалуйста.
« Ответ #4 : 23 Октября 2010, 20:11:30 »
Вот как раз с типом данных косяк!!!  :)
S:longint;
вместо s:integer;

Оффлайн Lvenke

  • Новичок
  • *
  • Сообщений: 6
    • Просмотр профиля
Re: Turbo Pascal. Помогите найти ошибку, пожалуйста.
« Ответ #5 : 23 Октября 2010, 22:27:34 »
Вот как раз с типом данных косяк!!!  :)
S:longint;
вместо s:integer;

Точно!!  :D Спасибо )))))))))).
Вот спишь, спишь, спишь, потом просыпаешься... а одеяло всё ещё спит. (с)

Оффлайн sir. Andrey

  • Ветеран
  • *****
  • Сообщений: 1943
    • Просмотр профиля
Re: Turbo Pascal. Помогите найти ошибку, пожалуйста.
« Ответ #6 : 24 Октября 2010, 10:21:50 »
Да ладно!!!  :)
Не за что!   ;)

Оффлайн Lvenke

  • Новичок
  • *
  • Сообщений: 6
    • Просмотр профиля
Re: Turbo Pascal. Помогите найти ошибку, пожалуйста.
« Ответ #7 : 04 Декабря 2010, 17:50:15 »
Задание. Даны действительные числа a1, a2, …an. Среди них есть положительные и отрицательные. Заменить нулями те числа, величина которых по модулю больше максимального числа (|ai|> max{ a1, a2, …an}).

Проблема. Программа работает, только если тип массива целочисленный. А с действительными не получается... Что вообще нужно, чтобы в массиве были и отрицательные значения типа real? У меня подозрение на random, но что там менять?..

uses crt;
var  a: array [1..100] of real;
     i, n, max_i: integer;

begin
 clrscr;
 randomize;
 writeln('Vvedite kolichistvo elementov massiva');
 readln(n);

 {Vyvod odnomernogo massiva}

 for i:= 1 to n do
     begin
       a[i]:= random(40)-25;
       writeln('a[', i, '] = ', a[i]:6);
     end;
 readln;
 writeln;

 {Poisk i vyvod maximalnogo elementa}

 max_i:= 1;
 for i:= 2 to n do
   if a[i] > a[max_i] then max_i:= i;
 writeln('max_i = ', a[max_i]:6);

 {Zamena elementov}

 for i:= 1 to n do
 if abs(a[i]) > a[max_i] then a[i]:= 0;
 readln;

 {Vyvod poluchennogo massiva}

 for i:= 1 to n do
 begin
 if a[i] = 0 then writeln('a[', i, '] = 0') else
 writeln('a[', i, '] = ', a[i]:6);
 end;
 readln;
end.
Вот спишь, спишь, спишь, потом просыпаешься... а одеяло всё ещё спит. (с)