任务代码:
【项目1-M$pszi$y是嘛意思?】
背景:小明让同学传纸条给小丽。小丽接到会心一笑,大家却不知所云。纸条上写着M$pszi$y,两人暗中约定是,真实字符为实际字符前面的第4个!M$pszi$y是神马意思?推算一下,或从ASCII码表中查一下,自然是I love u。
(1)小明请你写一个程序,在给小丽写情书时,再不用费功夫自己“翻译”,原信中每一个字符加密为其后的第4个字符。例,输入I love u,输出M$pszi$y。
(2)小丽请你写一个程序,在看小明的情书时,让程序帮着“解密”。因为有同学知道了他们俩人的“加密”手段,决定纸条由人传,加密数字(1-9)用两人约好的手势传,所以解密时,需要将加密数字作为程序输入。例,输入M$pszi$y(回车)4,输出I love u
(3)小刚常帮着传纸条,想知道俩人的秘密,但不知道加密数字,于是写了一个程序,可以列出所有可能的情况。例,输入M$pszi$y,多行输出中必然有一行是I love u。你就是小刚,写出这个程序来吧。
执行情况:
(1)
#include <stdio.h>
int main()
{
char str1[50],str2[50];
printf("请输入原句:");
gets(str1);
//Encryption
int i=0,j=0;
while(str1[i]!='\0')
{
str2[j]=str1[i]+4;
j++;
i++;
}
//output
printf("加密后的字符串是:");
puts(str2);
return 0;
}
#include<stdio.h>
int main()
{
char s[80], t[80];
int i;
gets(s);
for(i=0; s[i]!='\0'; i++)
{
t[i] = s[i]+4;
}
t[i] = '\0'; //此时i为?
printf("%s\n", t);
return 0;
}
(2)
#include <stdio.h>
int main()
{
char str1[50],str2[50];
printf("请输入你想要的解密的语句:");
gets(str1);
//decrypt
int i,j=0;
for(i=0;str1[i]!='\0';i++)
{
str2[j++]=str1[i]-4;
}
//output
printf("输出解密后的语句:");
puts(str2);
return 0;
}
答案写法:
#include<stdio.h>
int main()
{
char s[80], t[80];
int i, n;
printf("输入待解密句子:");
gets(s);
printf("输入加密数字:");
scanf("%d", &n);
char *pt = t; //指针法访问数组
for(i=0; *(s+i)!='\0'; i++,pt++) //指针法访问数组
{
*pt = s[i]-n;
}
*pt = '\0';
printf("%s\n", t);
return 0;
}
(3)
#include<stdio.h>
void decrypt(char [],char [],int);
int main()
{
char s[80], t[80];
int num;
printf("输入待解密句子:");
gets(s);
//decrypt
for(num=0;num<10;num++)
{
decrypt(s,t,num);
printf("第%d种解密:%s\n", num+1,t);
}
return 0;
}
void decrypt(char *s,char *t,int num)
{
char *pt = t;
int i;
for(i=0; *(s+i)!='\0'; i++,pt++)
{
*pt = s[i]-num;
}
*pt = '\0';
}
或者子方程可以改成(*s ,*t 已经是指向数组的指针):
void decrypt(char *s,char *t,int num)
{
int i;
for(i=0; *(s+i)!='\0'; i++)
{
*(t+i)= s[i]-num;
}
*(t+i)= '\0';
}
答案写法:
#include<stdio.h>
int main()
{
char s[80], t[80], *pt;
int i, n;
printf("输入待解密句子:");
gets(s);
for(n=1; n<9; n++)
{
pt = t;
for(i=0; *(s+i)!='\0'; i++,pt++)
{
*pt = s[i]-n;
}
*pt = '\0';
printf("%s\n", t);
}
return 0;
}
【项目2-字符统计】
下面的程序可以统计出一个字符串中数字字符的个数:
#include <stdio.h>
int main()
{
char str[50];
int i=0,n=0;
printf("输入字符串:");
gets(str);
while(str[i]!='\0')
{
if(str[i]>='0'&&str[i]<='9') n++;
i++;
}
printf("其中的数字个数是: %d\n", n);
return 0;
}
请分别编制程序,完成下面的处理:
(1)统计字母'A'出现的次数;
(2)统计字符串中(大/小写)字母个数;
(3)统计每一个元音字母个数
(4)统计每一个数字字符出现的次数;
提示:可以定义一个数组int a[10],保存’0’-’9’在字符串中出现的次数(例a[0]表示字符’0’的个数)
(5)统计每一个字母出现的个数
#include <stdio.h>
#include <ctype.h>
int Anum(char *);//统计A的个数
void BSletter(char *);//统计大小写字母的个数
void VowelNum(char *);//统计每个元音字母的个数
void NumCount(char []);//统计每个数字字符的个数
void alphaCount(char []);//统计每个字符出现的个数
int main()
{
char str[50];
int i=0,n=0;
printf("输入字符串:");
gets(str);
while(str[i]!='\0')
{
if(str[i]>='0'&&str[i]<='9') n++;
i++;
}
printf("其中的数字个数是: %d\n", n);
//统计A的个数
int num;
num=Anum(str);
printf("其中A出现的次数是%d。\n",num);
//统计大小写字母的个数
BSletter(str);
//统计每一个元音字母
VowelNum(str);
//统计数字字符的个数
NumCount(str);
//统计每个字母出现的个数
alphaCount(str);
return 0;
}
int Anum(char *s)
{
int i,num=0;
for(i=0;*(s+i)!='\0';i++)
{
if(*(s+i)=='A')
num++;
}
return num;
}
void BSletter(char *s)
{
int i,lowernum=0,uppernum=0;
for(i=0;*(s+i)!='\0';i++)
{
if(islower(*(s+i))) lowernum++;
if(isupper(*(s+i))) uppernum++;
}
printf("大写字母个数:%d\n",uppernum);
printf("小写字母个数:%d\n",lowernum);
}
void VowelNum(char *s)
{
int i;
char str[50];//用于装全部转换为小写字母字符串
int VowelNum[5]={0};//设置一个数组来装元音字母,a,e,i,o,u;
for(i=0;*(s+i)!='\0';i++)
{
str[i]=tolower(*(s+i));//全部转换为小写字母
}
//统计
int j;
for(j=0;j<i;j++)
{
if(str[j]-'a'==0)
VowelNum[0]+=1;
else if(str[j]-'e'==0)
VowelNum[1]+=1;
else if(str[j]-'i'==0)
VowelNum[2]+=1;
else if(str[j]-'o'==0)
VowelNum[3]+=1;
else if(str[j]-'u'==0)
VowelNum[4]+=1;
}
printf("字符串中总共有a,e,i,o,u元音字母个数分别是:%d,%d,%d,%d,%d\n",VowelNum[0],VowelNum[1],VowelNum[2],VowelNum[3],VowelNum[4]);
}
void NumCount(char s[])
{
int num[10]={0},i;//注意这里的初始化很重要
for(i=0;s[i]!='\0';i++)
{
if(s[i]>='0' && s[i] <= '9' )
{
num[s[i]-'0']++;//使用技巧动态分配数组在数组中的储存
}
}
printf("每个数字的个数分别是:\n");
int j=0;
while(j<10)
{
printf("\'%d\'---%d\n",j,num[j]);//双引号中的单引号是 \'
j++;
}
printf("\n");
}
void alphaCount(char s[])
{
int Upletter[26]={0},Lowerletter[26]={0},i;//注意这里的初始化很重要
for(i=0;s[i]!='\0';i++)
{
if(s[i]>'a' && s[i] <= 'z' )
{
Lowerletter[s[i]-'a']++;//动态储存小写字母
}
else if(s[i]>'A' && s[i]<='Z')
{
Upletter[s[i]-'A']++;//动态储存大写字母
}
}
//output
printf("小写字母部分:\n");
int m=0,n=0;
while(m<26)
{
if(Lowerletter[m]!=0)
printf("\'%c\'---%d\n",(char)(m+97),Lowerletter[m]);//方法1 表示
m++;
}
printf("\n");
printf("大写字母部分:\n");
while(n<26)
{
if(Upletter[n]!=0)
printf("\'%c\'---%d\n",n+'A',Upletter[n]);//方式2 表达
n++;
}
}
【项目3-字符串复制】
下面的程序,将str1中除空格外的所有字符,复制到了str2中。
#include <stdio.h>
#include <string.h>
int main()
{
char str1[100]="I am a happy boy\'s daddy.",str2[100];
int i=0,j=0;
while(str1[i]!='\0')
{
if(str1[i]!=' ')
{
str2[j]=str1[i];
j++;
}
i++;
}
str2[j]='\0';//切记!!
printf("去除空格后的字符串: %s\n", str2);
return 0;
}
请分别编制程序,完成下面的处理:
(1)完整复制字符串;
(2)将str1和str2接起来存放到str3中;
(3)去除str4中的空格,仍保存在str4中;(str4字符串和str1一样)
(4)将str1和str2连接起来,仍存放在str1中;
自己的代码:
#include <stdio.h>
#include <string.h>
int main()
{
char str1[100]="I am a happy boy\'s daddy.",str2[100];
//字符串复制
strcpy(str2, str1);
printf("复制后的str2中的字符串是:%s\n",str2);
//字符串连结
char str3[100];
strcat(str1, str2);//将str1连结到str2后面,返回str1
strcpy(str3,str1);
printf("连结后存储在str3中的字符串是:%s\n",str3);
//去除str4中的空格,仍保存在str4中;
char str4[100]="I am a happy boy\'s daddy.";
int i=0;
while(str4[i]!='\0')
{
if(str4[i]==' ')
str4[i]=str4[i+1];
i++;
}
printf("去掉空格后的str4是:%s\n",str4);
//将str1和str2连接起来,仍存放在str1中;
strcat(str1, str2);
printf("将str1和str2链接起来后任然存在str1中:%s\n",str1);
return 0;
}
答案代码:
(1)
#include <stdio.h>
int main()
{
char str1[100]="I am a happy boy\'s daddy.",str2[100];
int i,j;
for(i=0,j=0; str1[i]!='\0'; i++)
{
str2[j]=str1[i];
++j;
}
str2[j]='\0';//切记!!
printf("复制后的字符串: %s\n", str2);
return 0;
}
#include <stdio.h>
int main()
{
char str1[100]="I am a happy boy\'s daddy.",str2[100];
int i=0,j=0;
while((str2[j++]=str1[i++])!='\0');//如此表达式!循环体为空,自左向右运算
printf("复制后的字符串: %s\n", str2);
return 0;
}
(2)
#include <stdio.h>
int main()
{
char str1[20]= {"int i,a[100];"};
char str2[20]= {"//注释: 定义变量"};
char str3[40];
int i=0,j=0;
while(str1[j]!='\0') //复制str1
{
str3[i++]=str1[j++];
}
j=0; //下面复制str2
while(str2[j]!='\0')
{
str3[i++]=str2[j++];
}
str3[i]='\0'; //一定要保证str3中有'\0'
printf("处理后的字符串是: %s\n", str3);
return 0;
}
(3)
#include <stdio.h>
int main()
{
char str[40]= {"I am a boy."};
int i=0,j=0;
while(str[j]!='\0') //找到str的结束
{
if(str[j]!=' ')
str[i++]=str[j++]; //如果str[i]不是空格,将复制
else
j++; //str[j]为空格时,没有进行复制
//j++而没有i++,所以只要有空格,j的值一定会大于i的
//不管是否有空格,j一直勇往直前,i则遇空格就休息
}
str[i]='\0'; //str[i]处是复制结束后的位置
printf("处理后的字符串是: %s\n", str);
return 0;
}
(4)
#include <stdio.h>
int main()
{
char str1[40]= {"I am a boy."};
char str2[20]= {"//注释: 废话一句"};
int i=0,j=0;
while(str1[i]!='\0') //找到str1的结束
{
i++;
}
j=0; //下面复制str2
while(str2[j]!='\0')
{
str1[i++]=str2[j++];
}
str1[i]='\0'; //一定要保证str1中有'\0'
printf("处理后的字符串是: %s\n", str1);
return 0;
}