20201022-成信大-C语言程序设计-20201学期《C语言程序设计B》C-trainingExercises18

20201022-成信大-C语言程序设计-20201学期《C语言程序设计B》C-trainingExercises18

P137

在这里插入图片描述

/*
 编写一程序P137.C实现以下功能
  通过键盘输入两个姓名(约定均为汉字且最多4个汉字),判断并输出二者是否同姓。
    编程可用素材:
    printf("请输入姓名1: ");
    printf("请输入姓名2: ");
    printf("\n“…”与“…”同姓。\n"…);
    printf("\n“…”与“…”不同姓。\n"…);
  程序的运行效果应类似地如图1和图2所示,图1和图2中的红色部分是从键盘输入的内容。

请输入姓名1: 张李秀吉
请输入姓名2: 张三

“张李秀吉”与“张三”同姓。
图1 程序运行效果示例

请输入姓名1: 李四菊
请输入姓名2: 张三丰

“李四菊”与“张三丰”不同姓。
图2 程序运行效果示例
*/

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

#define N 9

void test01(char n1[],char n2[]);
void test02(char n1[], char n2[]);

int main(void)
{
    char name1[N];
    char name2[N];

    printf("请输入姓名1: ");
    scanf("%s", name1);
    printf("请输入姓名2: ");
    scanf("%s", name2);

    /*     printf("%d", strlen(name1));    // 张李秀吉 === 8
    printf("%d", strlen(name2));    // 张三 === 4

    putchar('\n');

    for (int i = 0; i < strlen(name1);i++)
    {
        printf("%c ", name1[i]);
    }
    
    for (int i = 0; i < strlen(name2);i++)
    {
        printf("%c ", name2[i]);
    } */


    // /* 
    //     这里,取第一个字符来比较,它是取出来的第一个字符吗?
    //     第一个字符是汉字字符,是一样的吗?
    //  */
    // if (name1[0] == name2[0])
    // {
    //     printf("\n“%s”与“%s”同姓。\n", name1, name2);
    // }
    // else
    // {
    //     printf("\n“%s”与“%s”不同姓。\n", name1, name2);
    // }

    // test01(name1, name2);       // 这个判断是有问题的
    test02(name1, name2);

    return 0;
}

/* 
    应该判断第一个完整的汉字,两个字节
    "张"的区位码:D5C5
    "章"的区位码:D5C2
    取测试数据:“张三”   “章三”
    如果使用方法一test01(),则同姓
    如果使用方法二test02(),则不同姓

 */

// 只判断了一个字节,不足一个汉字,但汉字有可能刚好第一个字节一样
void test01(char n1[],char n2[])
{
    // 只判断了一个字符【半个中文,没有这样的表示方式,只是为了方便理解,暂时这样表述】
    if (n1[0] == n2[0])
    {
        printf("\n“%s”与“%s”同姓。\n", n1, n2);
    }
    else
    {
        printf("\n“%s”与“%s”不同姓。\n", n1, n2);
    }
}

// 判断了两个字节,足够一个汉字,一定可以区别每一个汉字
void test02(char n1[],char n2[])
{
    // 判断了一个中文
    if (n1[0] == n2[0] && n1[1] == n2[1])
    {
        printf("\n“%s”与“%s”同姓。\n", n1, n2);
    }
    else
    {
        printf("\n“%s”与“%s”不同姓。\n", n1, n2);
    }
}

P219

在这里插入图片描述

/*
  编写一程序P219.C实现以下功能
  从键盘读入一行字符(约定:字符数≤127字节),将其中的数字字符以及这些数字字符的数量在屏幕上显示,
    注意:要求先显示这些数字字符的数量。
    编程可用素材:
    printf("Please input string: ");
    printf("\nshu zi ge shu wei: …);
    printf("\nshu zi wei: …);
  程序的运行效果应类似地如图1所示,图1中的gfaskl45623cvsac,53dwafl faf32535as3bf0是从键盘输入的内容。

Please input string: gfaskl45623cvsac,53dwafl faf32535as3bf0

shu zi ge shu wei: 14
shu zi wei: 45623533253530
图1 程序运行效果示例
*/

#include <stdio.h>
#include <string.h>
#define N 127

int main(void)
{
    char str[N];
    char strData[N] = {'\0'};
    int i, j = 0;

    printf("Please input string: ");
    gets(str);

    for (i = 0; i < (int)strlen(str); i++)  // 注意,这样的写法,效率很差,因为strlen是跑一个循环后给结果
    {
        if (str[i] >= '0' && str[i] <= '9')
        {
            strData[j++] = str[i];
        }
    }

    printf("\nshu zi ge shu wei: %d", (int)strlen(strData));
    printf("\nshu zi wei: %s", strData);

    return 0;
}

P220

在这里插入图片描述

/*
 编写一程序P220.C实现以下功能
  从键盘读入一行字符(约定:字符数≤127字节),统计及输出其中的字母、数字、空格和其他符号的个数。
    编程可用素材:
    printf("Please input string: ");
    printf("\nzimu=…,shuzi=…,kongge=…,qita=…\n"…);
  程序的运行效果应类似地如图1所示,图1中的红色部分是从键盘输入的内容。

Please input string: gfAskl45623cvsac,53Dwafl faf32535

zimu=19,shuzi=12,kongge=1,qita=1
图1 程序运行效果示例
*/

#include <stdio.h>

#include <stdio.h>
#include <string.h>
#define N 127

int main(void)
{
    char str[N];
    int i;
    int zimu = 0, shuzi = 0, kongge = 0, qita = 0;

    printf("Please input string: ");
    gets(str);

    // 统计及输出其中的字母、数字、空格和其他符号的个数
    for (i = 0; i < (int)strlen(str); i++)
    {
        if (str[i] >= '0' && str[i] <= '9')
        {
            shuzi++;
        } else if ( (str[i] >= 'a' && str[i] <= 'z') || (str[i] >= 'A' && str[i] <= 'Z'))
        {
            zimu++;
        } else if (str[i] == ' ')
        {
            kongge++;
        }
        else
        {
            qita++;
        }
        
    }

    printf("\nzimu=%d,shuzi=%d,kongge=%d,qita=%d\n", zimu, shuzi, kongge, qita);

    return 0;
}

P221

在这里插入图片描述

/*
 编写一程序P221.C实现以下功能
  从键盘读入一个字符串(约定:字符数≤127字节),检查该字符串是否是回文。所谓回文即正向与反向的拼写都一样,例如:adgda。
    编程可用素材:
    printf("Please input string: ");
    printf("\n… shi hui wen.");
    printf("\n… bu shi hui wen.");
  程序的运行效果应类似地如图1和图2所示,图1中的asdfghjhgfdsa和图2中的asdfghjhgfdsaa是从键盘输入的内容。

Please input string: asdfghjhgfdsa

asdfghjhgfdsa shi hui wen.
图1 程序运行效果示例(回文)

Please input string: asdfghjhgfdsaa

asdfghjhgfdsaa bu shi hui wen.
图2 程序运行效果示例(非回文)
*/

#include <stdio.h>
#include <string.h>
#define N 127

int main(void)
{
    char str[N];
    int i;
    int flag = 1; // 假设是回文
    int length;

    printf("Please input string: ");
    gets(str);
    length = (int)strlen(str); //这是一种遍历得结果的函数,外置,只做一次,效率更高

    // 业务判断
    for (i = 0; i < length / 2; i++)
    {
        /* 
            这里用的算法:
                1. 从串首开始,i正向增长
                2. 从串尾开始,length - 1 - i负向增长
                3. 回文则必然相同,若不同,则不是回文
            注意:
                串最后一个字符,索引值是“长度减1”    
         */
        if (str[i] != str[length - 1 - i]) 
        {
            flag = 0; // 不是回文标记
            break;
        }
    }

    // 业务输出
    if (flag)
    {
        printf("\n%s shi hui wen.", str);
    }
    else
    {
        printf("\n%s bu shi hui wen.", str);
    }

    return 0;
}

P222

在这里插入图片描述

/*
  编写一程序P222.C实现以下功能
  从键盘上读入一行字符(约定:字符数≤127字节),按以下方法将其加密变换:
    A->Z    a->z
    B->Y    b->y
    C->X    c->x
    ……    ……
    Z->A    z->a
  即字母A变成Z、字母B变成Y、…,非字母字符不变。最后在屏幕上先显示这一行字符的长度,再显示生成的密文。
  编程可用素材:
    printf("Please input string: ");
    printf("\nzi fu chuan chang du: …);
    printf("\nmi wen: …);
  程序的运行效果应类似地如图1所示,图1中的sfasfk,lmw4tywerysfcvasgewr xfasftg是从键盘输入的内容。

Please input string: sfasfk,lmw4tywerysfcvasgewr xfasftg

zi fu chuan chang du: 35
mi wen: huzhup,ond4gbdvibhuxezhtvdi cuzhugt
图1 程序运行效果示例

友情提示:
    注意引入函数的顺序
        【1】函数声明
        【2】函数实现
        【3】函数调用
*/

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


#define N 127

void alphaEncipher(char s[],int len);   // 【1】函数声明

int main(void)
{
    char str[N];
    int length;

    // 输入
    printf("Please input string: ");
    gets(str);

    // 求长度
    length = (int)strlen(str);
    printf("\nzi fu chuan chang du: %d", length);

    // 调用功能函数,实现加密
    alphaEncipher(str, length); // 【3】函数调用

    // 输出密文
    printf("\nmi wen: ");
    puts(str);

    return 0;
}

/* 
    逐个字母加密功能 【2】函数实现
 */
void alphaEncipher(char s[],int len)
{
    char cl[26], sl[26];    // 密码表
    int i, j, k;
    // 初始化密码表
    for (i=0, j='A', k='a'; i<26; cl[i]=j++, sl[i]=k++, i++);
    /* 
        上面的代码,也可以写成如下形式:
        for (i=0, j='A', k='a'; i<26; i++)
        {
            cl[i]=j++;
            sl[i]=k++;
        }

        读解:
            1. 最上面的代码是一种简洁形式,但不易读
            2. i控制循环次数
            3. j,k在自增过程中完成码表赋值
     */

    // 逐个字符变换
    for (i=0; i<len; i++)       // 外层循环,遍历每一个字符
        // 对每一个字母【 A-Z  or a-z 】进行转换,非字母字符不变。
        for (j=0; j<26; j++){   // 内层循环,查密码表,进行字符转换【A-->Z,B-->Y,...,Z-->A,小写亦然如斯】
            if (s[i]==cl[j]){   // 大写字母表
                s[i]=cl[25-j]; 
                break;
            }
            if (s[i]==sl[j]){   // 小写字母表
                s[i]=sl[25-j]; 
                break;
            }
        }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值