Задача: Системы Исчислений (10-чная, 8-ная), первод символа в цифру

Тема в разделе "C/C++/C#", создана пользователем jonijo, 3 дек 2010.

Статус темы:
Закрыта.
  1. jonijo

    jonijo Гость

    Всем всем здраствуйте.Посмотрите пожалуйста в чём мои ошибки.Ниже приведена функция
    которая принимает на вход строку символов в которой записано восьмеричное число ,переводит каждый символ в число и записывает эти числа в обратном порядке в новый массив.Далее она переводит каждый элемент массива (нового) в десятичное число.После чего каждое десятичное число переводит опять в символы и записывает в первоначальный массив.то есть на входе строка с восьмеричным числом на выходе строка с десятичным числом. Я как бы перевёл но не могу получить результат :) Хотелось бы канибудь с использованием указателей.т.к тут ещё потом будут др.системы счисления.
    вот код функции desy:

    #include "step.h"
    #include <string.h>
    void desy (char str [])
    {
    char *ip; /*указатель на массив*/
    int i,k,summa,c;
    int mas [30];

    k=strlen (str);
    for (i=0;i<=strlen(str)-1;++i) /*перевожу каждый элемент str в число и сохр.в новый массив*/
    mas [k-1-i]=str -'0';

    for (i=0;i<=strlen(str)-1;++i){
    mas =mas*power (8,i); /*перевожу каждый элемент массива в десятичное сичло из восьмеричного*/
    str =mas+'0'; /*перевожу элементы массива с десятичными элементами в символы*/
    }
    ip=&str; /*тут что-то не так нитак*/

    }
     
  2. jonijo

    jonijo Гость

    НУ хотябы может быть кто нибудь подскажет как вытащить из функции указательна массив?
     
  3. BashOrgRu

    BashOrgRu Well-Known Member

    Регистрация:
    15 мар 2009
    Сообщения:
    78
    Симпатии:
    0
    Может так? Подаёшь на вход адресс первого элемента str(т.е. просто str), процедура меняет элементы, находящиеся по адресу str, то есть)

    Код (C++):
    void desy (char *str)
    {
    char *ip; /*указатель на массив - вобще лишнее */
    int i,k,summa,c;
    int mas[30];

    k=strlen (str);
    for (i=0;i<strlen(str);i++) /*перевожу каждый элемент str в число и сохр.в новый массив*/
    mas [k-1-i]=str [i]-'0';

    for (i=0;i<strlen(str);i++){
    mas [i]=mas[i]*power (8,i); /*перевожу каждый элемент массива в десятичное сичло из восьмеричного*/
    str [i]=mas[i]+'0'; /*перевожу элементы массива с десятичными элементами в символы*/
    }

    }
     
  4. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0

    Что-то не совсем понимаю.. Объясни как происходит перевод. Функция power что делает?
     
  5. jonijo

    jonijo Гость

    вот смотри у меня получается такая штука немного переделал может кто подскажети?

    Код (C++):
    int per (char*strc) /*принимаю на входе строку введёную с клавиатуры*/
    {
    int i,n;
    int mas [30];


    for (i=0;i<=strlen(strc)-1;++i)  
    mas [i]=(strc [i]-'0');   /*перевожу все элементы по символьно в числа*/


    /*теперь перевожу в десятичную*/
    n=0;                                            /* тут будет сумма моих элементов */
    for (i=0;i<=strlen(strc)-1;++i){
    mas [i]=mas [i]*power(8,strlen(strc)-1-i);
    n=n+mas[i];}
    /* В итоге в n получаю моё десятичное число но мне его надо представить как строку*/
    return n;      
    }
    Добавлено:


    mas*power (8,i);
    это функция умножает каждое элемент массива на 8 основание первоначальной системы на i
    где mas[] это элементы записаннные в обратном порядке по отношению к моему первомму массиву.

    Во второй версии программы я не переворачивал массив делал на прямую
     
  6. BashOrgRu

    BashOrgRu Well-Known Member

    Регистрация:
    15 мар 2009
    Сообщения:
    78
    Симпатии:
    0
    Вот как примерно должно быть, на вход desy подается строка str, и в эту же строку записывается в десятичном виде.

    Код (C++):
    #include<stdio.h>

    int power(int n,int s)
    {
    int pow=1,i;

    for (i=1; i<=s; i++) pow*=n;
    return pow;
    }

    void reverse(char *s)
    {
    int i, j;
    char c;

    for (i = 0, j = strlen(s)-1; i<j; i++, j--)
    {
    c = s[i];
    s[i] = s[j];
    s[j] = c;
    }
    }

    void itoa(int n, char *s)
    {
    int i, sign;

    if ((sign = n) < 0) /* записываем знак */
    n = -n;      /* делаем n положительным числом */
    i = 0;
    do       /* генерируем цифры в обратном порядке */
    {
    s[i++] = n % 10 + '0';  /* берем следующую цифру */
    }
    while ((n /= 10) > 0);    /* удаляем */
    if (sign < 0)
    s[i++] = '-';
    s[i] = '\0';
    reverse(s);
    }

    void desy (char *str)
    {
    int i,k,summa=0;
    int mas[30];

    k=strlen (str);
    for (i=0; i<strlen(str); i++)
    mas [k-1-i]=str [i]-'0';
    for (i=0; i<strlen(str); i++)
    summa+=mas[i]*power (8,i);
    itoa(summa,str);
    }

    int main()
    {
    char *str=malloc(31*sizeof(char));
    int i=0,n,c;

    while ((c=getchar())!='\n')
    {
    str[i]=c;
    i++;
    }
    str[i]='\0';
    desy(str);
    printf("str=%s",str);
    return 0;
    }
     
  7. jonijo

    jonijo Гость

    прости за глупы вопрос но как подключить малоку :(
     
  8. BashOrgRu

    BashOrgRu Well-Known Member

    Регистрация:
    15 мар 2009
    Сообщения:
    78
    Симпатии:
    0
    она же в stdio.h находится, или попробуй malloc.h подключить
     
  9. jonijo

    jonijo Гость

    там косяк какой то с синтаксисом что то :Значение типа войд нельзя использовать для инициализации типа чар???
     
  10. BashOrgRu

    BashOrgRu Well-Known Member

    Регистрация:
    15 мар 2009
    Сообщения:
    78
    Симпатии:
    0
    о_О у меня всё компилится, скинь ошибку
     
  11. jonijo

    jonijo Гость

     
  12. jonijo

    jonijo Гость

    Thank you!Всё заработало) :(

    Добавлено: Один момент ты мог бы поподробнее разъяснить void itoa(int n, char *s) и начало майна
     
  13. BashOrgRu

    BashOrgRu Well-Known Member

    Регистрация:
    15 мар 2009
    Сообщения:
    78
    Симпатии:
    0
    Код (C++):
    int power(int n,int s) // Возведение в степень
    {
    int pow=1,i;

    for (i=1; i<=s; i++) pow*=n;
    return pow;
    }

    void reverse(char *s) // Переворачивает строку s,
    {
    int i, j;
    char c;

    for (i = 0, j = strlen(s)-1; i<j; i++, j--) // Цикл перевората
    {
    c = s[i];
    s[i] = s[j];
    s[j] = c;
    }
    }

    void itoa(int n, char *s) // Переводит число в строку
    {
    int i, sign;

    if ((sign = n) < 0) n = -n; // Это вобще можно убрать, у тебя числа будут только положительными
    i = 0;
    do       // генерируем цифры в обратном порядке
    s[i++] = n % 10 + '0';  // тут используется то, что число mod 10 = последняя цифра числа, то есть, например 335 mod 10 = 5
    while ((n /= 10) > 0);    // тут мы избавляемся от последней цифры, деля на 10 без остатка, например 335/10 = 33
    if (sign < 0) s[i++] = '-'; // тоже можно убрать
    s[i] = '\0';
    reverse(s); // переворачиваем строку
    }

    int main()
    {
    char *str=malloc(31*sizeof(char)); // выделяем память под 30+1 символ, так как в функции desy ты заводишь массив на 30 символов
    int i=0,n,c;

    while ((c=getchar())!='\n') // в этом цикле читаем символы, и записываем их в str пока не встретим символ новой строки(то есть нажатие клавиши Enter)
    {
    str[i]=c; // так str - адрес, то разрешается использования str[i], str[i]=c можно записать как *(str+i)=c
    i++;
    }
    str[i]='\0'; // всякая строка должна заканчиваться на число 0
    desy(str);
    printf("str=%s",str);
    return 0;
    }
     
Загрузка...
Похожие Темы - Задача Системы Исчислений
  1. Янчик
    Ответов:
    0
    Просмотров:
    470
  2. TrishaRay
    Ответов:
    1
    Просмотров:
    777
  3. elzim
    Ответов:
    0
    Просмотров:
    928
  4. ShaoKahn
    Ответов:
    0
    Просмотров:
    1.113
  5. eremin-sanek
    Ответов:
    3
    Просмотров:
    1.101
Статус темы:
Закрыта.

Поделиться этой страницей