Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.02.2013, 22:56   #1
revlar
 
Регистрация: 04.06.2010
Сообщений: 5
По умолчанию Может кто объяснит

Задача для школьника

#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int n,i;
float s;
cin >> n;
for (i=1;i<=n;i++)
{
s=s+1/i;
}
cout << s;
system("PAUSE");
return EXIT_SUCCESS;
}

Если ввести 6 - результат 1. А если

#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
float s;
int n,i;

cin >> n;
for (i=1;i<=n;i++)
{
s=s+1/i;
}
cout << s;
system("PAUSE");
return EXIT_SUCCESS;
}
то ответ 1.79522. Но если добавить

#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
float s;
int n,i;
s=0;

cin >> n;
for (i=1;i<=n;i++)
{
s=s+1/i;
}
cout << s;
system("PAUSE");
return EXIT_SUCCESS;
}

то опять 1.

Все это в Dev-C++ 4.9.9.2
revlar вне форума Ответить с цитированием
Старый 04.02.2013, 23:14   #2
kventin_zhuk
БНТУ ФИТР
Форумчанин
 
Аватар для kventin_zhuk
 
Регистрация: 20.05.2012
Сообщений: 315
По умолчанию

В первых 2х случаях вы используете s без инициализации. Там по умолчанию какое-то значение.
Код:
#include <cstdlib>
#include <iostream>

using namespace std; 
int main(int argc, char *argv[])
{
	float s = 0;
	int n,i; 
	cin >> n;
	for (i=1;i<=n;i++)
	{
		s=s+1.0/i; 
	}
	cout << s;
	system("PAUSE");
	return EXIT_SUCCESS;
}
Вот так должно работать правильно.

1.7 - маловато , хотя бы потому, что: 1 + 0.5 + 0.333 ...

А на счёт последнего. Ответ 1, т.к 1/1 = 1 , но 1/2 != 0.5 а равно 0. И дальше каждое частное равно 0. Т.е предполагается, что частное 2х целях чисел тоже целое число. Но если это не так - автоматически округляется в меньшую сторону (в данном случае до 0.)
Проследить это можно добавив в цикл cout << 1/i << endl;
С++(console/builder/WinAPI/Linux), C#, Pascal, Delphi, Asm, Prolog.
< ----- Контакты
kventin_zhuk@live.com

Последний раз редактировалось kventin_zhuk; 04.02.2013 в 23:22.
kventin_zhuk вне форума Ответить с цитированием
Старый 04.02.2013, 23:33   #3
revlar
 
Регистрация: 04.06.2010
Сообщений: 5
По умолчанию

Тогда не понятно, почему, если в первых двух случаях только меняем местами декларацию переменных - результат разный.
А в третьем случае - почему "предполагается, что частное 2х целых чисел тоже целое число" что надо сделать, что бы 1/i было действительное число. Или это от кампилятора зависит?
revlar вне форума Ответить с цитированием
Старый 04.02.2013, 23:47   #4
kventin_zhuk
БНТУ ФИТР
Форумчанин
 
Аватар для kventin_zhuk
 
Регистрация: 20.05.2012
Сообщений: 315
По умолчанию

revlar, Скомпилировал - у меня один ответ получается. + по ходу выполнения вылезает предупреждение.
Цитата:
The variable 's' is being used without being initialized.
Чтобы деление целого числа на целое было вещественным - нужно сделать из одного целого вещественное. Выше я написал не 1/i , а 1.0/i . Можно ещё через приведение типов: 1/float(i)


Кста: Код оформляется кнопочкой решеточка
С++(console/builder/WinAPI/Linux), C#, Pascal, Delphi, Asm, Prolog.
< ----- Контакты
kventin_zhuk@live.com

Последний раз редактировалось kventin_zhuk; 04.02.2013 в 23:55.
kventin_zhuk вне форума Ответить с цитированием
Старый 05.02.2013, 03:38   #5
revlar
 
Регистрация: 04.06.2010
Сообщений: 5
По умолчанию

Спасибо за ответы, но я инициализирую всегда, а тут тупо убрал, потому что увидел разницу. Но когда переставил местами описывание переменных - вообще сполз. Какая разница в их порядке? Скорее всего это в кампиляторе дело. Я столько программ на с++ написал - впервые столкнулся с тем, что ответы 1/і и 1.0/і разные. Вся соль, что эта неожиданность вылезла, когда я давал урок ученикам. Видели бы Вы меня тогда - на уроке. Может посоветуйте компилятор простенький для Windows. Но что бы не такой "умный" как Dev-C++
revlar вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Где и как скачать программу Delphi. Может кто нибудь может помочь мне - без скачивания из интернета. IZOPGRAM Общие вопросы Delphi 4 16.06.2012 18:12
Где можно скачать Borland C++ или может кто-то может скинуть dani6 C++ Builder 11 19.02.2011 14:01
Кто мне объяснит,в чем отличие процессоров Intel от AMD????И по видюшкам вопросик!!! Alexij Свободное общение 1 14.11.2008 14:39
Не ясная постановка задачи. Может кто объяснит? Prowler Помощь студентам 2 25.03.2007 23:04