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

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

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

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 06.02.2015, 00:30   #1
Ashido
Пользователь
 
Аватар для Ashido
 
Регистрация: 17.01.2015
Сообщений: 16
По умолчанию

Добрый вечер! Занялась изучением алгоритмов, по книге Н.Вирта "Алгоритмы и структуры данных". Но к сожалению, все они описаны на Паскале, поэтому сейчас пробую переводить для себя на C++, чтобы и к языку лучше привыкнуть, и в алгоритмах разобраться.
В общем-то конкретных вопросов у меня нет, буду постепенно выкладывать что у меня получилось, надеюсь кому-нибудь пригодиться, а возможно кто-то подскажет идеи лучшей реализации, т.к. я пока недостаточно хорошо владею языком.

Код на Pascal из книги:
Код:
program power;
	const n=10;
var
	i,k,r:word;
	d:array [1..n] of word;
begin
	for k:=1 to n do begin
		write('.');
		r:=0;
		for i:=1 to k-1 do begin
			r:=10*r+d[i];
			d[i]:=r div 2;
			r:=r mod 2;
			write(chr(d[i]+ord('0')));
		end;
		d[k]:=5;
		write('5');
		writeln
	end
end.
Мой вариант на C++ в виде функции:
Код:
#include <iostream>
#include <cstdlib>
using namespace std;
void minDeg2(){
    const int n=10;//количество отрицательных степеней
	int r,d[n];
	for(int k=0;k<n;k++){
		cout<<('.');
		r=0;
		for(int i=0;i<k;i++){
			r=10*r+d[i];
			d[i]=r/2;
			r%=2;
			cout<<char(d[i]+int('0'));
		}
		d[k]=5;
		cout<<'5'<<endl;
	}
}
int main(){
	minDeg2();
	system("PAUSE");
	return 0;
}
Подскажите пожалуйста, если не сложно, как размещать код во вложении? Искала, но как-то все без толку

Последний раз редактировалось Stilet; 06.02.2015 в 08:01.
Ashido вне форума
Старый 06.02.2015, 02:14   #2
magnet
Пользователь
 
Регистрация: 02.02.2015
Сообщений: 24
По умолчанию

Цитата:
Сообщение от Ashido Посмотреть сообщение
возможно кто-то подскажет идеи лучшей реализации, т.к. я пока недостаточно хорошо владею языком.
Не нужно переводить цифру в ASCII для ее вывода в стрим.
В место:
Код:
cout<<char(d[i]+int('0'));
Достаточно:
Код:
cout<<d[i];
и в место
Код:
d[k]=5;
cout<<'5'<<endl;
так:
Код:
d[k]=5;
cout<<d[k]<<endl;
И табуляцию в редакторе смени на 4
magnet вне форума
Старый 06.02.2015, 16:11   #3
Ashido
Пользователь
 
Аватар для Ashido
 
Регистрация: 17.01.2015
Сообщений: 16
По умолчанию

Благодарю за внимание к теме! Ну во втором случае я разницы не вижу, что выводить, элемент массива или символ, полагаю, что вывод символа может оказаться быстрее. А с первым соглашусь, действительно быстрее, но в данном конкретном случае, я бы оставила описанный вариант, для максимального приближения к оригинальному коду. Спасибо за замечания!
Ashido вне форума
Старый 07.02.2015, 01:06   #4
Ashido
Пользователь
 
Аватар для Ashido
 
Регистрация: 17.01.2015
Сообщений: 16
По умолчанию стр.37 и 40 Вычисление расстояния в различных координатах

Код на Pascal из книги: (дополнения до программы не вношу, т.к. не это цель )
Код:
type CoordMode = (Cartesian, Polar);
type Coordinate = 
		record
			case kind: CoordMode of
			Cartesian: (x, y: real);
			Polar: (r: real; phi:real)
		end;

case a.kind of
	Cartesian case b.kind of
				Cartesian:	d:=sqrt(sqr(a.x-b.x)+sqr(a.y-b.y));
				Polar:		d:=sqrt(sqr(a.x-b.r*cos(b.phi)))+sqr(a.y-b.r*sin(b.phi))
			end;
	polar case b.kind of
				Cartesian:	d:=sqrt(sqr(a.r*cos(a.phi)-b.x)+sqr(a.r*sin(a.phi)-b.y));
				Polar:		d:=sqrt(sqr(a.r)+sqr(b.r)-2*a.r*b.r*cos(a.phi-b.phi))
			end
	end;
Мой вариант на C++:
Код:
#include <iostream>
#include <cstdlib>
#include <cmath>
using namespace std;
enum typeCoord{ cartesian = 0, polar = 1 };//перечисление, тип координат, прямоугольные или полярные
class Coordinate{
public://отсутствуют функции для дальнейшей работы с данными-членами
	Coordinate(typeCoord k, double x1, double y1){
		kind = k;
		x = x1;
		y = y1;
	}
	double dist(Coordinate b){//функция вычисляющая расстояние
		double d;
		switch (this->kind){
		case cartesian:
			switch (b.kind){
			case cartesian:
				d = sqrt(sqr(this->x - b.x) + sqr(this->y - b.y));
				break;
			case polar:
				d = sqrt(sqr(this->x - b.r*cos(b.phi)) + sqr(this->y - b.r*sin(b.phi)));
				break;
			}
			break;
		case polar:
			switch (b.kind){
			case cartesian:
				d = sqrt(sqr(this->r*cos(this->phi) - b.x) + sqr(this->r*sin(this->phi) - b.y));
				break;
			case polar:
				d = sqrt(sqr(this->r) + sqr(b.r) - 2 * this->r*b.r*cos(this->phi - b.phi));
				break;
			}
			break;
		}
		return d;
	}
private:
	typeCoord kind;
	union{
		double x, r;
	};
	union{
		double y, phi;
	};
	double sqr(double q){//добавлена вместо pow для лучшей читабельности кода
		return q*q;
	}
};

int main(){
	bool f;
	typeCoord t = cartesian;
	double x, y;
	cout << "Tochka A.\n" << "Vvedite tip koordinat (cartesian=0,polar=1): ";
	cin >> f;
	cout << "Vvedite koordinati tochki: ";
	cin >> x >> y;
	if (f) t = polar;
	Coordinate a(t, x, y);//создание точки А
	t = cartesian;
	cout << "Tochka B.\n" << "Vvedite tip koordinat (cartesian=0,polar=1): ";
	cin >> f;
	cout << "Vvedite koordinati tochki: ";
	cin >> x >> y;
	if (f) t = polar;
	Coordinate b(t, x, y);//создание точки В
	cout << "Rasstojanie ot A do B = " << a.dist(b)<<endl;
	system("PAUSE");
	return 0;
}
Ashido вне форума
Старый 08.02.2015, 11:43   #5
magnet
Пользователь
 
Регистрация: 02.02.2015
Сообщений: 24
По умолчанию

Цитата:
Сообщение от Ashido Посмотреть сообщение
но в данном конкретном случае, я бы оставила описанный вариант, для максимального приближения к оригинальному коду.
Зачем? Может я не понимаю смысл перевода... Чего ты хочешь этим добится?
У тебя получается так, если бы перевели текст с помощью Google translate или другого автоматического переводчика.
magnet вне форума
Старый 08.02.2015, 12:34   #6
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
По умолчанию

Цитата:
Сообщение от Ashido Посмотреть сообщение
действительно быстрее, но в данном конкретном случае, я бы оставила описанный вариант, для максимального приближения к оригинальному коду.
Максимальное приближение к оригиналу ещё может быть оправдано, когда Вы, например, переводите текст с английского на русский. Здесь это совершенно ни к чему. Тем более, в ущерб эффективности алгоритма.
Цитата:
Сообщение от magnet Посмотреть сообщение
У тебя получается так, если бы перевели текст с помощью Google translate или другого автоматического переводчика.
magnet, +1
Streletz вне форума
Старый 08.02.2015, 12:41   #7
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от magnet Посмотреть сообщение
Зачем? Может я не понимаю смысл перевода... Чего ты хочешь этим добится?
Не флуди. Видишь, человек хочет разобраться в отличиях одного языка от другого. Не нужно здесь выставлять своё ЧСВ.
Цитата:
Сообщение от Streletz Посмотреть сообщение
Максимальное приближение к оригиналу ещё может быть оправдано, когда Вы, например, переводите текст с английского на русский. Здесь это совершенно ни к чему. Тем более, в ущерб эффективности алгоритма.
magnet, +1
Согласен. Подобие, нужно толко в случае проверки алгоритма на работоспособность. Но, в каждом языке есть "правила оптимизации кода". Можно натыкать готов по всему коду как в Бейсике, а можно использоват конструкции языка типа while или do{}wfile. И в том и в другом случее алгоритм будет работать, вот с читабельностью, будут проблемы.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 08.02.2015 в 12:49.
Smitt&Wesson вне форума
Старый 08.02.2015, 13:17   #8
magnet
Пользователь
 
Регистрация: 02.02.2015
Сообщений: 24
По умолчанию

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
Не флуди. Видишь, человек хочет разобраться в отличиях одного языка от другого. Не нужно здесь выставлять своё ЧСВ.
Я и не собирался флудить. Хотел помочь, а он все "ближе к оригиналу" оставить хочет. Вот и спросил его , в чем смысл перевода (явно, не что бы в отличиях разобраться).
magnet вне форума
Старый 08.02.2015, 13:27   #9
Ashido
Пользователь
 
Аватар для Ashido
 
Регистрация: 17.01.2015
Сообщений: 16
По умолчанию

Цитата:
Сообщение от magnet Посмотреть сообщение
Зачем? Может я не понимаю смысл перевода... Чего ты хочешь этим добится?
У тебя получается так, если бы перевели текст с помощью Google translate или другого автоматического переводчика.
Прежде чем называть меня GT, обратите внимание на код на Pascal, там ведь тоже можно без этого обойтись, и программа конечно ускориться, но видимо этот пример был направлен не на это. Именно поэтому, я отметила уместность Ваших замечаний, но при этом сказала, что "в данном конкретном случае" ничего менять смысла не вижу.
Streletz, очевидно, что этот код был представлен автором не для того чтобы показать оптимизацию по скорости, так что полагаю это тот редкий случай, когда приближение к оригиналу может быть оправдано.
Smitt&Wesson, благодарю за защиту от камней в мой адрес)))
Вообще здорово конечно, что такое бурное обсуждение первого кода пошло, но мне бы было намного интереснее услышать ваши замечания относительно второго, где действительно приходилось думать при написании, т.к. я плохо провожу параллели между стандартными типами Pascal и C++.
Ashido вне форума
Старый 08.02.2015, 15:00   #10
magnet
Пользователь
 
Регистрация: 02.02.2015
Сообщений: 24
По умолчанию

Дело совсем не в ускорении, а понимании того что существует перегрузка оператора << для разных типов, поэтому не надо переводить все в ASCII

Цитата:
Прежде чем называть меня GT
Я не называл. Даже не знаю что это значит
magnet вне форума
Закрытая тема


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Анализ алгоритмов обработки последовательности(Turbo Pascal) Dina 85 Помощь студентам 2 15.09.2013 12:18
Pascal.Программирование циклических алгоритмов (с параметром) shlapnya Помощь студентам 0 13.01.2013 17:13
Программирование алгоритмов циклической структуры(Pascal) lerenia Помощь студентам 5 17.10.2012 15:41
Программирование алгоритмов типовых задач в Turbo Pascal. Koten Паскаль, Turbo Pascal, PascalABC.NET 16 15.01.2011 15:49
Реализация базовых алгоритмов на графах pascal varlonec Помощь студентам 0 18.10.2010 20:58