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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.08.2009, 10:55   #1
laxe
Пользователь
 
Регистрация: 28.08.2009
Сообщений: 19
По умолчанию как упростить код, используя только массивы, циклы, разветвления и указатели?

Можно ли как то упростить этот код, используя только массивы, циклы, разветвления и указатели?

Код:
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "iostream"
#include "time.h"
#define RES1(x) (x*2.54)
#define RES2(x) (x/2.54)
#define RES3(x) (x*1000)
#define RES4(x) (x/1000)
#define RES5(x) (x*10)
#define RES6(x) (x/10)
using namespace std;

void main ()
{
	int v; float sm, km, dm, d;
	cout<<"Viberite deystvie:\n1 - perevod iz duym v sm \n2 - perevod iz sm v duym \n3 - perevod iz km v sm \n4 - perevod iz sm v km \n5 - perevod iz dm v sm \n6 - perevod iz sm v dm \n7 - vihod iz programmu\n";
	cin>>v;
	while (v!=7)
	{
		if (v==1)
		{
			cout<<"Vvedite duym: "; cin>>d;
			cout<<"V "<<d<<" duym - "<<RES1(d)<<" sm\n\n\n";
		}
		else if (v==2)
		{
			cout<<"Vvedite sm: "; cin>>sm;
			cout<<"V "<<sm<<" sm - "<<RES2(sm)<<" d\n\n\n";
		}
		else if (v==3)
		{
			cout<<"Vvedite km: "; cin>>km;
			cout<<"V "<<km<<" km - "<<RES3(km)<<" sm\n\n\n";
		}
		else if (v==4)
		{
			cout<<"Vvedite sm: "; cin>>sm;
			cout<<"V "<<sm<<" sm - "<<RES4(sm)<<" km\n\n\n";
		}
		else if (v==5)
		{
			cout<<"Vvedite dm: "; cin>> dm;
			cout<<"V "<<dm<<" dm - "<<RES5(dm)<<" sm\n\n\n";
		}
		else if (v==6)
		{
			cout<<"Vvedite sm: "; cin>>sm;
			cout<<"V "<<sm<<" sm - "<<RES6(sm)<<" dm\n\n\n";
		}
		cout<<"Viberite deystvie:\n1 - perevod iz duym v sm \n2 - perevod iz sm v duym \n3 - perevod iz km v sm \n4 - perevod iz sm v km \n5 - perevod iz dm v sm \n6 - perevod iz sm v dm \n7 - vihod iz programmu\n";
		cin>>v;	
	}
	cout<<"Vihod\n";

	
}

Последний раз редактировалось Sazary; 29.08.2009 в 15:05.
laxe вне форума Ответить с цитированием
Старый 29.08.2009, 15:10   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

1. Можно заменить конструкции if-else на один switch. Обычно в таких случаях он и используется.

2. Вместо дефайнов можете сделать 6 функций, завести массив указателей на них и вызывать уже оттуда, имея индекс нужной (v).

3. Вопрос: зачем вам несколько разных переменных, в которые вы вводите значения (cin>> dm, cin>>sm... и прочие), если можно обойтись одной?

4. У вас макросы RES* однотипные - умножение x на константу. Поэтому можете просто сделать массив этих чисел.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]

Последний раз редактировалось Sazary; 29.08.2009 в 15:16.
Sazary вне форума Ответить с цитированием
Старый 29.08.2009, 15:51   #3
laxe
Пользователь
 
Регистрация: 28.08.2009
Сообщений: 19
По умолчанию

Цитата:
Сообщение от Sazary Посмотреть сообщение
1. Можно заменить конструкции if-else на один switch. Обычно в таких случаях он и используется.

2. Вместо дефайнов можете сделать 6 функций, завести массив указателей на них и вызывать уже оттуда, имея индекс нужной (v).

3. Вопрос: зачем вам несколько разных переменных, в которые вы вводите значения (cin>> dm, cin>>sm... и прочие), если можно обойтись одной?

4. У вас макросы RES* однотипные - умножение x на константу. Поэтому можете просто сделать массив этих чисел.
а можно по подробней про 4 пункт, я в макросах пока неочень, просто нашел статейку и решил попробовать, вроде получилось, сделать из этого массив не получается(
laxe вне форума Ответить с цитированием
Старый 29.08.2009, 16:11   #4
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от laxe
а можно по подробней про 4 пункт, я в макросах пока неочень
Как раз я вам предлагаю отказаться от макросов.
Код:
#include <iostream>
using namespace std;

const double RES[]={2.54,1/2.54,1000,1/1000,10,1/10};
const char *str1[] = {"duym","sm","km","sm","dm","sm"};
const char *str2[] = {"sm","d","sm","km","sm","dm"};

int main()
{
int v;
float a;
cout<<"Viberite deystvie:\n1 - perevod iz duym v sm \n2 - perevod iz sm v duym \
\n3 - perevod iz km v sm \n4 - perevod iz sm v km \n \
5 - perevod iz dm v sm \n6 - perevod iz sm v dm \n7 - vihod iz programmu\n";
cin>>v;
while(v!=7)
 {
  if(v>=1&&v<=6)
   {
     cout<<"Vvedite "<<str1[v-1]<<": "; cin>>a;
     cout<<"\nV "<<a<<" "<<str1[v-1]<<" - "<<(a*RES[v-1])<<" "<<str2[v-1]<<"\n\n";
    }
 cout<<"Viberite deystvie:\n1 - perevod iz duym v sm \n2 - perevod iz sm v duym \
 \n3 - perevod iz km v sm \n4 - perevod iz sm v km \n5 - perevod iz dm v sm \
 \n6 - perevod iz sm v dm \n7 - vihod iz programmu\n";
cin>>v;          
  }
cout<<"Vihod\n";
    
 cin.get();   
 return 0;   
}
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 29.08.2009, 16:19   #5
laxe
Пользователь
 
Регистрация: 28.08.2009
Сообщений: 19
По умолчанию

неплохо. спасибо огромное))
laxe вне форума Ответить с цитированием
Старый 29.08.2009, 16:22   #6
jojahti
Подтвердите свой е-майл
 
Регистрация: 27.07.2009
Сообщений: 437
По умолчанию

laxeТак чуток покороче, тока запрос действия сам в касе уберёшь, что-бы он велечину при выходе не просил.
Код:
#include <iostream>
using namespace std;
string mas[7] = {"\n1 - perevod iz duym v sm\n", "2 - perevod iz sm v duym]\n", "3 - perevod iz km  v  sm\n",
                       "4 - perevod iz sm v km\n",       "5 - perevod iz dm v sm\n",      "6 - perevod iz sm  v  dm\n",
                                                                                                               "7 - vihod iz programmu\n"};
void convert(float a, int n)
{ switch(n)
  { case 1 : cout << mas[n] << a << " duym = " << a*2.54 << " sm"  ; break;
    case 2 : cout << mas[n] << a << " sm = "   << a/2.54 << " duym"; break;       
    case 3 : cout << mas[n] << a << " km = "   << a*1000 << " sm";   break;
    case 4 : cout << mas[n] << a << " sm = "   << a/1000 << " km";   break;
    case 5 : cout << mas[n] << a << " dm = "   << a*10   << " sm";   break;
    case 6 : cout << mas[n] << a << " sm = "   << a/10   << " dm";   break;
    case 7 : cout << mas[n];                                         break; }
}
int main() {
    float x;
      int n;
    cout<<"Viberite deystvie: ";
for(int i=0;i<7;++i) cout << mas[i];
    cin >> n;
    cout<<"\nVvedite velechinu:";
    cin >> x;
    convert(x, n);  
cin >> x;
}
P.S. Ёлки иголки! А почему я немогу в коде отступы сделать, что бы строки на один уровень поставить?

Последний раз редактировалось jojahti; 29.08.2009 в 16:28.
jojahti вне форума Ответить с цитированием
Старый 29.08.2009, 16:46   #7
laxe
Пользователь
 
Регистрация: 28.08.2009
Сообщений: 19
По умолчанию

Цитата:
Сообщение от jojahti Посмотреть сообщение
laxeТак чуток покороче, тока запрос действия сам в касе уберёшь, что-бы он велечину при выходе не просил.
Код:
#include <iostream>
using namespace std;
string mas[7] = {"\n1 - perevod iz duym v sm\n", "2 - perevod iz sm v duym]\n", "3 - perevod iz km  v  sm\n",
                       "4 - perevod iz sm v km\n",       "5 - perevod iz dm v sm\n",      "6 - perevod iz sm  v  dm\n",
                                                                                                               "7 - vihod iz programmu\n"};
void convert(float a, int n)
{ switch(n)
  { case 1 : cout << mas[n] << a << " duym = " << a*2.54 << " sm"  ; break;
    case 2 : cout << mas[n] << a << " sm = "   << a/2.54 << " duym"; break;       
    case 3 : cout << mas[n] << a << " km = "   << a*1000 << " sm";   break;
    case 4 : cout << mas[n] << a << " sm = "   << a/1000 << " km";   break;
    case 5 : cout << mas[n] << a << " dm = "   << a*10   << " sm";   break;
    case 6 : cout << mas[n] << a << " sm = "   << a/10   << " dm";   break;
    case 7 : cout << mas[n];                                         break; }
}
int main() {
    float x;
      int n;
    cout<<"Viberite deystvie: ";
for(int i=0;i<7;++i) cout << mas[i];
    cin >> n;
    cout<<"\nVvedite velechinu:";
    cin >> x;
    convert(x, n);  
cin >> x;
}
P.S. Ёлки иголки! А почему я немогу в коде отступы сделать, что бы строки на один уровень поставить?
чтот в этот код совсем не работает, много ошибок, в которых неомгу разобратся... совсем запутался...
laxe вне форума Ответить с цитированием
Старый 29.08.2009, 16:57   #8
jojahti
Подтвердите свой е-майл
 
Регистрация: 27.07.2009
Сообщений: 437
По умолчанию

Какие ещё ошибки???
jojahti вне форума Ответить с цитированием
Старый 29.08.2009, 17:02   #9
laxe
Пользователь
 
Регистрация: 28.08.2009
Сообщений: 19
По умолчанию

Цитата:
Сообщение от jojahti Посмотреть сообщение
Какие ещё ошибки???
тебе весь лог ошибок дать?
laxe вне форума Ответить с цитированием
Старый 29.08.2009, 17:05   #10
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Код рабочий. Так что можете привести лог.
Уверены, что полностью скопировали?
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[C] массивы, указатели, двойные указатели. Iggel Общие вопросы C/C++ 5 05.05.2009 12:39
Помогите упростить код Ralf_ru Помощь студентам 7 01.04.2009 17:17
нужно решить задачу используя указатели С++ Nastusha Помощь студентам 4 08.02.2009 22:45
Си используя циклы dimorik Общие вопросы C/C++ 0 11.11.2008 18:31