2013-09-10 4 views
1

Рассмотрим систему кодирования для алфавитов с целыми числами, где 'a' представляется как 1, 'b' как 2, .. 'z' как 26. Учитывая массив цифр (1 до 9), введите функцию, которая печатает все допустимые интерпретации входного массива.Найти все возможные интерпретации массива цифр

/*Examples 

Input: {1, 1} 
Output: ("aa", 'k") 
[2 interpretations: aa(1, 1), k(11)] 

Input: {1, 2, 1} 
Output: ("aba", "au", "la") 
[3 interpretations: aba(1,2,1), au(1,21), la(12,1)] 

Input: {9, 1, 8} 
Output: {"iah", "ir"} 
[2 interpretations: iah(9,1,8), ir(9,18)]*/ 

Мой код с этой

#include<iostream> 
using namespace std; 
#include<string.h> 
int a[10]={2,3,4,4,2,4,2,8,9}; 
char c[]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}; 

void func(int i,char result[10]) 
{ 
    if(i==10) 
    { 
     int l=strlen(result); 
     for(int j=0;j<l;j++) 
      cout<<result[j]; 
    } 

    else 
    { 
     if(10*a[i]+a[i+1]<26) 
     { 
      strcat(result,"c[10*a[i]+a[i+1]]"); 
      func(i+2,result); 
     } 

     strcat(result,"c[a[i]]"); 
     func(i+1,result); 
    } 
} 

int main() 
{ 

    func(0,""); 
} 

Я не в состоянии выяснить ошибки. Можете ли вы мне помочь??

+0

Какие ошибки вы видите? –

+0

«using namespace std» вряд ли «ваш C-код». Я предполагаю, что вы имели ввиду C++? –

+2

Кроме того, вы пытаетесь strcat на строковый литерал, который является недостаточно коротким и доступен только для чтения. –

ответ

1

Одна ошибка, которую я вижу, заключается в том, что ваш массив результатов может не иметь 10 символов.

for(int j=0;j<10;j++) 
cout<<result[j]; 

Это приведет к ошибке сегментации.

EDIT: Если вы открыты для использования элементов C++, то я бы предпочел использовать std :: string вместо char array для результата.

2
#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 
int a[9]={2,3,4,4,2,4,2,8,9}; 
char c[]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}; 

void func(int i,char result[11]) 
{ 
    if(i==10) 
    { 
     printf ("%s\n", result); 
    } 
    else 
    { 
     char * temp = (char *)malloc(11); 
     sprintf(temp, "%s%c", result, c[a[i] - 1]); 
     func(i+1,temp); 
     free(temp); 

     if(i < 9 && 10*a[i]+a[i+1] < 26) 
     { 
      char * temp = (char *)malloc(11); 
      sprintf(temp, "%s%c", result, c[10*a[i]+a[i+1] - 1]); 
      func(i+2, temp); 
      free (temp); 
     } 
    } 
} 
int main() 
{ 
    func(0,""); 
} 

Выход

bcddbdbhi 
bcddxbhi 
wddbdbhi 
wddxbhi 

Потенциальные фатальные проблемы с вашим кодом

  1. strcat(result,"c[10*a[i]+a[i+1]]"); и strcat(result,"c[a[i]]"); вы конкатенации этих строк в result, который имеет размер всего 10, вместо конкатенация символа, соответствующего этому числу ,

Другие проблемы

  1. Внутри if(10*a[i]+a[i+1]<26) вы меняете содержимое result, когда рекурсия заканчивается, значение результата не то же самое, что было, когда он вошел в функцию. Поэтому лучше создавать новые строки внутри и освобождать их, когда их задача закончена.

Предложения

  1. Старайтесь не смешивать функции C и C++.
1

Вы спрашивали об ошибках. Здесь идет:

  1. ли не положить «с использованием пространства имен» перед другими включает в себя, это может привести к очень странные ошибки от компилятора в других проектах.
  2. a [10] не определен, но оценивается по вызову func (9, result);
  3. Кроме того, вызов func (результат 9) может привести к вызову func (9 + 2, result).
  4. strcat (результат, "c [10 * a [i] + a [i + 1]]"); добавляет строку «c [10 * a [i] + a [i + 1]]». Я сомневаюсь, что это результат, который вы хотите. Кроме того, компилятор должен рекомендовать вам использовать strncat().
  5. Лучше использовать std :: string и std :: stringstream, если у вас нет действительно повод, чтобы их избежать.
  6. Переменная a используется в func(), но не передается в качестве аргумента. Как правило, это не хорошая идея.

Пример кода (это использует несколько других трюков):

void PrintDecodings(const int* a, size_t length, std::string acc){ 
     static const char* alphabet = "0abcdefghijklmnopqrstuvwxyz"; 
     if(length == 0){ 
      std::cout << acc << std::endl; 
      return; 
     } 
     if(length == 1){ 
      std::cout << acc << alphabet[*a] << std::endl; 
      return; 
     } 
     if(10*a[0]+a[1] <= 26){ //At this point, length>=2, so a[1] is OK 
      PrintDecodings(a+2, length-2, acc+alphabet[10*a[0]+a[1]]); 
     } 
     return PrintDecodings(a+1, length-1, acc+alphabet[*a]); 
    } 

    //... 
     PrintDecodings(a, 9, ""); 
0
#include<iostream> 
using namespace std; 
#include<string.h> 
int a[3]={1,2,1}; 
char c[]={'NULL','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}; 

void func(int i,char result[3],int r) 
{ 
    if(i==3) 
    { 
     for(int j=0;j<r;j++) 
      cout<<result[j]; 
     cout<<"\n"; 
     return; 
    } 
    if(10*a[i]+a[i+1]<26) 
    { 
     result[r]=c[10*a[i]+a[i+1]]; 
     func(i+2,result,r+1); 
    } 
    result[r]=c[a[i]]; 
    func(i+1,result,r+1); 

} 


int main() 
{ 
    char result[10]; 
    func(0,result,0); 
} 
Смежные вопросы