Как использовать 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);
}