Как использовать corecursion в c?

Мне нужна помощь, чтобы найти место для размещения операторов печати в каждой функции (alpha_count и sum_digits), чтобы они печатались только один раз (в конце программы).

Ex.
Количество символов: 8
Сумма цифр: 19

На данный момент они печатаются каждый раз, когда вызывается функция. Есть идеи?

#include <stdio.h> 
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

//Prototypes
void count_alpha(char *s, int len, int index); 
void sum_digit(char *s, int len, int index);

#define SIZE 22

int main(void){
  //Declarations
  char string[SIZE];
  int length;

  //Get string from user
  printf("Enter a string of letters and numbers: ");
  scanf("%s", string);
  printf("String: %s\n", string);
  //Get length of string
  length = strlen(string);
  printf("Length: %d\n", length);
  //Get letters from string
  count_alpha(string, length, 0);

  return 0;
}

void count_alpha(char *s, int len, int index){
  static int characters = 0;
  char c = ' ';

  if (index < len){
    c = s[index];
    if(isalpha(c)){
        characters++;
        printf("char: %d\n", characters);
        index++;
        printf("index: %d\n", index);
        count_alpha(s, len, index);
    }
    else if(isdigit(c)){
        sum_digit(s, len, index);
    }
    //index++;
    //printf("index: %d\n", index);
    //printf("Number of Characters: %d\n", characters);
  }
  //else
  printf("Number of Characters: %d\n", characters);

}

void sum_digit(char *s, int len, int index){
  static int digits = 0;
  char c = ' ';

  if (index < len){
    c = s[index];
    if(isalpha(c)){
        count_alpha(s, len, index);
  }
  else if(isdigit(c)){
        printf("num is: %c", c);
        //printf("number is: %d", (atoi(&s[index])));
        //digits += atoi(&c);
        digits += c - '0';
        printf("sum: %d\n", digits);
        index++;
        printf("index: %d\n", index);
        sum_digit(s, len, index);
    }
    //index++;
    //printf("index: %d\n", index);
    //printf("Sum of digits: %d\n", digits);
  }
  //else
  printf("Sum of digits: %d\n", digits);

}

2 ответа

Решение

Декларировать int characters = 0 а также int digits =0 глобально, сохранение их глобальности будет таким же, как статические переменные, кроме того, к нему можно получить доступ где угодно, что поможет вам распечатать то, что вы хотели только один раз в основной функции.

Для объявления их глобальными просто объявите их вне всех функций и при запуске программы.

.
.//header files
.
//#include <ctype.h>
int characters = 0;
int digits = 0;

В main(): просто напечатайте их

printf("Number of Characters: %d\n", characters);
printf("Sum of digits: %d\n", digits);

РЕДАКТИРОВАТЬ: без глобальных переменных с помощью указателей.

void count_alpha(char *s, int len, int index,int *charac,int *dig);
void sum_digit(char *s, int len, int index,int *charac,int *dig);

В основном:

int* charac=&characters;
int* dig=&digits;
count_alpha(string,length,0,charac,dig);

И всякий раз, когда вы видите вызов функции, передайте эти указатели:

count_alpha(string,length,0,charac,dig);

Для увеличения значений просто используйте:

(*charac)++;
(*dig)++;

Как alpha_count() а также sum_digits() эффективно собираем статистику, передаем указатель на тип статистики. Отбросьте статические переменные.

typedef struct {
  unsigned characters;
  unsigned digits;
} char_digs;


void sum_digit(char *s, int len, int index, char_digs *stat) {
  // static int digits = 0;
  ...
  count_alpha(s, len, index, stat);
  ...
  stat->digits += c - '0';
  ...
  sum_digit(s, len, index, stat);
  ...
}      

void count_alpha(char *s, int len, int index, char_digs *stat) {
  // like sum_digit() above
}

int main(void) {
  ...
  char_digs stat = {0,0};
  ...
  count_alpha(..., ..., &stat);
  printf("Number of Characters: %u\n", stat.characters);
  printf("Sum of digits: %u\n", stat.digits);
}
Другие вопросы по тегам