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;
}
}
}