0 / 0 / 0
Регистрация: 15.11.2020
Сообщений: 22
1

Выдаёт отрицательное произведение, исправить ошибку нужно

14.01.2021, 21:28. Показов 220. Ответов 1
Метки нет (Все метки)

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
program cycle_1;
var
  i, dobutok, suma ,a, b:   integer ;
  
begin
  dobutok := 1;
  suma := 0;
  writeln('  введите промежуток : ');
  readln(a, b );
  for i := a to b do
  begin
    dobutok := dobutok * i; 
    suma := suma + i;
  end;
  write('dobutok = ', dobutok, ' , suma = ', suma);
end.
dobutok - произведение
и вот что выдает после компиляции :
введите промежуток :
1
20
dobutok = -2102132736 , suma = 210
как такое может быть?помогите исправить
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.01.2021, 21:28
Ответы с готовыми решениями:

Нужно исправить код, выдаёт ошибку и не запускает форму, нужно привязать базу данных Access
Мне нужно вставить ссылку на базу данных Access, но я не пойму, он ее не видит что ли, либо я не...

Если вводит в объект Edit отрицательное число, то выдает ошибку "-" is not a valid integer value". Как исправить?
var Form1: TForm1; a,r:integer; l,s,v,p:real; implementation {$R *.dfm} procedure...

Подскажите как исправить ошибку. прога ломается на 79 строке. а ошибку не выдает
#include <iostream> #include <cstdlib> #include <ctime> using namespace std; int chisla(int...

В коде выдает ошибку на 15 строчке. Мне надо исправить эту ошибку
procedure TForm1.BOkClick(Sender: TObject); var e1, e2: double; begin Label1.Caption := '';...

1
Модератор
8631 / 4302 / 2962
Регистрация: 17.08.2012
Сообщений: 13,687
15.01.2021, 00:54 2
Переменная типа integer не может иметь значение, большее 231 - 1 = 2147483647, а
1*2*3*4*5*6*7*8*9*10*11*12*13*14*15*16*17*18*19*20=243290200 8176640000.
Такое большое число не помещается в integer, происходит целочисленное переполнение, и произведение получается ошибочное. Для того, чтобы такого не было, нужно использовать для переменной dobutok такой тип данных, в который помещаются любые возможные числа.

В Pascal ABC решение будет половинчатое: из всех возможных типов кое-как подходит только real. Произведение будет вычислено, но значащих цифр в нём будет не более 16. К тому же, произведение может напечататься в научной нотации:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var
  i, suma,a, b: integer;
  dobutok: real;
begin
  dobutok := 1;
  suma := 0;
  writeln('  введите промежуток : ');
  readln(a, b );
  for i := a to b do
    begin
     dobutok := dobutok * i;
     suma := suma + i;
    end;
  write('dobutok = ', dobutok:0:0, ' , suma = ', suma);
end.
Если Вы используете не Pascal ABC, a Pascal ABC.NET (это совершенно разные паскали!), то значение dobutok может быть вычислено точно:
Pascal
1
2
3
4
5
6
begin
  var (a, b) := ReadInteger2('  введите промежуток : ');
  var dobutok: BigInteger := 1;
  for var i := a to b do dobutok *= i;
  PrintLn('dobutok = ', dobutok, ' , suma = ', Range(a, b).Sum)
end.
Если Вы не знаете Pascal ABC.NET, можете написать программу в "классическом" стиле:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var
  i, suma,a, b: integer;
  dobutok: BigInteger;
begin
  dobutok := 1;
  suma := 0;
  writeln('  введите промежуток : ');
  readln(a, b );
  for i := a to b do
    begin
     dobutok := dobutok * i;
     suma := suma + i;
    end;
  write('dobutok = ', dobutok, ' , suma = ', suma);
end.
Такая программа тоже сможет выполниться в Pascal ABC.NET.

Есть ещё один способ вычислить произведение точно: можно применить длинную арифметику. Однако, применение длинной арифметики обычно выходит за рамки учебного процесса.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.01.2021, 00:54

Структура: Не могу понять, почему выдает ошибку и как собственно эту ошибку можно исправить?
Привет,не могу понять почему ошибку выдает и как сбстно эту ошибку можно исправить? #include...

Вычислить сумму элементов строк, содержащих хотя бы одно отрицательное число - исправить ошибку
Задание Дана вещественная прямоугольная матрица размером Вычислить сумму элементов строк,...

Выдает ошибку, как исправить?
Версия Joomla 1.5.22 virtuemart 2.0.3 Выдает ошибку Fatal error: Cannot access empty property...

Выдаёт ошибку, поможете исправить пж)
#include<iostream> const int N = 10; using namespace std; int main() { int A; A = (3, 22,...

Выдаёт ошибку, помагите исправить пж)
#include <iostream> #include <cstdlib> #include <ctime> using namespace std; int main() {...

Выдает ошибку, как исправить её?
//Подсчитать количество строк заданной целочисленной матрицы NxN, являющихся перестановкой чисел...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.