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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.12.2011, 02:10   #1
vrtp
Пользователь
 
Регистрация: 11.10.2011
Сообщений: 33
По умолчанию перевод из 5 в 10 системы счисления и обратно

Код:
#include <stdio.h>
#include<stdlib.h>
#include<math.h>
#define BASE 5
long int BASEto10(long int a);
long int Obratno(long int a);
int invertiruet(int arevers);
int main(void)
{
long int x, y, z, arevers;
printf("a=");
scanf("%ld", &x);
y = BASEto10(x);
printf("a=%ld\n", y);
z=invertiruet(arevers);
printf("Decimal notation: a=%ld\n", z);
return 0;
}
long int BASEto10(long int a){
int k=1;
long int a10=0;
while (a) {
a10 += k*(a%10);
k *= BASE;
a /= 10;
}
return a10;
}
long int Obratno(long int a){
int k=1;
long int arevers=0;
while (a) {
div_t n;
n = div(a, BASE);
a=n.quot;
arevers+=pow(10,k)*n.rem;
++k;
}
}
int invertiruet(int arevers){
	int q;
     do
     {
          printf("%d", arevers % 10);
     }while (arevers /= 10);
     q=puts("");
     
     return q;
}
Имеется вот такой индусский код. Перевод из 5 в 10 работает отлично, дальше мозг меня покинул и началось ужасное. Из 10 в 5,функция Obratno: здесь я через библиотечную функцию div нахожу частное и остаток от деления числа а на константу, записываю в прямом порядке, далее возращаю получившееся значение в функцию invertiruet, что очевидно записывает в обратном порядке и вроде должно все получиться,но вторая функция не работает, что я не правильно делаю?
vrtp вне форума Ответить с цитированием
Старый 20.12.2011, 08:16   #2
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Хотя бы комментарии к коду написать потрудились.
arevers-у нигде не присваивается значение.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 20.12.2011, 11:47   #3
vrtp
Пользователь
 
Регистрация: 11.10.2011
Сообщений: 33
По умолчанию

Да, простите, без комментариев сложно разобраться, подправил
Код:
#include <stdio.h>
#include<stdlib.h>
#include<math.h>
#define BASE 5
long int BASEto10(long int a);
long int Obratno(long int a);
int invertiruet(int arevers);
int main(void)
{
long int x, y, z, arevers;
printf("a=");
scanf("%ld", &x);
y = BASEto10(x);
printf("a=%ld\n", y);
z=invertiruet(arevers);
printf("Decimal notation: a=%ld\n", z);
return 0;
}
long int BASEto10(long int a){//функция 1, перевод из 5, в 10
int k=1;
long int a10=0;
while (a) {
a10 += k*(a%10);//делаем все по алгоритму,делим число a на 10,умножаем на к
k *= BASE;//степени 5 
a /= 10;//берем челую часть от деления а на 10
}
return a10;
}
long int Obratno(long int a){// фунцция 2, первод из 10 в 5, в прямом порядке 
int k=1;
long int arevers=0;
while (a) {
div_t n;//используем библиотечную функцию див
n = div(a, BASE);//раскладываем число а при делении на BASE на частное и остаток
a=n.quot;//запоминаем частное
arevers+=pow(10,k)*n.rem;//ну и считаем некую arevers, это наше число в прямом порядке
++k;// набиваем счетчик для степени десятки
}
return arevers;// возращаем переменную
}
int invertiruet(int arevers){//функция, которая переводит числа в обратном порядке
	int q;
     do
     {
          printf("%d", arevers % 10);
     }while (arevers /= 10);
     q=puts("");//получаем в обратном порядке
     
     return q;//врзращаем ее
}
А почему arevers-у нигде не присваивается значение, в него записывается число в функции 2, или я что-то не понял.Кстати придумал как сделать вторую функцию через for.Впринципе ничего нового, только можно подсчитать количество цифр через десятичный логарифм, взять от него целую часть и прибавить 1, тогда будет известна его длина, но у меня вроде должен работать и так алгоритм во второй функции

Последний раз редактировалось vrtp; 20.12.2011 в 12:00.
vrtp вне форума Ответить с цитированием
Старый 20.12.2011, 16:53   #4
JuniorProger
Форумчанин
 
Регистрация: 16.09.2011
Сообщений: 114
По умолчанию

Вот рабочий код. В следующий раз разбивай программу на блоки и пиши "лесенкой", а то как-то совсем не хочется разбираться в месиве из кода. Хорошо хоть кода было не много, а то даже и смотреть не стал бы. И еще вопрос: какую среду разработки используешь?

Код:
#include <stdio.h>
#include<stdlib.h>
#include<math.h>
#define BASE 5
long int BASEto10(long int a);
long int Obratno(long int a);
//int invertiruet(int arevers);

int main(void){
	long int x, y, z, arevers;
	printf("a=");
	scanf("%ld", &x);
	y = BASEto10(x);
	printf("a=%ld\n", y);
	arevers = Obratno(y);
//	z=invertiruet(arevers);
	printf("Decimal notation: a=%ld\n", arevers);
	scanf("%ld", &x);
	return 0;
}

long int BASEto10(long int a){//функция 1, перевод из 5, в 10
	int k=1;
	long int a10=0;
	while (a) {
		a10 += k*(a%10);//делаем все по алгоритму,делим число a на 10,умножаем на к
		k *= BASE;//степени 5 
		a /= 10;//берем челую часть от деления а на 10
	}
	return a10;
};

long int Obratno(long int a){// фунцция 2, первод из 10 в 5, в прямом порядке 
	int k=0;
	long int arevers=0;
	while (a) {
		ldiv_t n;//используем библиотечную функцию див
		n = div(a, (long int)BASE);//раскладываем число а при делении на BASE на частное и остаток
		a=n.quot;//запоминаем частное
		arevers+=pow((float)10,k)*n.rem;//ну и считаем некую arevers, это наше число в прямом порядке
		++k;// набиваем счетчик для степени десятки
	}
	return arevers;// возращаем переменную
}

/*
int invertiruet(int arevers){//функция, которая переводит числа в обратном порядке
	int q;
    do{
		printf("%d", arevers % 10);
    }while (arevers /= 10);
    q=puts("");//получаем в обратном порядке
    
    return q;//врзращаем ее
}
*/
JuniorProger вне форума Ответить с цитированием
Старый 20.12.2011, 21:25   #5
vrtp
Пользователь
 
Регистрация: 11.10.2011
Сообщений: 33
По умолчанию

Спасибо. Вообще положено использовать Pelles, но лично я пишу в MVS10
vrtp вне форума Ответить с цитированием
Старый 20.12.2011, 22:30   #6
JuniorProger
Форумчанин
 
Регистрация: 16.09.2011
Сообщений: 114
По умолчанию

Ну так в MVS10 есть хорошие средства для отладки программ. Надо было просто посмотреть по шагам с помощью отладчика и все проблемы решил бы сам. Плюс времени сэкономил бы.
JuniorProger вне форума Ответить с цитированием
Старый 21.12.2011, 01:24   #7
vrtp
Пользователь
 
Регистрация: 11.10.2011
Сообщений: 33
По умолчанию

Да мне показали как включать отладку и типо все остальное сам, но некоторые нюансы непонятны поэтому приходиться спрашивать. Сейчас доделываю калькулятор систем счисления, возникает много ошибок, попробую отладчиком, если не получиться, то завтра напишу в эту тему
vrtp вне форума Ответить с цитированием
Старый 25.12.2011, 23:04   #8
vrtp
Пользователь
 
Регистрация: 11.10.2011
Сообщений: 33
По умолчанию

В продолжении темы
Код:
/*В соответствии с условиями задания для лабораторной работы к данному занятию составить функции для реализации следующих арифметических операций в указанной системе счисления: сложение, вычитание, умножение, возведение в целую неотрицательную степень. Функции должны отслеживать возможное переполнение.
Для чисел a и b, введенных пользователем в указанной системе счисления, с помощью реализованных функций вычислить значение выражения a–a(b2–a)+b*/
#include <stdio.h>
#include<stdlib.h>
#include<math.h>
#include<limits.h>
#define BASE 5
    long int BASEto10(long int a);
    long int Obratno(long int a);
    long int invertiruet(long int i);
	long int umnogenie(long int o, long int p);
	long int vichitanie (long int m, long int n);
	long int vstepen (long int r, long int w);
	long int slogenie(long int q, long int h);

int main(void){
	long int x, y, pervoe10, vtoroe10, Itogovoe, rofl, lol ;
	printf("vvedite nach pol chislo x= ");//первое число в 5 системе
	  scanf("%ld", &x); 
	printf("vvedite nach pol chislo y= ");//второе число в пятиричной системе
	  scanf("%ld", &y); 
	  pervoe10=BASEto10(x);//в десятичную
	  vtoroe10=BASEto10(y);//в десятичную
	 // if ((x>y)&&(vtoroe10>pervoe10)){
	 // printf("PErepolnenie");
	  // return 404;
	 // }
	  //if ((x<y)&&(pervoe10>vtoroe10)){
	  //printf("PErepolnenie");
	  // return 404;
	 // }
	  Itogovoe= vichitanie(slogenie(pervoe10,vtoroe10),umnogenie(pervoe10, vichitanie(vstepen(vtoroe10,2), pervoe10)));//подсчитываем выраж-е
	  /*if (Itogovoe>=sizeof(long int)){
	 printf("PErepolnenie");
	  return 404;
	  }*/
	  rofl=Obratno(Itogovoe);//в прямом порядке
	  lol=invertiruet(rofl);//развернули
	  /*if (lol>=sizeof(long int)){
	 printf("PErepolnenie");
	  return 404;
	 }*/
	 printf("To chto nugno %d", lol);//вывели

}

long int BASEto10(long int a){//функция 1, перевод из 5, в 10
	int k=1;
	long int a10=0;
	while (a) {
		a10 += k*(a%10);//делаем все по алгоритму,делим число a на 10,умножаем на к
		k *= BASE;//степени 5 
		a /= 10;//берем челую часть от деления а на 10
	}
	return a10;
}

long int Obratno(long int a){// фунцция 2, первод из 10 в 5, в прямом порядке 
	    int k=0;
	    long int arevers=0;
while (a) {
		ldiv_t n;//используем библиотечную функцию див
		n = div(a, (long int)BASE);//раскладываем число а при делении на BASE на частное и остаток
		a=n.quot;//запоминаем частное
		arevers+=pow((float)10,k)*n.rem;//ну и считаем некую arevers, это наше число в прямом порядке
		++k;// набиваем счетчик для степени десятки
	}
	return arevers;// возращаем переменную
}
int long invertiruet(int long i){//функция записи некого числа наоборот
     int k=0;
	while (i>0){
		k*=10;
		k+=i%10;
		i/=10;
	}
	return k;
	}
	
long int umnogenie(long int o, long int p)
	{
	 long int b;
	 b=o*p;
	// if (b>=sizeof(long int)){
	 //printf("PErepolnenie");
	  //return 404;
	// }
	 return b;
	}
	
long int vichitanie (long int m, long int n)
	{
	 long int d;
	 d=m-n;
	// if (d>=sizeof(long int)){
	// printf("PErepolnenie");
	 // return 404;
	// }
	 return d;
	}
	
long int vstepen (long int r, long int w)
	{
	 long int t;
	 t=pow(r,w);
	 //if (t>=sizeof(long int)){
	// printf("PErepolnenie");
	 // return 404;
	// }
	 return t;
	}
	
long int slogenie(long int q, long int h)
	{
	 long int j;
	 j=q+h;
	// if (j>=sizeof(long int)){
	// printf("PErepolnenie");
	//  return 404;
	//  }
	 return j;
	}
Вопрос правильно ли я сделал, и как эффективно организовать, чтобы проходила проверка на переполнение, просто не уверен, что мой алгоритм работает правильно, а так вроде все правильно, да кст то что я закавычил это и есть алгоритм проверки, потом я думаю его вынести в отдельную функцию.

Последний раз редактировалось vrtp; 25.12.2011 в 23:07.
vrtp вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перевод из 10 в другие системы счисления. dixonich Помощь студентам 13 11.04.2011 18:13
Перевод целого числа из 5 в 8 систему счисления и обратно. Whitt Помощь студентам 7 08.09.2010 07:14
Перевод в разные системы счисления Наташенька Общие вопросы C/C++ 2 21.12.2008 11:34
Перевод числа в различные системы счисления ...Оленька... Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 14.12.2008 16:08
Перевод из одной системы счисления в другую Sky_VSUH Помощь студентам 1 28.02.2008 20:18