• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

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

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

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; /*тут что-то не так нитак*/

}
 
НУ хотябы может быть кто нибудь подскажет как вытащить из функции указательна массив?
 
Может так? Подаёшь на вход адресс первого элемента 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'; /*перевожу элементы массива с десятичными элементами в символы*/
}

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

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[] это элементы записаннные в обратном порядке по отношению к моему первомму массиву.

Во второй версии программы я не переворачивал массив делал на прямую
 
Вот как примерно должно быть, на вход 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;
}
 
Thank you!Всё заработало) :(

Добавлено: Один момент ты мог бы поподробнее разъяснить void itoa(int n, char *s) и начало майна
 
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;
}
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!