if(m%i==0)//如果m被2~m-1之间的任何整数整除
{flag=0;break;}//令flag=0,并退出内循环
if(flag)printf(“%d”,m);//如果flag=1,则m为素数,输出m
}
}
5.编制程序用辗转相除法求a和b的最大公约数。
算法为:
将较大的数放在变量a中,较小的数放在变量b中。
然后求a除以b的余数r。
如果r为0,则除数b即为最大公约数;否则,将b存入a,将r存入b,反复求a和b的余数r,直到余数r为0.
#include
voidmain()
{intr,a,b;
scanf(“%d%d”,&a,&b);
if(a>b)//若a>b,交换a,b
{r=a;a=b;b=r;}
r=a%b;//求a除以b的余数
while(r)//余数r不为0,继续求余数r
{a=b;b=r;r=a%b;}
printf(“%d\n”,b);
}
6.编制程序是用二分法求方程2x3-4x2+3x-6=0在区间[1,5]中的一个实根,并要求绝对误差不超过0.001。
算法为,假设在区间[m,n]中f(m)与f(n)异号。
先取区间的中点r,如果|f(r)|<0.001,则r是方程的近似根;否则,若f(r)与f(m)异号,则取新的解区间为(m,r),反之取新的解区间为(r,n)。
不断对解区间对分,直到解区间已经小于给定的误差时,取该区间的中点作为解的近似值。
#include
#include
floatf(floatx){return2*x*x*x-4*x*x+3*x-6;}//自定义函数
voidmain()
{floatm=1.n=5,r;
r=(m+n)/2;//区间对分
while(fabs(f(r))>=0.001)
{if(f(r)*f(m)>0)m=r;//确定新的解区间
elsen=r;
r=(m+n)/2;//得到解的近似值
}
printf(“Answeris%6.3f\n”,(m+n)/2);//输出解的近似值
}
第五章(王娟勤)
【5-1-4】
#include
main()
{
inti,a[10];
for(i=9;i>=0;i--)
a[i]=10-i;//从此处可以看出下标是i的元素中放的数据是10-i
printf("%d%d%d",a[2],a[5],a[8]);
}
【5-1-9】
设已定义chars[]="\"abcd\\English\"\n";则字符串s所占的字节数是______________。
A.19B.18C.15D.14
解释:
\"为一个转意字符,代表一个",\\代表字符\,\n代表回车换行。
【5-1-10】
考察的内容是数组初始化,定义时不赋初值,第一维和第二维都不可省略,如有初始化,第一维的大小可省,但第二维的大小不能省。
【5-1-11】
#include
#include
main()
{
charw[][10]={"ABCD","EFGH","IJKL","MNOP"},k;
for(k=1;k<3;k++)
printf("%s\n",&w[k][k]);
}
解释:
用%s输出时,从给出的起始地址开始输出字符,直到遇到'\0',程序中第一次循环时,以&w[1][1]为起始地址,所以输出字符串"FGH",第二次循环时以&w[2][2]为起始地址,输出"KL"。
【5-1-12】
考察的内容是字符数组的初始化,用字符串和字符常量对字符数组的初始化时字符数组元素的个数不同,字符串初始化时,字符数组的元素个数等于字符串长度加1,字符常量初始化时,字符数组元素的个数与字符常量的个数相同。
【5-1-16】
#include
main()
{
chars[100];
intc,i;
scanf("%c",&c);//将输入的1作为字符接收
scanf("%d",&i);//将23作为整数接收
scanf("%s",s);//将456作为一个字符串接收,%s输入字符串时,以空格或回车做为字符串结束标志,停止接收。
printf("%c,%d,%s\n",c,i,s);
}
【5-1-18】
#include
main()
{charch[7]={"65ab21"};
inti,s=0;
for(i=0;ch[i]>='0'&&ch[i]<='9';i+=2)
s=10*s+ch[i]-'0';
printf("%d\n",s);
}
第一次循环,处理ch[0],其中存放’6’,’6’-‘0’值为6,故s的值为6
第二次循环,处理ch[2],其中存放’a’,使ch[i]>='0'&&ch[i]<='9'条件为假,循环终止。
所以打印输出6.
【5-1-19】
main()
{
chars[]="12134211";
intv1=0,v2=0,v3=0,v4=0,k;
for(k=0;s[k];k++)
switch(s[k])
{default:
v4++;
case'1':
v1++;
case'3':
v3++;
case'2':
v2++;
}
printf("v1=%d,v2=%d,v3=%d,v4=%d\n",v1,v2,v3,v4);
}
此题考查switch语句中default与case的顺序颠倒,而且没有break时开关语句的执行过程。
s[k]的值与case语句后面的常量表达式都不匹配时,执行default后面的语句,但default后面的语句没有break,所以会继续执行case‘1’,case‘3’,case‘2’,后面的语句;如果s[k]的值与case后面的常量表达式值其中一个匹配,则执行其后面的语句,由于没有break,所以会顺序执行后面case中的表达式的值。
【5-1-20】
main()
{
charst[20]="hello\0!
\t\\";
printf("%d,%d\n",strlen(st),sizeof(st));
}
所有的字符串处理函数都是从给出的起始地址开始处理字符串,直到遇到'\0';sizeof(st)是运算数组st所占字节数,为20。
【5-2-6】
将字符数组a中下标值为偶数的元素从小到大排列,其他的元素不变。
#include
#include
main()
{
chara[]="clanguage",t;
inti,j,k;
k=strlen(a);
for(i=0;i<=k-2;i+=2)//从下标是0的元素处理起,对下标是偶数的元素排序
for(j=i+2;jif(a[i]>a[j])//a[j]与a[i]比较,如果a[i]>a[j],则互换
{t=a[i];a[i]=a[j];a[j]=t;}
puts(a);
printf("\n");
}
课后编程题中1、2、3、4,补充实现两个字符串比较函数
1.求矩阵主、次对角线及四周元素之和。
程序代码:
#include
#defineN5
voidmain()
{inta[N][N],i,j,s1,s2,s3;
printf("Enterelementsofmatrixa,rowbyrow:
\n");
for(i=0;ifor(j=0;jscanf("%d",&a[i][j]);
s1=0;s2=0;s3=0;
for(i=0;is1+=a[i][i];
for(i=0;is2+=a[i][N-1-i];
for(i=0;is3=s3+a[i][0]+a[i][N-1];
for(j=1;js3=s3+a[0][j]+a[N-1][j];
printf("s1=%ds2=%ds3=%d\n",s1,s2,s3);
}
另解:
根据主、次对角线及四周元素特点做循环。
#include
#defineN5
voidmain()
{inta[N][N],i,j,s1,s2,s3;
for(i=0;i{
for(j=0;j{
a[i][j]=rand()%9+1;//为了调试方便用随机数生成元素值。
printf("%4d",a[i][j]);//同时输出各元素值。
}
printf("\n");//换行
}
s1=s2=s3=0;//给累加器赋初值
for(i=0;ifor(j=0;j{
if(i==j)s1+=a[i][j];//主对角线求和
if(i+j==N-1)s2+=a[i][j];//次对角线求和
if(i*j==0||i==N-1||j==N-1)s3+=a[i][j];//周边元素求和
//因为三类元素有可能有重复,所以用的是三个单分支选择结构,而不能用多分支选择。
}
printf("s1=%ds2=%ds3=%d\n",s1,s2,s3);
}
2.归并排序
#defineM5
#defineN4
#include
voidmain()
{inta[M],b[N],c[M+N],i,ia=0,ib=0,ic=0;
printf("Entertheelementofarraya:
\n");
for(i=0;iscanf("%d",&a[i]);
printf("Entertheelementofarrayb:
\n");
for(i=0;iscanf("%d",&b[i]);
while(ia{if(a[ia]<=b[ib])//比较数组a和b中当前元素的值,将元素值较小的赋给c,如此直到数组a和b扫描完毕。
c[ic++]=a[ia++];
else
c[ic++]=b[ib++];}
if(ia>=M)//如果a数组中的元素已归并完,将b数组中余下部分赋给c即可。
while(ibc[ic++]=b[ib++];
else//如果b数组中的元素已归并完,将a数组中余下部分赋给c即可。
while(iac[ic++]=a[ia++];
printf("Matrixa:
\n");
for(i=0;iprintf("%d",a[i]);
printf("\nMatrixb:
\n");
for(i=0;ipri