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

  • Автор темы jonijo
  • Дата начала
Статус
Закрыто для дальнейших ответов.
J

jonijo

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

}
 
J

jonijo

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

BashOrgRu

Well-known member
15.03.2009
77
0
#3
Может так? Подаёшь на вход адресс первого элемента 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'; /*перевожу элементы массива с десятичными элементами в символы*/
}

}
 
J

jonijo

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

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;		
}
Добавлено:
Что-то не совсем понимаю.. Объясни как происходит перевод. Функция power что делает?


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

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

BashOrgRu

Well-known member
15.03.2009
77
0
#6
Вот как примерно должно быть, на вход 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;
}
 
J

jonijo

#7
прости за глупы вопрос но как подключить малоку :(
 
J

jonijo

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

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

BashOrgRu

Well-known member
15.03.2009
77
0
#13
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;
}
 
Статус
Закрыто для дальнейших ответов.