作为小小小小白,自学这本书,编写的程序可能会有很多需要改进的地方,希望大神们多提意见~谢谢
习题3-1 得分
#include <stdio.h>
#include <string.h>
#define max 100
int main()
{
int i,sum=0,n=0;
char a[max];
memset(a,0,max);
scanf("%s",a);
for(i=0;a[i]!='\0';i++)
{
if((a[i+1]==a[i])||(a[i]=='O'))
n++;
else n=0;
if(a[i]=='X')
n=0;
sum=sum+n;
}
printf("%d\n",sum);
return 0;
}
习题3-2 分子量
#include <stdio.h>
int main()
{
char s[30];
scanf("%s", s);
int i=0,C=0,H=0,O=0,N=0;
for(i;s[i]!='\0';i++)
{
if(s[i]=='C')
{
if((s[i+1]!='H')&&(s[i+1]!='O')&&(s[i+1]!='N')&&(s[i+1]!='\0'))
C=C+s[i+1]-'0';
else C++;
}
else if(s[i]=='H')
{
if((s[i+1]!='C')&&(s[i+1]!='O')&&(s[i+1]!='N')&&(s[i+1]!='\0'))
H=H+s[i+1]-'0';
else H++;
}
else if(s[i]=='O')
{
if((s[i+1]!='C')&&(s[i+1]!='H')&&(s[i+1]!='N')&&(s[i+1]!='\0'))
O=O+s[i+1]-'0';
else
O++;
}
else if(s[i]=='N')
{
if((s[i+1]!='C')&&(s[i+1]!='H')&&(s[i+1]!='O')&&(s[i+1]!='\0'))
N=N+s[i+1]-'0';
else
N++;
}
}
printf("%.3fg/mol\n",(C*12.01)+(H*1.008)+(O*16.00)+(N*14.01));
return 0;
}
依次查询CHON,如果紧接的不是原子名或字符结尾,则就是数字。如果紧接的是原子名或字符结尾,这个原子个数本身+1.
编程的时候遇到的一些问题,比如没有注意到结尾的\0,还有逻辑上的与或最开始写的时候没写对。看来编程的时候还是要按步骤不能怕麻烦,不然自己就晕了。
习题3-3 数数字
#include <stdio.h>
int main()
{
char s[10100];
scanf("%s",s);
int i=0,a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0;
for(i;s[i]!='\0';i++)
{
switch(s[i]-'0')
{
case 0: a++;continue;
case 1: b++;continue;
case 2: c++;continue;
case 3: d++;continue;
case 4: e++;continue;
case 5: f++;continue;
case 6: g++;continue;
case 7: h++;continue;
case 8: j++;continue;
case 9: k++;continue;
}
}
printf("%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n",a,b,c,d,e,f,g,h,j,k);
return 0;
}
好久不用switch语句了,复习一下。注意字符串中数字和整型数字并不是一样的。
习题3-4 周期串
#include <stdio.h>
#include <string.h>
#define max 1000
int main()
{
char s[max];
memset(s,0,sizeof(s));
scanf("%s",s);
int k=1,i,len=strlen(s);
for(k;k<=(len/2);k++)
{
if(len%k==0)
{
for(i=0; i<len; i++)
{
if(s[i]!=s[i%k])
break;
}
if(i==len)
{printf("%d\n",k);
break;}
}
}
return 0;
}
开始想用字符串连接strcat求与原来的相等,没成功。
后来得知了这个周期的暴力求解法,很好用!又学会了一招。
注意这个题里break的使用。