第八章 习题
8.3 判断一个数是否为素数
int prime( int n )
{ int i,k,flag=1 ;
k=sqrt(n);
for(i=2 ; i<=k ; i++)
if(n%i==0)
{ flag=0 ;
break ;
}
return(flag);
}
#include <stdio.h>
#include <math.h>
int prime( int n ) ;
void main( )
{ int m,p;
printf(“\n input a number:”);
scanf(“%d”,&m);
p=prime(m);
if (p==1)
printf(“the number is a prime.”);
else
printf(“the number is not a prime.”);
}
8.5 使输入字符串按反序存放。
#include <stdio.h>
void daozhi(char s[20])
{ char s2[20]; int i,n;
for(i=0;s[i]!='\0';i++) ;
n=i; //n为字符串长度
for(i=0;i<n;i++)
s2[n-i-1]=s[i]; //将 s反序存入 s2
for(i=0;i<n;i++)
s[i]=s2[i]; //将 s2复制到 s中
}
void main()
{ char s1[20];
printf("\ninput a string:");
gets(s1); //输入一行字符串 s1
daozhi(s1); //将 s1反序
puts(s1); //输出字符串 s1
}
8.10 输入一行字符串,将最长单词输出思路:找长度最大的单词,必须记录每一个单词的字母个数,取最大值;并将找到的单词输出。
步骤:
主程序,1、从键盘上输入一行字符,存入一字符数组 str中;
2、调用一函数 maxstr(),得到字符串中长度最大的单词;
3、将结果输出。
函数 maxstr(),1、设一个变量 len存放最长单词的长度,其初始值为 0;
2、从字符串最左边开始,获得每一个单词的长度(即遇到一个空格时,其前面为一个单词,用一个变量记录单词长度),与 len比较,若大于,则将其值赋予 len,将此单词传送给另一数组 str1;循环直到整个字符串执行完为止。
在此最好将 str1定义为全局变量,使得在函数 maxstr()中得到的值,
在主程序中也可以使用。
#include <stdio.h>
#include <string.h>
char str1[10]; //定义全局变量数组 str1,用于存放最长单词
maxstr(char a[50],int n) ; //函数声明
viod main( )
{ char str[50];
int dlen ;
printf("\n input a string:");
gets(str); //输入一行字符串 str
dlen=strlen(str); //求出 字符串 str的长度
maxstr(str,dlen); //调用函数求最长单词
printf("\nThe max word=");
puts(str1); //输出最长单词
}
for(m=i-j;m<=i;m++)
{ str1[x]=a[m];
x++;
}
//将较长单词存入 str1中
str1[x]='\0';
}
i++;
}
}
maxstr(char a[50],int n)
{ int i,len,j,m,x;
len=0; i=0;
while(i<=n)
{ j=0;
while((a[i]!=' ')&&(i<=n))
{ j++; i++; }
// 计算单词长度 j
if (j>len)
{ len=j;
x=0;
8.13求递归公式
#include <stdio.h>
int p(int n,int x)
{ if(n==0)
return(1)
else
if(n==1)
return(x)
else
return(((2*n-1)*x-p(n-1,x)-(n-1)*p(n-2,x))/n);
}
void main()
{ int n,x,y;
printf(“\n input n,x:”);
scanf(“%d%d”,&n,&x);
y=p(n,x);
printf(“p(n,x)=%d”,y);
}
第十章习题 10.4 将前面各数顺序后移 m个位置,最后 m个数变成最前面 m个数。
分析:可以另外定义一个数组 b,先将原数组 a中后 m个数复制到数组 b中,
再将原数组 a中的前( n-m)个数,依次后移 m位,然后再将 b数组中的 m个数复制到数组 a中的前 m个元素中。程序代码如下:
#include <stdio.h>
void houyi(int a[ ],int n,int m);
viod main( )
{ int n,m,i,a[9],;
n=9;m=3; /*将长度为 9的数组 a中的后 3个数进行前移 */
printf(“\n input 9 numbers:");
for(i=0;i<9;i++) /*先将处理前的数组的原始状态输出 */
scanf(“%d”,&a[i]);
houyi(a,n,m);
printf(“\n ouput 9 numbers:");
for(i=0;i<9;i++) /*先将处理后的数组的状态输出 */
printf(“%4d”,a[i]);
}
void houyi(int a[ ],int n,int m);
{ int b[10],*p,*q;
p=b; /*辅助数组 b的起始位置 */
for(q=a+n-m;q<a+n;q++,p++)
*p=*q; /*将原数组 a中后 m个数复制到数组 b中 */
for(q=a+n-m;q>=0;q- -)
*(q+m)=*q; /*将原数组 a中的前 (n-m)个数,复制到数组 b中 */
for(p=b,q=a;p<b+m;p++,q++)
*q=*p; /*将 b数组中的 n个数复制到数组 a中 */
}
#include <stdio.h>
int strcmp(char *p1,char *p2)
//自定义函数 strcmp进行两字符串的比较
{ while((*p1!='\0')&&(*p2!='\0'))
{ if (*p1==*p2) {p1++; p2++;} //若字符相等则比较下一个
else return(*p1-*p2); //否则返回两字符的差
}
if(*p1=='\0')
if(*p2==?\0?) return(0); //若两字符串各字符相等并长度一样,则两字符串相等
else return(-1); //若两字符串各字符相等但 p2比 p1长,则
p1<p2
else
return(1); // 若两字符串各字符相等但 p1比 p2长则 p1>p2
}
10.17 写一个函数,实现两个字符串的比较。
void main()
{ char s1[50],s2[50]; int x;
printf("\ninput s1:"); gets(s1);
printf(“input s2:”); gets(s2); //输入两个待比较的字符串
x=strcmp(s1,s2); //调用函数 strcmp比较两个字符串
if(x==0) //若返回值为 0,则两字符串相等
printf("s1=s2");
else
if(x>0) //若返回值大于 0,则 s1>s2
printf("s1>s2");
else // 若返回值小于 0,则 s1<s2
printf("s1<s2");
}
第十一章习题 11.3打印学生成绩
#include <stdio.h>
# define N 5
struct student
{ int num;
char name[10];
float score[3];
} ;
void print(struct student a[N])
{ int i;
for(i=0;i<5;i++)
printf(“%d,%s,%f,%f,%f),a[i].num,
a[i].name,a[i].score[0],a[i].score[1],
a[i].score[2]);
}
viod main( )
{ int i,j;
struct student stu[N];
printf(“\n input student?s data:”);
for(i=0;i<5;i++)
{ scanf(“%d”,& a[i].num);
scanf(“%s”,a[i].name);
for (j=0;j<3;j++)
scanf(“%f”,a[i].score[j],);
}
print(stu);
}
11.5 求 10个学生的总平均成绩以及最高分学生的信息
#include <stdio.h>
struct stud
{ int num;
char name[10];
float s1,s2,s3,ave;
};
viod main()
{ struct stud s[10];
int i,k;
float sum,aver,max;
for(i=0;i<10;i++) //输入 10个学生信息
{scanf(“%d”,&s[i].num);
gets(s[i].name);
scanf(“%f%f%f”,&s[i].s1,&s[i].s2,&s[i].s3);
s[i].ave=(s[i].s1+ s[i].s2+ s[i].s3)/3;
}
sum=0; max=s[0].ave; k=0;
for(i=0;i<10;i++)
{ sum=sum+s[i].ave;
if(max< s[i].ave)
{ max= s[i].ave;
k=i; }
aver=sum/10;
printf(“\n%f”,aver); //输出总平均成绩
printf(“%d”,s[k].num); //输出最高分学生数据
}