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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.08.2010, 00:04   #1
shahist
Новичок
Джуниор
 
Регистрация: 10.08.2010
Сообщений: 2
По умолчанию Читаю книгу (С++ без страха) и не понимаю разницу в коде

Первый код

Код:
double sqrt_n = sqrt(static_cast<double>(n));

    for (i = 2; i <= sqrt_n; i++) {
        if (n % i == 0) {
            is_prime = false;
}
}
-------------------------------------------------------------------------
Вот второй код

Код:
for (i = 2; i <= sqrt((double) n); i++) {
        if (n % i == 0)
            is_prime = false;
    }
Там пишет что первым способом вычисляет квадратный корень только один раз, а вторым много раз изходя с умовы. Разници существенной особо не вижу (может потому что я новичок). Просьба кто может помочь.

Последний раз редактировалось Stilet; 13.08.2010 в 08:12.
shahist вне форума Ответить с цитированием
Старый 11.08.2010, 00:47   #2
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

в первом случае sqrt выполняется 1 раз
double sqrt_n = sqrt(static_cast<double>(n));

во втором - на каждой итерации цикла
for (i = 2; i <= sqrt((double) n); i++) {
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 11.08.2010, 00:51   #3
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

В цикле for перед каждой итерацией происходит проверка условия (того, что между двумя точками с запятой). Соответственно, каждый раз производится вычисление выражения, представляющего это условие - если результат равен true, то выполняется очередная итерация цикла. В первом случае каждый раз происходит только сравнение значения переменной i и значения переменной sqrt_n. Во втором случае перед каждой итерацией сначала происходит вызов функции sqrt с аргументом (double)n т.е. приведенное к типу double значение n; и только после этого происходит сравнение значения, возвращенного этой функцией со значением переменной i. В первом же случае функция была вызвана только один раз перед началом цикла и использовалось уже значение переменной. В результате нет ненужных в данном случае затрат на вызов и выполнение функции, т.к. результат ее работы не меняется.

P.S. Опередили)
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 11.08.2010, 23:21   #4
shahist
Новичок
Джуниор
 
Регистрация: 10.08.2010
Сообщений: 2
По умолчанию

Спасибо. Тему можна закрыть я уже понял.
shahist вне форума Ответить с цитированием
Старый 11.08.2010, 23:31   #5
Alexcomeback
Пользователь
 
Регистрация: 03.04.2009
Сообщений: 59
По умолчанию

честно говоря, путаницу в примерах ввело не совсем правильное именование функций и переменных..
Alexcomeback вне форума Ответить с цитированием
Старый 12.08.2010, 11:39   #6
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

думаю компилятор оптимизирует ассемблерский код так, что оба эти варианта будут одинаковы
NiCola999 вне форума Ответить с цитированием
Старый 12.08.2010, 19:00   #7
Sadist989
Пользователь
 
Аватар для Sadist989
 
Регистрация: 12.08.2010
Сообщений: 14
По умолчанию

Добрый день! Я тоже читаю эту книгу. Хочу научится программировать на С++. У меня тоже возник вопрос по этой книге, остановился я на рекурсивные функции и теперь не знаю что с этим кодом сделать:

Код:
#include "stdafx.h"
#include "iostream"
using namespace std;

int gcf(int a, int b);

int main() {
	int a = 0, b = 0;
	while (1) {
		cout << "Enter a number (0 = quit) and press ENTER: ";
		cin >> a;
		if (a == 0)
			break;
		cout << "Enter 2nd number and press ENTER: ";
		cin >> b;
		cout << "GCF = " << gcf(a, b) << endl;
	}
	return 0;
}

int gcf(int a, int b) {
	if (a % b == 0) 
	    return b;
           else
	    return gcf(b, a % b);

}
В упражнение пишет: Модифицируйте программу, чтобы она отображала все шаги входящие в алгоритм. Вот примерный вывод программы:

GCF(300, 500) =>
GCF(500, 300) =>
GCF(300, 200) =>
GCF(200, 100) =>
GCF = 100

Извините, если не туда написал, я здесь новичок! Помогите решить данный вопрос а то я уже 3 день мучаясь и не как, а пропустить эту тему не хочу потому что считаю что это будет в дальнейшей работе нужно!

Последний раз редактировалось Sadist989; 13.08.2010 в 00:28.
Sadist989 вне форума Ответить с цитированием
Старый 12.08.2010, 19:18   #8
wyvern
Форумчанин
 
Аватар для wyvern
 
Регистрация: 24.03.2009
Сообщений: 215
По умолчанию

Sadist989, сформулируйте, пожалуйста, вопрос поконкретнее.
Что Вам нужно? Чтобы код объяснили? Или чтобы сказали, что получится? Или еще что-то?
Конкретика рулез...
wyvern@localhost:~$ sudo emerge --unmerge world
wyvern вне форума Ответить с цитированием
Старый 13.08.2010, 00:15   #9
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,365
По умолчанию

Код:
#include "stdafx.h"
#include "iostream"
using namespace std;

int gcf(int a, int b);

int main() {
	int a = 0, b = 0;
	while (1) {
		cout << "Enter a number (0 = quit) and press ENTER: ";
		cin >> a;
		if (a == 0)
			break;
		cout << "Enter 2nd number and press ENTER: ";
		cin >> b;
		cout << "GCF = " << gcf(a, b) << endl;
	}
	return 0;
}

int gcf(int a, int b) {
          cout << "GCF (" << a<<","<< b<<") => " << endl;
	if (a % b == 0) 
	    return b;
           else
	    return gcf(b, a % b);

}
Интересно, а как вы, собственно, мучались? Тут всего три места, куда можно впихнуть вывод каждого шага, и только одно место правильное. Методом простого подбора можно вычислить это за три минуты.
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать

Последний раз редактировалось ACE Valery; 13.08.2010 в 00:18.
ACE Valery вне форума Ответить с цитированием
Старый 13.08.2010, 00:40   #10
Sadist989
Пользователь
 
Аватар для Sadist989
 
Регистрация: 12.08.2010
Сообщений: 14
Хорошо

Цитата:
Сообщение от wyvern Посмотреть сообщение
Sadist989, сформулируйте, пожалуйста, вопрос поконкретнее.
Что Вам нужно? Чтобы код объяснили? Или чтобы сказали, что получится? Или еще что-то?
Конкретика рулез...
Извините, что так плохо сформулировал вопрос, но девушка ниже уже написала мне ответ и он работает, спасибо вам, а то я один не разобрался бы с этим Очень благодарен А если у меня возникнут еще какие то сложности по этой книге я могу обратиться в этой теме?
Sadist989 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объясните разницу Serjuk Помощь студентам 1 24.01.2010 14:33
Читаю с файла, не знаю как вовремя остановится primeplus Общие вопросы C/C++ 2 30.08.2009 23:04
Вычислить разницу между датами без учета года k1r1ch Общие вопросы Delphi 10 20.08.2009 18:36
Можно ли создать гостевую книгу, без PHP? Лукманов Александр HTML и CSS 13 05.01.2009 15:39
как сохранить всю книгу, только значений без формул? katlis Microsoft Office Excel 5 17.12.2008 11:59