标签:时间 复杂 字符 一个 字符数组 结果 代码 gets 运算
题目
中国文化博大精深,从仓颉造字开始,汉字一直流传到了今天。我们在感叹汉字的源远流长时,也不禁感慨,为什么没有一门使用汉字编程的语言?
汉字真的不能编程吗?最近文言文编程火了一把,吾有一數。曰三。名之曰「甲」。这朴实无华的变量定义无疑不是几千年来中华文化的发展中一朵奇葩。
今天小王同学想,文言文能编程那白话文呢?他找到了你,让你帮帮他。
编程要求
编写一个程序,输入满足以下语法要求的一段文字,输出运行后的结果。
变量定义:整数 钱包 等于 零
运算(加法):钱包 增加 四
运算(减法):钱包 减少 四
输出:看看 钱包
样例
输入:
整数 钱包 等于 零
钱包 增加 四
钱包 减少 三
看看 钱包
输出:
一
题目中要求的数据范围是零到九十九,所以思路感觉很楞了,数据范围再大一点,这么楞的思路感觉就很难做了
主要难点感觉在中文转化成数字以及中文输入对数字运算的影响
中文转化成数字:
我先定义一个变量,再定义一个函数将输入的汉字转化成数字存入该变量
函数如下:
int chinese(char *c)
{
char a[5];
strcpy(a,c);
if(!strcmp(a,"一"))return 1;
else if(!strcmp(a,"二"))return 2;
else if(!strcmp(a,"三"))return 3;
else if(!strcmp(a,"四"))return 4;
else if(!strcmp(a,"五"))return 5;
else if(!strcmp(a,"六"))return 6;
else if(!strcmp(a,"七"))return 7;
else if(!strcmp(a,"八"))return 8;
else if(!strcmp(a,"九"))return 9;
else if(!strcmp(a,"十"))return 10;
else return 0;
}
因为一个汉字不止一个字节,而且char字符定义的数组仅为1个字节,这个对于我又是一个难点,导致我很难将字符串输入进数组的汉字单独拉出来判断。
然后我查了百度....发现了strcmp这个函数能让我对字符串中的汉字进行判断。
将汉字转化成数字储存在一个变量中,再将变量导入另一个函数中,转化成汉字输出
函数如下:
void arab(int n)
{
if(n>10){
if(n/10!=1){
switch(n/10)
{
case 1:printf("一");break;
case 2:printf("二");break;
case 3:printf("三");break;
case 4:printf("四");break;
case 5:printf("五");break;
case 6:printf("六");break;
case 7:printf("七");break;
case 8:printf("八");break;
case 9:printf("九");break;
}
}
printf("十");
switch(n%10)
{
case 1:printf("一");break;
case 2:printf("二");break;
case 3:printf("三");break;
case 4:printf("四");break;
case 5:printf("五");break;
case 6:printf("六");break;
case 7:printf("七");break;
case 8:printf("八");break;
case 9:printf("九");break;
}
}
else{
switch(n)
{
case 1:printf("一");break;
case 2:printf("二");break;
case 3:printf("三");break;
case 4:printf("四");break;
case 5:printf("五");break;
case 6:printf("六");break;
case 7:printf("七");break;
case 8:printf("八");break;
case 9:printf("九");break;
case 10:printf("十");break;
}
}
其中有一个比较麻烦的是对于一位数和两位数的判别,但用if语句对数的大小进行判断,对语句进行复制粘贴,也不会太耗时间和精力
接下来这个是最让我头疼的....
如果输入的数据为两位数的话,就会将汉字的判断弄得更复杂,一个汉字在一个字符数组中占两个位置,而将他转化为数字计算的时候需要将十位上的数字和个位上的数字分别判断,这两个要在字符数组中分开判断我是真不知道怎么弄,于是我又查了百度....strncmp和strncpy这两个函数解决了问题...
以下是全代码及运行结果:
int main()
{
int chinese(char c);
void arab(int n);
int purse;
char s[25],a[5]="钱包",b[10],c[10],d[5];
gets(s);
purse=chinese(&s[15]);
while(strcmp(a,"钱包")==0){
scanf("%s",a);
scanf("%s",b);
if(!strcmp(a,"看看"))break;
scanf("%s",c);
if(!strcmp(b,"增加")&&strncmp(&c[2],&s[15],4)>=0){strncpy(d,c,2);purse=purse+chinese(&d[0])10+chinese(&c[4]);}
else if(!strcmp(b,"增加")&&strncmp(&c[2],&s[15],4)<0)purse=purse+chinese(&c[0]);
else if(!strcmp(b,"减少")&&strncmp(&c[2],&s[15],4)>=0){strncpy(d,c,2);purse=purse-chinese(&d[0])10-chinese(&c[4]);}
else purse=purse-chinese(&c[0]);
printf("%d\n",purse);
}
arab(purse);
return 0;
}
int chinese(char c)
{
char a[5];
strcpy(a,c);
if(!strcmp(a,"一"))return 1;
else if(!strcmp(a,"二"))return 2;
else if(!strcmp(a,"三"))return 3;
else if(!strcmp(a,"四"))return 4;
else if(!strcmp(a,"五"))return 5;
else if(!strcmp(a,"六"))return 6;
else if(!strcmp(a,"七"))return 7;
else if(!strcmp(a,"八"))return 8;
else if(!strcmp(a,"九"))return 9;
else if(!strcmp(a,"十"))return 10;
else return 0;
}
void arab(int n)
{
if(n>10){
if(n/10!=1){
switch(n/10)
{
case 1:printf("一");break;
case 2:printf("二");break;
case 3:printf("三");break;
case 4:printf("四");break;
case 5:printf("五");break;
case 6:printf("六");break;
case 7:printf("七");break;
case 8:printf("八");break;
case 9:printf("九");break;
}
}
printf("十");
switch(n%10)
{
case 1:printf("一");break;
case 2:printf("二");break;
case 3:printf("三");break;
case 4:printf("四");break;
case 5:printf("五");break;
case 6:printf("六");break;
case 7:printf("七");break;
case 8:printf("八");break;
case 9:printf("九");break;
}
}
else{
switch(n)
{
case 1:printf("一");break;
case 2:printf("二");break;
case 3:printf("三");break;
case 4:printf("四");break;
case 5:printf("五");break;
case 6:printf("六");break;
case 7:printf("七");break;
case 8:printf("八");break;
case 9:printf("九");break;
case 10:printf("十");break;
}
}
}
标签:时间 复杂 字符 一个 字符数组 结果 代码 gets 运算
原文地址:https://www.cnblogs.com/xiaoshengyaodiao/p/12236801.html