Рекурсивная функция СИ, Расшифровка аббревиатур
Помогите пожалуйста с кодом. Надо написать программу на Си, что будет выводить варианты расшифровки аббревиатуры.
Пользователь вводит сначала аббревиатуру, потом цифру, означающее максимальное количество букв аббревиатуры в одном слове и текст аббревиатуры.
input1: АГЗС
input2: 1 "автогазозаправочная станция"
Программа должны вывести вариации расшифровки аббревиатуры.
Output:
"АвтоГаЗозаправочная Станция"
"АвтоГазоЗаправочная Станция"
input1: FIT
input2: 2 Fackulty of Information Technology
Output:
"Faculty of InformaTion technology"
"Faculty of Information Technology"
"Faculty of informatIon Technology"
"faculty oF InformaTion technology"
"faculty oF Information Technology"
"faculty oF informatIon Technology"
"faculty of inFormatIon Technology"
input1: FIT
input2: 2 fit
output: 0
input1: FIT
input2: 3 fit
output: "FIT"
Чтоб сделать эту программу надо использовать рекурсивную функцию. Но я пока не придумала, как это реализовать. Благодаря помощи в ответах получилось, но не выводить строку, если количество заглавных букв в слове превышает количество заданное пользователем не вышло. Вот мой код ниже.
int coco(const char* word, const char* abbr, int Astr, int Babbr, int cnt, int N){
for (int j = 0; j < Babbr; j++){
for (int i = 0; i < Astr; i++){
if (word[i] == abbr[j]) cnt++;
}
}
if(cnt <= N) {
return 0;
//printf("%d\n", cnt);
} else return 2;
}
int del_words(char* str, char* abbr, unsigned counter, unsigned N){
char ** limb = (char**)malloc(strlen(str)*sizeof(char*));
char * COPIE = (char *) (char **) malloc(strlen(str) * sizeof(char *));
COPIE = strcpy(COPIE, str);
int Astr, Babbr = strlen(abbr);
char *delsim = strtok(COPIE, " ,.-;:'!?");
while (delsim != NULL) {
limb[counter] = delsim;
counter++;
delsim = strtok(NULL, " ,.-;:'!?");
}
for(int i = 0; i < counter; i++){
//printf("%s", limb[i]);
if(coco(limb[i],abbr,strlen(limb[i]),Babbr,0,N) == 2 ) return 1;
}
return 0;
}
void decoding(char* str, const char* a, int sp, int ap, unsigned N) {
//если рабочий символ в аббревиатуре уже больше, чем длина аббревиатуры, то вывод
if (ap >= strlen(a) && del_words(str, a, 0, N) == 0) {
printf("\"%s\"\n", str);
return;
}
// место в строке, где был найден символ из аббревиатуры; до конца строки; на следующйи символ
for (char* f = strchr(str + sp, a[ap]); f; f = strchr(f + 1, a[ap])) {
*f = toupper(*f);
decoding(str, a, (int)(f - str), ap + 1, N);
*f = tolower(*f);
}
}
Ответы (1 шт):
Как один из вариантов:
void get(char* s, const char* a, int sp, int ap) {
if (ap >= strlen(a)) {
printf("%s\n", s);
return;
}
for (char* f = strchr(s + sp, a[ap]); f; f = strchr(f + 1, a[ap])) {
*f = toupper(*f);
get(s, a, (int)(f - s), ap + 1);
*f = tolower(*f);
}
}
А это использование:
int main() {
char in[] = "Faculty of InformaTion technology";
char abbr[] = "FIT";
for (char* c = in; *c; ++c) *c = tolower(*c);
for (char* c = abbr; *c; ++c) *c = tolower(*c);
get(in, abbr, 0, 0);
}