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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.04.2012, 04:40   #1
Nice Plant
Пользователь
 
Регистрация: 18.12.2009
Сообщений: 23
По умолчанию Перевод из 16-ой системы счисления в 10-ю. Си

Здравствуйте. Необходимо написать программу выполняющую данный перевод.

На языке Си.

Начал писать, но что то не выполняется(.
Код:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
#include <stdio.h>


int HEX_TO_DEC(char st[10])
{
	int i, s, k, p;
	s = 0;
	p = strlen(st) - 1;
	for (i = 0; st[i] != '\0'; i++)
	{
		switch (toupper(st[i]))
		{
			case 'A':
				k = 10;
				break;
			case 'B':
				k = 11;
				break;
			case 'C':
				k = 12;
				break;
			case 'D':
				k = 13;
				break;
			case 'E':
				k = 14;
				break;
			case 'F':
				k = 15;
				break;
			case '1':
				k = 1;
				break;
			case '2':
				k = 2;
				break;
			case '3':
				k = 3;
				break;
			case '4':
				k = 4;
				break;
			case '5':
				k = 5;
				break;
			case '6':
				k = 6;
				break;
			case '7':
				k = 7;
				break;
			case '8':
				k = 8;
				break;
			case '9':
				k = 9;
				break;
			case '0':
				k = 0;
				break;
		}
		s = s + k * pow(16, p);
		p--;
	}
	printf("%d, &s") ;
	return 0;
}

void main()
{
	char s[10];
	char ch;
	printf ( "Plese, enter string: \n");
	scanf("%s,  &s")  ;
	printf ("Rezultant: \n");
	HEX_TO_DEC(s);
	scanf ();
}
Nice Plant вне форума Ответить с цитированием
Старый 29.04.2012, 08:24   #2
Nedward
Пользователь
 
Регистрация: 26.06.2011
Сообщений: 85
По умолчанию

В самом алгоритме разбираться было лень (хотя и заинтересовался - позже обязательно посмотрю - давно я C++ код не разбирал ), но ошибки исправил. Теперь оно компилируется, и даже считает:
Код:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
#include <stdio.h>


int HEX_TO_DEC(char st[10])
{
    int i, s, k, p;
    s = 0;
    p = strlen(st) - 1;
    for (i = 0; st[i] != '\0'; i++)
    {
        switch (toupper(st[i]))
        {
            case 'A':
                k = 10;
                break;
            case 'B':
                k = 11;
                break;
            case 'C':
                k = 12;
                break;
            case 'D':
                k = 13;
                break;
            case 'E':
                k = 14;
                break;
            case 'F':
                k = 15;
                break;
            case '1':
                k = 1;
                break;
            case '2':
                k = 2;
                break;
            case '3':
                k = 3;
                break;
            case '4':
                k = 4;
                break;
            case '5':
                k = 5;
                break;
            case '6':
                k = 6;
                break;
            case '7':
                k = 7;
                break;
            case '8':
                k = 8;
                break;
            case '9':
                k = 9;
                break;
            case '0':
                k = 0;
                break;
        }
        s = s + k * pow(16, p);
        p--;
    }
    printf("%d", s) ;
    return 0;
}

int main()
{
    char s[10];
    char ch;
    printf ( "Plese, enter string: \n");
    scanf("%s", s) ;
    printf ("\nRezultant: \n");
    HEX_TO_DEC(s);
    scanf (s);
}
В чём были проблемы? Думаю и так понятно. Но, на всякий случай:
scanf должен был получать ДВА параметра, разделённых запятой. А получал ОДИН текстовый массив, В КОТОРОМ была запятая (вот правильный "scanf("%s", s);" и неправильный "scanf("%s, &s") ;".
Тоже самое и с printf.
Всегда пишите код так, будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете. (c) Martin Golding
Nedward вне форума Ответить с цитированием
Старый 29.04.2012, 09:08   #3
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Может обойтись без лишних внешних функций?
Оно и покороче будет. Что то вроде этого:
Код:
unsigned char hdigit(unsigned char c)
{
    return (c >= 'A' ?  c - 'A' + 10 : c - '0');
}

unsigned HEX_TO_DEC(char* hx)
{
	unsigned int s = 0, p = 0;
	char* cpi = hx;
	while( *++cpi );
	while( cpi-- != hx )
	{
		for ( int i = p, po = 1; i--; )	
			po *= 16;
		s +=  hdigit(*cpi) * po;
		p ++;
	}
	return s;
}


int main()
{
	printf( "%d\n",HEX_TO_DEC("FFFF"));
}
ps.
Либо вообще отказаться от нахождения степени, и использовать битовый сдвиг:
Код:
unsigned HEX_TO_DEC(char* hx)
{
	unsigned int s = 0, p = 0;
	char * cpi = hx;
	while( *++cpi );
	while( hx != cpi-- )
	{
		s += hdigit(*cpi) << p;
		p += 4;
	}
	return s;
}

Последний раз редактировалось EUGY; 29.04.2012 в 11:33.
EUGY вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
перевод из 5 в 10 системы счисления и обратно vrtp Общие вопросы C/C++ 7 25.12.2011 23:04
Перевод из одной системы счисления в другую колянчик1712 Помощь студентам 0 25.12.2011 15:56
Перевод из 10 в другие системы счисления. dixonich Помощь студентам 13 11.04.2011 18:13
Перевод в разные системы счисления Наташенька Общие вопросы C/C++ 2 21.12.2008 11:34
Перевод из одной системы счисления в другую Sky_VSUH Помощь студентам 1 28.02.2008 20:18