C程序-计算机程序设计学习指导与练习答案(贾伯琪编 中国科学技术大学出版社)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
P80 1:
#include
int main()
{
printf("* * * * * * * * * * * * * * * * * * * * * *\n");
printf(" Very Good!\n");
printf("* * * * * * * * * * * * * * * * * * * * * *\n");
return 0;
}
P80 2:
#include
#define PI 3.1416
int main()
{
double R,H,V;
printf("请输入圆柱体的底面半径R和高度H:\n");
scanf("%lf%lf",&R,&H);
V=PI*R*R*H;
printf("圆柱体体积为:\n%lf\n",V);
return 0;
}
P104 2:
#include
#include
int main()
{
double a,b,c,p,area;
printf("请输入三角形的三条边长:\n");
scanf("%lf%lf%lf",&a,&b,&c);
p=(a+b+c)/2.0;
if(a>0&&b>0&&c>0&&a+b>c&&a+c>b&&b+c>a)
{
area=sqrt(p*(p-a)*(p-b)*(p-c));
printf("三角形的面积为:\n%lf\n",area);
}
else
printf("数据输入错误!\n");
return 0;
}
P104 3:
#include
int main()
{
int kgs=0,zbfs=0,hhfs=0;
char a;
printf("请输入正文(以Ctrl+Z结束):\n");
while((a=getchar())!=EOF)
{
if(a==32)
kgs++;
if(a==9)
zbfs++;
if(a==10)
hhfs++;
}
printf("输入的正文中空格数为%d,制表符数为%d,换行符数为%d\n",kgs,zbfs,hhfs);
}
P104 4:
#include
int main()
{
double x,fx;
printf("请输入x的值:\n");
scanf("%lf",&x);
if(x<0&&x!=-3)
fx=x*x+x-6;
else
if(x>=0&&x<10&&x!=2&&x!=3)
fx=x*x-5*x+6;
else
fx=x*x-x-1;
printf("函数值f(x)为:\n%lf\n",fx);
return 0;
}
P105 5:
#include
int main()
{
int score,k;
printf("请输入一个整型百分制成绩:\n");
scanf("%d",&score);
if(score<0||score>100)
printf("数据输入错误!\n");
else
k=score/10;
switch(k)
{
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:printf("百分制成绩%d对应的等级为E\n",score);break;
case 6:printf("百分制成绩%d对应的等级为D\n",score);break;
case 7:printf("百分制成绩%d对应的等级为C\n",score);break;
case 8:printf("百分制成绩%d对应的等级为B\n",score);break;
case 9:
case 10:printf("百分制成绩%d对应的等级为A\n",score);break;
}
return 0;
}
P105 6:
#include
int main()
{
int year;
printf("请输入年份:\n");
scanf("%d",&year);
if(year%4==0&&year%100!=0||year%400==0)
printf("%d年是闰年\n",year);
else
printf("%d年不是闰年\n",year);
return 0;
}
P105 8:
#include
int main()
{
char character;
printf("请输入一个字母字符:\n");
scanf("%c",&character);
if(character>='a'&&character<='z')
character=character-32;
switch(character)
{
case 'A':
case 'E':
case 'I':
case 'O':
case 'U':printf("Yes!\n该字母的大写ASCII码为%d:,小写ASCII码为:%d\n",character,character+32);break;
default:printf("No!\n该字母的大写ASCII码为%d:,小写ASCII码为:%d\n",character,character+32);
}
return 0;
}
P126 1:
#include
int main()
{
int m,n,r,k,zdgys;
printf("请输入两个正整数:\n");
scanf("%d%d",&m,&n);
k=m*n;
if(m
{
r=m;
m=n;
n=r;
}
while(r=m%n)
{
m=n;
n=r;
r=m/n;
}
zdgys=n;
printf("它们的最大公约数为%d,最小公倍数为%d\n",zdgys,k/zdgys);
return 0;
}
P126 2:
#include
int main()
{
int ywzmdgs=0,kgdgs=0,szdgs=0,qtzfdgs=0;
char a;
printf("请输入一行字符(以Ctrl+Z结束):\n");
while((a=getchar())!=EOF)
{
if(a>=65&&a<=90||a>=97&&a<=122)
ywzmdgs++;
else
if(a==32)
kgdgs++;
else
if(a>=48&&a<=57)
szdgs++;
else
qtzfdgs++;
}
printf("输入的字符中英文字母的个数为%d,空格的个数为%d,数字的个数为%d,其他字符的个数为%d\n",ywzmdgs,kgdgs,szdgs,qtzfdgs);
}
P126 3:
#include
#include
int main()
{
int i;
double x,t,sum;
printf("请输入x的值:\n");
scanf("%lf",&x);
t=x;
sum=x;
for(i=1;fabs(t)>1e-6;i++)
{
t=-t*x*x/(2*i)/(2*i+1);
sum+=t;
}
printf("sinx的近似值为:%lf\n",sum);
return 0;
}
P126 4:
#include
int main()
{
int i;
float jc=1,sum=0;
for(i=1;i<=20;i++)
{
jc*=i;
sum+=jc;
}
printf("1!+2!+3!+4!+…+20!=%.0f\n",sum);
}
P126 5:
#include
#include
int main()
{
int i;
float x,x1,f,f1,t;
printf("请输入x的值:\n");
scanf("%f",&x);
t=x;
for(i=1;fabs(x-x1)>=1e-6;i++)
{
x1=x;
f=2*x1*x1*x1-4*x1*x1+3*x1-6;
f1=6*x1*x1-8*x1+3;
x=x1-f/f1;
}
printf("方程2x^3-4x^2+3x-6=0在%3.1f附近的根为%-9.7f:\n",t,x);
return 0;
}
P126 6:
#include
#include
int main()
{
float x0,x1,x2,fx0,fx1,fx2,t1,t2;
do
{
printf("请输入区间左右端点的值:\n");
scanf("%f%f",&x1,&x2);
fx1=2*x1*x1*x1-4*x1*x1+3*x1-6;
fx2=2*x2*x2*x2-4*x2*x2+3*x2-6;
}
while(fx1*fx2>0);
t1=x1;
t2=x2;
do
{
x0=(x1+x2)/2;
fx0=2*x0*x0*x0-4*x0*x0+3*x0-6;
if(fx0*fx1<0)
{
x2=x0;
fx2=fx0;
}
else
{
x1=x0;
fx1=fx0;
}
}
while(fabs(fx0)>=1e-6);
printf("方程2x^3-4x^2+3x-6=0在(%3.1f,%3.1f)区间内的根为:%-9.7f\n",t1,t2,x0);
return 0;
}
P126 7:
#include
#include
int main()
{
int n,k,i,m=0,sum=0;
for(n=499;n>=2;n-=2)
{
k=(int)(sqrt(n));
for(i=2;i<=k;i++)
if(n%i==0)
break;
if(i>=k+1)
m++;
}
if(m<10)
printf("500以内的素数个数不够10个\n");
else
{
printf("500以内最大的10个素数和为:\n");
m=0;
for(n=499;n>=2;n-=2)
{
k=(int)(sqrt(n));
for(i=2;i<=k;i++)
if(n%i==0)
break;
if(i>=k+1&&m<10)
{
m++;
sum+=n;
printf("%d+",n);
}
}
printf("\b=%d\n",sum);
}
return 0;
}
P127 8:
#include
int main()
{
int i=0;
char a;
printf("请输入正文:\n");
while((a=getchar())!=10)
{
if(a!=32)
i=0;
else
i++;
if(i==0||i==1)
putchar(a);
}
printf("\n");
return 0;
}
P127 9:
#include
#include
int main()
{
int space,i;
for(space=3;space>=-3;space--)
{
for(i=1;i<=abs(space);i++)
printf(" ");
for(i=1;i<=7-2*abs(space);i++)
printf("*");
printf("\n");
}
return 0;
}
P127 10(if~else if语句):
#include
int main()
{
float a,b,result;
char op;
printf("请输入算式:\n");
scanf("%f%c%f",&a,&op,&b);
if(op!='+'&&op!='-'&&op!='*'&&op!='/'||op=='/'&&b==0)
printf("非法运算!\n");
else
{
if(op=='+')
result=a+b;
else
{
if(op=='-')
result=a-b;
else
{
if(op=='*')
result=a*b;
else
if(op=='/')
result=a/b;
}
}
printf("%-4.2f%c%-415/41.2f=%-7.2f\n",a,op,b,result);
}
return 0;
}
P127 10(switch语句):
#include
int main()
{
float a,b,result;
char op;
printf("请输入算式:\n");
scanf("%f%c%f",&a,&op,&b);
if(op!='+'&&op!='-'&&op!='*'&&op!='/'||op=='/'&&b==0)
printf("非法运算!\n");
else
{
switch(op)
{
case'+':result=a+b;
case'-':result=a-b;
case'*':result=a*b;
case'/':result=a/b;
}
printf("%-4.2f%c%-4.2f=%-7.2f\n",a,op,b,result);
}
return 0;
}
P127 11:
#include
#include
int main()
{
int n,a,b,i,k;
for(n=6;n<=100;n+=2)
{
for(a=2;a
k=(int)(sqrt(a));
for(i=2;i<=k;i++)
if(a%i==0)
break;
if(i>=k+1)
{
for(b=2;b
k=(int)(sqrt(b));
for(i=2;i<=k;i++)
if(b%i==0)
break;
if(i>=k+1&&a<=b&&n==a+b)
printf("%d=%d+%d\n",n,a,b);
}
}
}
}
return 0;
}
P143 2:
#include
int main()
{
int i,j,k,t;
int a[10];
printf("请输入10个整数:\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=0;i<9;i++)
{
for(k=i,j=i+1;j<10;j++)
if(a[j]k=j;
if(i!=k)
{
t=a[k];
a[k]=a[i];
a[i]=t;
}
}
printf("这10个整数按从小到大排序后分别为:\n");
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}
P144 4:
#include
int main()
{
int i,j;
char str1[50],str2[50],str3[100];
printf("请输入一个字符串:\n");
gets(str1);
printf("请再输入一个字符串:\n");
gets(str2);
for(i=0;str1[i]!=0;i++)
str3[i]=str1[i];
for(j=0;str2[j]!=0;j++)
str3[i+j]=str2[j];
str3[i+j]=0;
printf("连接后的字符串为:\n");
printf("%s\n",str3);
return 0;
}
P144 5:
#include
int main()
{
int i,k;
char s[50],t[50];
printf("请输入一个字符串s:\n");
gets(s);
printf("请再输入一个字符串t:\n");
gets(t);
for(i=0;s[i]!=0||t[i]!=0;i++)
{
k=s[i]-t[i];
if(k==0)
continue;
else
break;
}
if(k==0)
printf("字符串s等于字符串t,返回值为0\n");
if(k>0)
printf("字符串s大于字符串t,返回值为%d\n",k);
if(k<0)
printf("字符串s小于字符串t,返回值为%d\n",k);
return 0;
}
P145 8:
#include
#include
int main()
{
int i,j;
int k[79];
char c,s[80][80]={'\0'};
printf("请输入
正文(以Ctrl+Z结束):\n");
for(i=0;i<80;i++)
{
for(j=0;j<80;j++)
{
c=getchar();
if(c==EOF)
break;
if(c!='\n')
s[i][j]=c;
else
{
s[i][j]=0;
break;
}
}
if(c==EOF)
break;
}
for(i=1;i<80;i++)
{
if(strcmp(s[i-1],s[i]))
k[i-1]=1;
else
k[i-1]=0;
}
printf("按要求操作后输出的正文为:\n");
printf("%s\n",s[0]);
for(i=0;i<80;i++)
{
if(k[i]!=0&&s[i+1][0]!=0)
printf("%s\n",s[i+1]);
}
return 0;
}
P145 9:
#include
#include
#define pi 3.1415926
int main()
{
int i,iy1,iy2;
double x=0,y1,y2;
char a[80];
for(i=0;i<79;i++)
a[i]=' ';
a[79]=0;
printf("函数y1=sin2x(用.表示)和y2=2cos(2x+30°)(用,表示)\n(其中x=0°,10°,20°,...,360°)的图形为:\n");
while(x<2*pi)
{
y1=sin(2*x);
y2=2*cos(2*x+pi/6);
iy1=(int)(40+15*y1);
iy2=(int)(40+15*y2);
a[iy1]='.';
a[iy2]=',';
printf("%s\n",a);
a[iy1]=' ';
a[iy2]=' ';
x+=pi/18;
}
return 0;
}
P145 11:
#include
int main()
{
int i=0,j,k,n;
int m[15][15];
printf("请输入要打印的魔方阵的阶数:\n");
scanf("%d",&n);
if(n>0&&n%2!=0)
{
j=(n-1)/2;
for(k=1;k<=n*n;k++)
{
m[i][j]=k;
if(k%n==0)
if(i==n-1)
i=0;
else
i++;
else
{
if(i==0)
i=n-1;
else
i--;
if(j==n-1)
j=0;
else
j++;
}
}
printf("%d阶魔方阵为:\n",n);
for(i=0;i
}
else
printf("数据输入错误!\n");
return 0;
}
P160 1:
#include
#include
int main()
{
int n;
void pdsfsss(int n);
printf("请输入一个整数:\n");
scanf("%d",&n);
pdsfsss(n);
return 0;
}
void pdsfsss(int n)
{
int k,i;
k=(int)(sqrt(n));
for(i=2;i<=k;i++)
if(n%i==0)
break;
if(i<=k)
printf("%d不是素数\n",n);
else
printf("%d是素数\n",n);
}
P160 2:
#include
int main()
{
void c_p_mn(int a[2],int m,int n);
int a[2],m,n;
printf("请输入两个正整数m和n(其中m>=n):\n");
scanf("%d%d",&m,&n);
c_p_mn(a,m,n);
printf("%d个元素中%d个元素的组合数为%d,排列数为%d\n",m,n,a[1],a[0]);
return 0;
}
void c_p_mn(int a[2],int m,int n)
{
int factorial(int n);
a[0]=factorial(m)/factorial(m-n);
a[1]=a[0]/factorial(n);
}
int factorial(int n)
{
if(n==0||n==1)
return(1);
else
return(n*factorial(n-1));
}
P160 3(1):
#include
int Zdgys,Zxgbs;
int main()
{
int m,n;
void zdgys(int m,int n);
void zxgbs(int m,int n);
printf("请输入两个正整数:\n");
scanf("%d%d",&m,&n);
zdgys(m,n);
zxgbs(m,n);
printf("它们的最大公约数为%d,最小公倍数为%d\n",Zdgys,Zxgbs);
return 0;
}
void zdgys(int m,int n)
{
int r;
if(m
r=m;
m=n;
n=r;
}
while(r=m%n)
{
m=n;
n=r;
r=m/n;
}
Zdgys=n;
}
void zxgbs(int m,int n)
{
void zdg
ys(int m,int n);
Zxgbs=m*n/Zdgys;
}
P160 3(2):
#include
int main()
{
int m,n,Zdgys,Zxgbs;
int zdgys(int m,int n);
int zxgbs(int m,int n,int Zdgys);
printf("请输入两个正整数:\n");
scanf("%d%d",&m,&n);
Zdgys=zdgys(m,n);
Zxgbs=zxgbs(m,n,Zdgys);
printf("它们的最大公约数为%d,最小公倍数为%d\n",Zdgys,Zxgbs);
return 0;
}
int zdgys(int m,int n)
{
int r;
if(m
r=m;
m=n;
n=r;
}
while(r=m%n)
{
m=n;
n=r;
r=m/n;
}
return(n);
}
int zxgbs(int m,int n,int Zdgys)
{
int Zxgbs;
Zxgbs=m*n/Zdgys;
return(Zxgbs);
}
P161 4:
#include
int main()
{
long int n;
void zszzfc(int n);
printf("请输入一个整数:\n");
scanf("%ld",&n);
printf("该整数转换成字符串后为:\n");
if(n<0)
{
printf("-");
n=-n;
}
zszzfc(n);
printf("\n");
return 0;
}
void zszzfc(int n)
{
int i;
if((i=n/10)!=0)
zszzfc(i);
printf("%c",n%10+'0');
}
P161 5:
#include
int main()
{
int i,n;
float a[20],zdz,zxz;
float czzdz(float a[],int n);
float czzxz(float a[],int n);
printf("请输入数的个数:\n");
scanf("%d",&n);
printf("请输入%d个数:\n",n);
for(i=0;i
zdz=czzdz(a,n);
zxz=czzxz(a,n);
printf("其中最大值为%f,最小值为%f\n",zdz,zxz);
return 0;
}
float czzdz(float a[],int n)
{
int i,k=0;
for(i=1;i
if(a[i]>a[k])
k=i;
}
return(a[k]);
}
float czzxz(float a[],int n)
{
int i,k=0;
for(i=1;i
if(a[i]k=i;
}
return(a[k]);
}
P161 6:
#include
#include
int main()
{
int n,i;
double x[20],y[20];
double f(double x);
printf("请输入要计算的y值的个数:\n");
scanf("%d",&n);
printf("请输入%d个x值:\n",n);
for(i=0;i
for(i=0;i
for(i=0;i
return 0;
}
double f(double x)
{
double y;
if(x<-2)
y=x*x-sin(x);
if(x>=-2&&x<=2)
y=pow(2,x)+x;
if(x>2)
y=sqrt(x*x+x+1);
return(y);
}
P161 7:
#include
#define swap(a,b) a=a+b;b=a-b;a=a-b;
int main()
{
float a,b;
printf("请输入两个数:\n");
scanf("%f%f",&a,&b);
swap(a,b);
printf("这两个数的值互换后分别为%f和%f\n",a,b);
return 0;
}
P161 10:
#include
#include
int main()
{
int i;
char s[80];
int sfszm(char c);
int zcddcdqswz(char s[80]);
printf("请输入一行字符串:\n");
gets(s);
printf("该行字符串中最长的单词为:\n");
for(i=zcddcdqswz(s);sfszm(s[i]);i++)
printf("%c",s[i]);
printf("\n");
return 0;
}
int sfszm(char c)
{
if((c>='a'&&c<='z')||(c>='A'&&c<='Z'))
return(1);
else
return(0);
}
int zcddcdqswz(char s[80])
{
unsigned int i,point,flag=1,len=0,lenth=0,place=0;
for(i=0;i<80&&s[i]!=0;i++)
if(sfszm(s[i]))
if(flag)
{
point=i;
flag=0;
}
else
len++;
e
lse
{
flag=1;
if(len>=lenth)
{
lenth=len;
place=point;
len=0;
}
}
return(place);
}
P162 12:
#include
#include
int main()
{
int n;
int pdsfsss(int n);
int ddsx(int n);
printf("100到1000之间的所有可逆素数为:\n");
for(n=101;n<1000;n++)
if(pdsfsss(n)==1&&pdsfsss(ddsx(n))==1)
printf("%d\t",n);
printf("\n");
return 0;
}
int pdsfsss(int n)
{
int i,k;
k=(int)(sqrt(n));
for(i=2;i<=k;i++)
if(n%i==0)
break;
if(i>=k+1)
return(1);
else
return(0);
}
int ddsx(int n)
{
n=100*(n%10)+10*((n%100)/10)+(n-n%100)/100;
return(n);
}
P176 2:
#include
int main()
{
int a[10][10],n,i,j;
int (*p)[10];
void jzdzz(int (*p)[10],int n);
printf("请输入n*n矩阵的阶数:\n");
scanf("%d",&n);
printf("请输入一个%d*%d矩阵:\n",n,n);
for(i=0;i
p=a;
jzdzz(p,n);
printf("转置后的矩阵为:\n");
for(i=0;i
printf("%-3d ",*(*(p+i)+j));
}
return 0;
}
void jzdzz(int (*p)[10],int n)
{
int i,j,t;
for(i=0;i
t=*(*(p+i)+j);
*(*(p+i)+j)=*(*(p+j)+i);
*(*(p+j)+i)=t;
}
}
P176 3:
#include
int main()
{
char *a,*b,*c,s1[50],s2[50],s3[100];
void lgzfcdlj(char *a,char *b,char *c);
printf("请输入一个字符串:\n");
gets(s1);
printf("请再输入一个字符串:\n");
gets(s2);
a=s1;
b=s2;
c=s3;
lgzfcdlj(a,b,c);
printf("连接后的字符串为:\n");
printf("%s\n",c);
return 0;
}
void lgzfcdlj(char *a,char *b,char *c)
{
int i,j;
for(i=0;*(a+i)!=0;i++)
*(c+i)=*(a+i);
for(j=0;*(b+j)!=0;j++)
*(c+i+j)=*(b+j);
*(c+i+j)=0;
}
P177 4:
#include
int main()
{
int k;
char s1[50],s2[50],*p,*q;
int strcmp(char *p,char *q);
printf("请输入一个字符串s1:\n");
gets(s1);
printf("请再输入一个字符串s2:\n");
gets(s2);
p=s1;
q=s2;
k=strcmp(s1,s2);
if(k==0)
printf("字符串s1等于字符串s2,返回值为0\n");
else
printf("字符串s1不等于字符串s2,返回值为%d\n",k);
return 0;
}
int strcmp(char *p,char *q)
{
int i,k;
for(i=0;*(p+i)!=0||*(q+i)!=0;i++)
{
k=*(p+i)-*(q+i);
if(k==0)
continue;
else
break;
}
return(k);
}
P177 5:
#include
int main()
{
int i,n;
float a[20],zdz,zxz,*p;
float czzdz(float *p,int n);
float czzxz(float *p,int n);
printf("请输入数的个数:\n");
scanf("%d",&n);
printf("请输入%d个数:\n",n);
for(i=0;i
p=a;
zdz=czzdz(a,n);
zxz=czzxz(a,n);
printf("其中最大值为%f,最小值为%f\n",zdz,zxz);
return 0;
}
float czzdz(float *p,int n)
{
int i,k=0;
for(i=1;i
if(*(p+i)>*(p+k))
k=i;
}
return(*(p+k));
}
float czzxz(float *p,int n)
{
int i,k=0;
for(i=1;i
if(*(p+i)<*(p+k))
k=i;
}
return(*(p+k))
;
}
P177 6:
#include
int main()
{
int i,n,a[20],*num[20],**p;
void dngzspx(int **p,int n);
printf("请输入整数的个数:\n");
scanf("%d",&n);
printf("请输入%d个整数:\n",n);
for(i=0;i
scanf("%d",&a[i]);
num[i]=&a[i];
}
p=num;
dngzspx(p,n);
printf("这%d个整数按从小到大排序后分别为:\n",n);
for(i=0;i
printf("\n");
return 0;
}
void dngzspx(int **p,int n)
{
int i,j,k,t;
for(i=0;i
for(k=i,j=i+1;j
k=j;
if(i!=k)
{
t=**(p+k);
**(p+k)=**(p+i);
**(p+i)=t;
}
}
}
P177 7:
#include
#include
int main()
{
double y1,y2,y3;
double jxfqdjf(double (*f)(double),double a,double b);
y1=jxfqdjf(sin,0,1);
y2=jxfqdjf(cos,-1,1);
y3=jxfqdjf(exp,0,2);
printf("sinx在0到1上的定积分为:%lf\n",y1);
printf("cosx在-1到1上的定积分为:%lf\n",y2);
printf("e^x在0到2上的定积分为:%lf\n",y3);
return 0;
}
double jxfqdjf(double (*f)(double),double a,double b)
{
int i;
double s,h;
h=(b-a)/100;
s=((*f)(a)+(*f)(b))/2;
for(i=1;i<100;i++)
s+=(*f)(a+i*h);
return(s*h);
}
P197 1(冒泡法):
#include
struct Student
{
int NUM;
char name[16];
char sex;
int age;
double grade;
};
int main()
{
struct Student stu[5],*p[5];
void input(struct Student *p[]);
void sort(struct Student *p[]);
void output(struct Student *p[]);
int i;
for(i=0;i<5;i++)
p[i]=&stu[i];
input(p);
sort(p);
output(p);
return 0;
}
void input(struct Student *p[5])
{
int i;
printf("请输入5名学生的情况表:\n");
for(i=0;i<5;i++)
{
scanf("%d%s %c%d%lf",&p[i]->NUM,p[i]->name,&p[i]->sex,&p[i]->age,&p[i]->grade);
getchar();
}
printf("5名学生的情况表为:\n");
printf("学号(NUM) 姓名(name) 性别(sex) 年龄(age) 成绩(grade)\n");
for(i=0;i<5;i++)
printf("%-9d %-9s %-9c %-9d %-4.1lf\n",p[i]->NUM,p[i]->name,p[i]->sex,p[i]->age,p[i]->grade);
}
void sort(struct Student *p[5])
{
int i,j;
struct Student *t;
for(i=0;i<4;i++)
for(j=0;j<4-i;j++)
if(p[j]->grade>p[j+1]->grade)
{
t=p[j];
p[j]=p[j+1];
p[j+1]=t;
}
}
void output(struct Student *p[5])
{
int i;
printf("按成绩从低到高排序后的5名学生的情况表为:\n");
printf("学号(NUM) 姓名(name) 性别(sex) 年龄(age) 成绩(grade)\n");
for(i=0;i<5;i++)
printf("%-9d %-9s %-9c %-9d %-4.1lf\n",p[i]->NUM,p[i]->name,p[i]->sex,p[i]->age,p[i]->grade);
}
P197 1(选择法):
#include
struct Student
{
int NUM;
char name[16];
char sex;
int age;
double grade;
};
int main()
{
struct Student stu[5],*p[5];
void input(struct Student *p[]);
void sort(struct Student *p[]);
void output(struct Student *p[]);
int i;
for(i=0;i<5;i++)
p[i]=&stu[i];
input(p);
sort(p);
output(p);
return 0;
}
void input(struct Student *p[5])
{
int i;
printf("请输入5名学生的情况表:\n");
for(i=0;i<5;i++)
{
scanf("%d%s %c%d%lf",&p[i]->NUM,p[i]->name,&p[i]->sex,&p[i]->age,&p[i]->grade);
getchar();
}
printf("5名学生的情况表为:\n");
printf("学号(NUM) 姓名(name) 性别(sex) 年龄(age) 成绩(grade)\n");
for(i=0;i<5;i++)
printf("%-9d %-9s %-9c %-9d %-4.1lf\n",p[i]->NUM,p[i]->name,p[i]->sex,p[i]->age,p[i]->grade);
}
void sort(struct Student *p[5])
{
int i,j,k;
struct Student *t;
for(i=0;i<4;i++)
{
k=i;
for(j=i+1;j<5;j++)
if(p[j]->grade
grade)
k=j;
if(k!=i)
{
t=p[i];
p[i]=p[k];
p[k]=t;
}
}
}
void output(struct Student *p[5])
{
int i;
printf("按成绩从低到高排序后的5名学生的情况表为:\n");
printf("学号(NUM) 姓名(name) 性别(sex) 年龄(age) 成绩(grade)\n");
for(i=0;i<5;i++)
printf("%-9d %-9s %-9c %-9d %-4.1lf\n",p[i]->NUM,p[i]->name,p[i]->sex,p[i]->age,p[i]->grade);
}
P198 2:
#include
#include
struct stu
{
int num;
char name[16];
char sex;
int age;
double grade;
struct stu *next;
};
int main()
{
struct stu *head;
struct stu *create();
void print(struct stu *head);
struct stu *del(struct stu *head);
printf("请输入5名学生的情况表(输入0 0 0 0 0来结束):\n");
head=create();
printf("5名学生的情况表为:\n");
printf("学号(NUM) 姓名(name) 性别(sex) 年龄(age) 成绩(grade)\n");
print(head);
head=del(head);
printf("剩下学生的情况表为:\n");
printf("学号(NUM) 姓名(name) 性别(sex) 年龄(age) 成绩(grade)\n");
print(head);
return 0;
}
struct stu *create()
{
struct stu *head,*p;
p=(struct stu *)malloc(sizeof(struct stu));
scanf("%d%s %c%d%lf",&p->num,p->name,&p->sex,&p->age,&p->grade);
head=NULL;
while(p->num!=0)
{
p->next=head;
head=p;
p=(struct stu *)malloc(sizeof(struct stu));
scanf("%d%s %c%d%lf",&p->num,p->name,&p->sex,&p->age,&p->grade);
}
free(p);
return(head);
}
void print(struct stu *head)
{
struct stu *p;
p=head;
if(head!=NULL)
do
{
printf("%-9d %-9s %-9c %-9d %-4.1lf\n",p->num,p->name,p->sex,p->age,p->grade);
p=p->next;
}
while(p!=NULL);
}
struct stu *del(struct stu *head)
{
int age,i;
struct stu *p1,*p2;
printf("请输入要删的年龄:\n");
scanf("%d",&age);
if(head==NULL)
{
printf("链表为空!\n");
return(head);
}
p1=head;
while(age!=p1->age&&p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if(age!=p1->age)
printf("表中无此年龄!\n");
else
{
for(i=0;i<5;i++)
{
p1=head;
while(age!=p1->age&&p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if(age==p1->age)
{
if(p1==head)
head=p1->next;
else
p2->next=p1->next;
free(p1);
}
}
}
return(head);
}
P198 3:
#include
struct person
{
int number;
int next;
};
int main()
{
struct person a[14];
int i,n=0,k=13;
for(i=1;i<14;i++)
{
if(i==13)
a[i].next=1;
else
a[i].next=i+1;
a[i].number=i;
}
while(n<12)
{
i=0;
while(i!=3)
{
k=a[k].next;
if(a[k].number)
i++;
}
a[k].number=0;
n++;
}
printf("最后留在圈子中的人原来的序号为:\n");
for(i=1;i<=13;i++)
if(a[i].number)
printf("%d\n",a[i].number);
return 0;
}
P207 1:
#include
int main()
{
int n1,n2;short value;
void getbits(short,int,int);
printf("请输入要进行取位操作的数:\n");
scanf("%d",&value);
printf("请输入欲取出的起始位:\n");
scanf("%d",&n1);
printf("请输入欲取出的结束位:\n");
scanf("%d",&n2);
printf("进行取位操作后得到的数为:\n");
getbits(value,n1,n2);
return 0;
}
void getbits(short value,int n1,int n2)
{
int i,j=0;
short s=0;
for(i=15;i>=0;i--)
if((value&1<j++;
else
break;
for(i=n1+j;i<=n2+j;i++)
s|=1<<(16-i);
value=value&s;
for(i=16-j-n1;i>=16-j-n2;i--)
printf("%d",(value&1<printf("\n");
}
P208 2:
#include
int main()
{
int a,i,j;
printf("请输入一个十六进制数:\n");
scanf("%x",&a);
j=sizeof(a)*8-1;
for(i=sizeof(a)*8-1;i>=0;i--)
{
if((a&1<j--;
else
break;
}
printf("%x的二进制数为:\n",a);
for(i=j;i>=0;i--)
printf("%d",(a&1<printf("\n");
return 0;
}
P216 1:
#include
#include
struct student
{
int num;
char name[16];
double score[3];
double average;
}s[5];
int main()
{
FILE *fp;
int i;
printf("请输入5名学生的信息(包括学生号,姓名,三门课成绩):\n");
for(i=0;i<5;i++)
{
scanf("%d%s%lf%lf%lf",&s[i].num,&s[i].name,&s[i].score[0],&s[i].score[1],&s[i].score[2]);
s[i].average=(s[i].score[0]+s[i].score[1]+s[i].score[2])/3.0;
}
if((fp=fopen("stud.dat","wb"))==NULL)
{
printf("无法打开此文件!\n");
exit(0);
}
for(i=0;i<5;i++)
if(fwrite(&s[i],sizeof(struct student),1,fp)!=1)
printf("文件写入失败!\n");
fclose(fp);
return 0;
}
P217 2:
#include
#include
struct student
{
int num;
char name[16];
double score[3];
double average;
}s[5];
void load()
{
FILE *fp;
int i;
if((fp=fopen("stud.dat","rb"))==NULL)
{
printf("无法打开此文件!\n");
exit(0);
}
for(i=0;i<5;i++)
if(fread(&s[i],sizeof(struct student),1,fp)!=1)
{
if(feof(fp))
{
fclose(fp);
return;
}
printf("文件读取失败!\n");
}
fclose(fp);
}
void sort()
{
int i,j;
struct student t;
for(j=0;j<4;j++)
for(i=0;i<4-j;i++)
if(s[i].average{
t=s[i];
s[i]=s[i+1];
s[i+1]=t;
}
}
void save()
{
FILE *fp;
int i;
if((fp=fopen("stu_sort.dat","wb"))==NULL)
{
printf("无法打开此文件!\n");
exit(0);
}
for(i=0;i<5;i++)
if(fwrite(&s[i],sizeof(struct student),1,fp)!=1)
prin
tf("文件写入失败!\n");
fclose(fp);
}
int main()
{
load();
sort();
save();
return 0;
}
P217 3:
#include
#include
struct student
{
int num;
char name[16];
double score[3];
double average;
}s[5];
int main()
{
FILE *fp;
int i;
if((fp=fopen("stu_sort.dat","rb"))==NULL)
{
printf("无法打开此文件!\n");
exit(0);
}
printf("已按平均分从大到小排序后的学生数据为:\n");
printf("学生号 姓名 第一门课成绩 第二门课成绩 第三门课成绩 三门课平均成绩\n");
for(i=0;i<5;i++)
{
fread(&s[i],sizeof(struct student),1,fp);
printf("%-6d %-16s %-12.2lf %-12.2lf %-12.2lf %-12.2lf\n",s[i].num,s[i].name,s[i].score[0],s[i].score[1],s[i].score[2],s[i].average);
}
fclose(fp);
return 0;
}
P217 9:
#include
#include
int main()
{
FILE *fp;
int i;
char ch,c[80];
if((fp=fopen("ABC.txt","r"))==NULL)
{
printf("无法打开此文件!\n");
exit(0);
}
for(i=0;(ch=fgetc(fp))!=EOF;i++)
{
if(ch>='a'&&ch<='z')
{
if(ch=='z')
ch='a';
else
ch++;
c[i]=ch;
}
else
c[i]=ch;
}
c[i]='\0';
fclose(fp);
if((fp=fopen("ABC.txt","w"))==NULL)
{
printf("无法打开此文件!\n");
exit(0);
}
for(i=0;(fputc(c[i],fp))!='\0'&&i<=80;i++);
fclose(fp);
return 0;
}