C //习题 6.10 有一篇文章,共有3行文字,每行有80个字符。要求分别统计出其中英文大写字母、小写字母、数字、空格以及其他字符的个数。

C程序设计 (第四版) 谭浩强 习题6.10

习题 6.10 有一篇文章,共有3行文字,每行有80个字符。要求分别统计出其中英文大写字母、小写字母、数字、空格以及其他字符的个数。

IDE工具:VS2010
Note: 使用不同的IDE工具可能有部分差异。

 

代码块
方法1:使用数组
#include <stdio.h>
#include <stdlib.h>

int main()
{
    char str[3][80];
    
	int upperCaseLetter, lowerCaseLetter, number, space, others;
    
	printf("Enter 3 lines strings:\n");
	for(int i = 0; i < 3; i++){
		printf("Line %d: ", i + 1);
        gets(str[i]);
	}

    for(int i = 0; i < 3; i++){
		upperCaseLetter = 0;
		lowerCaseLetter = 0;
		number = 0;
		space = 0;
		others = 0;

        for(int j = 0; str[i][j] != '\0'; j++){
            if(str[i][j] >= 'A' && str[i][j] <= 'Z'){
                upperCaseLetter++;
			}
            else if(str[i][j] >= 'a' && str[i][j] <= 'z'){
                lowerCaseLetter++;
			}
            else if(str[i][j] >= '0' && str[i][j] <= '9'){
                number++;
			}
            else if(str[i][j] == ' ' || str[i][j] == '\t'){
                space++;
			}
            else{
                others++;
			}
        }
		printf("\nLine %d:\nUpperCase Letter = %d\nLowerCase Letter = %d\nNumber = %d\nSpace = %d\nOthers = %d\n\n", i + 1, upperCaseLetter, lowerCaseLetter, number, space, others);
	}

	system("pause");
    return 0;
}
方法2:指针和函数的模块化设计
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void initialStr(char ***str, int n){
	*str = (char**)malloc(n * sizeof(char*));
	for(int i = 0; i < n; i++){
		(*str)[i] = (char*)malloc(80 * sizeof(char));
	}
}

void inputStr(char **str, int n){
	printf("Enter %d lines strings:\n", n);
	for(int i = 0; i < 3; i++){
		printf("Line %d: ", i + 1);
        gets(str[i]);
	}
}

void countStr(char **str, int n){
    for(int i = 0; i < 3; i++){
		int count[5] = {0};
        for(int j = 0; str[i][j] != '\0'; j++){
            if(str[i][j] >= 'A' && str[i][j] <= 'Z'){
                count[0]++;
			}
            else if(str[i][j] >= 'a' && str[i][j] <= 'z'){
                count[1]++;
			}
            else if(str[i][j] >= '0' && str[i][j] <= '9'){
                count[2]++;
			}
            else if(str[i][j] == ' ' || str[i][j] == '\t'){
                count[3]++;
			}
            else{
                count[4]++;
			}
        }
		printf("\nLine %d:\n", i + 1);
		for(int k = 0; k < 5; k++){
			switch(k){
			case 0: printf("UpperCase Letter = %d\n", count[k]); break;
			case 1: printf("LowerCase Letter = %d\n", count[k]); break;
			case 2: printf("Number = %d\n", count[k]); break;
			case 3: printf("Space = %d\n", count[k]); break;
			case 4: printf("Others = %d\n\n", count[k]); break;
			default: break;
			}
		}
	}
}

void freeStr(char ***str, int n){
	for(int i = 0; i < n; i++){
		free((*str)[i]);
	}
	free(*str);
}

int main()
{
    char **str = NULL;

	initialStr(&str, 3);
    inputStr(str, 3);
	countStr(str, 3);
	freeStr(&str, 3);

	system("pause");
    return 0;
}
  • 21
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
好的,我会按照您的要求回答问题。针对您的第一个问题: 以下是二叉树的扩展遍历序列字符串:AB.D..EF.G..C.. 根据教材算法6.10,我们可以通过扩展遍历序列字符串建立二叉树,具体过程如下: 1. 从字符串中取个字符作为根节点,即 A; 2. 下一个字符是 B,因此将 B 加入 A 的左子树; 3. 下一个字符是 .,表示 A 的右子树为空; 4. 下一个字符是 D,因此将 D 加入 B 的左子树; 5. 下一个字符是 .,表示 B 的右子树为空; 6. 下一个字符是 .,表示 D 的左子树为空; 7. 下一个字符是 E,因此将 E 加入 D 的右子树; 8. 下一个字符是 F,因此将 F 加入 A 的右子树; 9. 下一个字符是 .,表示 F 的左子树为空; 10. 下一个字符是 .,表示 E 的左子树为空; 11. 下一个字符是 G,因此将 G 加入 F 的右子树; 12. 下一个字符是 .,表示 G 的左子树为空; 13. 下一个字符是 .,表示 G 的右子树为空; 14. 下一个字符是 C,因此将 C 加入根节点 A 的右子树; 15. 下一个字符是 .,表示 C 的子树为空。 根据上述过程,我们可以建立如下的二叉树: A / \ B C / \ / D . . / \ E F / \ . G 接下来,按照树状打印输的方式输该二叉树,结果如下: ┌── C ┌──A │ │ ┌── G │ └──F │ └── . ┌──B │ │ ┌── E │ └──D │ └── . . 希望能够满足您的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Navigator_Z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值