1. Набираем команду codeby webinar. Набираем команду для организации и проведения вебинаров. Подробнее ...

    Скрыть объявление
  2. Требуются разработчики и тестеры для проекта codebyOS. Требования для участия в проекте: Знание принципов работы ОС на базе Linux; Знание Bash; Крайне желательное знание CPP, Python, Lua; Навыки системного администрирования. Подробнее ...

    Скрыть объявление
  3. Получи 30.000 рублей. Для получения денег необходимо принять участие в конкурсе авторов codeby. С условиями и призами можно ознакомиться на этой странице ...

    Внимание! Регистрация авторов на конкурс закрыта.

    Скрыть объявление

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

Тема в разделе "Вопросы новичков и не только", создана пользователем jonijo, 3 дек 2010.

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

    jonijo Гость

    Репутация:
    0
    Всем всем здраствуйте.Посмотрите пожалуйста в чём мои ошибки.Ниже приведена функция
    которая принимает на вход строку символов в которой записано восьмеричное число ,переводит каждый символ в число и записывает эти числа в обратном порядке в новый массив.Далее она переводит каждый элемент массива (нового) в десятичное число.После чего каждое десятичное число переводит опять в символы и записывает в первоначальный массив.то есть на входе строка с восьмеричным числом на выходе строка с десятичным числом. Я как бы перевёл но не могу получить результат :) Хотелось бы канибудь с использованием указателей.т.к тут ещё потом будут др.системы счисления.
    вот код функции 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 Гость

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

    BashOrgRu Well-Known Member

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

    Код:
    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

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

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

    jonijo Гость

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

    Код:
    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

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

    Код:
    #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 Гость

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

    BashOrgRu Well-Known Member

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

    jonijo Гость

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

    BashOrgRu Well-Known Member

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

    jonijo Гость

    Репутация:
    0
     
  12. jonijo

    jonijo Гость

    Репутация:
    0
    Thank you!Всё заработало) :(

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

    BashOrgRu Well-Known Member

    Репутация:
    0
    Регистрация:
    15 мар 2009
    Сообщения:
    77
    Симпатии:
    0
    Код:
    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;
    }
     
Загрузка...
Статус темы:
Закрыта.

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