PTA 浙大版《C语言程序设计(第4版)》题目集 参考答案(编程题)
本答案配套详解教程专栏
😀😀 欢 迎 订 阅😀😀
PTA浙大版《C语言程序设计(第4版)》题目集 详解教程
练习2-1 Programming in C is fun! (5 分)
#include<stdio.h>
int main(){
printf("Programming in C is fun!");
return 0;
}
练习2-3 输出倒三角图案 (5 分)
#include<stdio.h>
int main(){
printf("* * * *\n");
printf(" * * *\n");
printf(" * *\n");
printf(" *\n");
return 0;
}
练习2-4 温度转换 (5 分)
#include<stdio.h>
int main(){
int C,F=150;
C=5*(F-32)/9;
printf("fahr = 150, celsius = %d",C);
return 0;
}
练习2-6 计算物体自由下落的距离 (5 分)
#include <stdio.h>
int main(){
float h,t = 3,g = 10;
h = 0.5*g*t*t;
printf("height = %.2f",h);
return 0;
}
练习2-8 计算摄氏温度 (10 分)
#include<stdio.h>
int main(void){
int C,F;
scanf("%d",&F);
C=5*(F-32)/9;
printf("Celsius = %d",C);
return 0;
}
练习2-9 整数四则运算 (10 分)
#include<stdio.h>
int main(){
int m,n;
scanf("%d %d",&m,&n);
printf("%d + %d = %d\n",m,n,m+n);
printf("%d - %d = %d\n",m,n,m-n);
printf("%d * %d = %d\n",m,n,m*n);
printf("%d / %d = %d",m,n,m/n);
return 0;
}
练习2-10 计算分段函数[1] (10 分)
#include<stdio.h>
int main(){
float x,result;
scanf("%f",&x);
if(x!=0){
result=1/x;
}else {
result=0;
}
printf("f(%.1f) = %.1f",x,result);
return 0;
}
练习2-11 计算分段函数[2] (10 分)
#include <stdio.h>
#include <math.h>
int main(){
float x, y;
scanf("%f", &x);
if(x>=0)y=sqrt(x);
else y=pow(x+1,2)+2*x+1/x;
printf("f(%.2f) = %.2f", x,y);
return 0;
}
练习2-12 输出华氏-摄氏温度转换表 (15 分)
for循环
版本
#include<stdio.h>
int main(){
int lower,upper,F;
float C;
scanf("%d %d",&lower,&upper);
F=lower;
if(lower<=upper&&upper<=100){
printf("fahr celsius\n");
C=5.0*(F*1.0-32)/9.0;
printf("%d%6.1f",F,C);//占据6个字符宽度,靠右对齐,保留1位小数
for(F=lower+2;F<=upper;F+=2){
C=5.0*(F*1.0-32)/9.0;
printf("\n%d%6.1f",F,C);//保证结尾无空行
}
}else printf("Invalid.");
return 0;
}
while循环
版本
#include<stdio.h>
int main(){
int lower,upper,F;
float C;
scanf("%d %d",&lower,&upper);
F=lower;
if(lower<=upper&&upper<=100){
printf("fahr celsius\n");
C=5.0*(F*1.0-32)/9.0;
printf("%d%6.1f",F,C);//占据6个字符宽度,靠右对齐,保留1位小数
while((F+=2)<=upper){
C=5.0*(F*1.0-32)/9.0;
printf("\n%d%6.1f",F,C);//保证结尾无空行
}
}else printf("Invalid.");
return 0;
}
do-while循环
版本
#include<stdio.h>
int main(){
int lower,upper,F;
float C;
scanf("%d %d",&lower,&upper);
F=lower;
if(lower<=upper&&upper<=100){
printf("fahr celsius\n");
do{
C=5.0*(F*1.0-32)/9.0;
printf("%d%6.1f\n",F,C);//占据6个字符宽度,靠右对齐,保留1位小数
}while((F+=2)<=upper);
}else printf("Invalid.");
return 0;
}
练习2-13 求N分之一序列前N项和 (15 分)
#include<stdio.h>
int main(){
double sum=0;
int n,i;
scanf("%d",&n);
for(i=1;i<=n;i++){
sum=sum+1.0/i;
}
printf("sum = %.6f\n",sum);
return 0;
}
练习2-14 求奇数分之一序列前N项和 (15 分)
#include<stdio.h>
int main(void){
double sum=0;
int n,i;
scanf("%d",&n);
for(i=1;i<=n;i++){
sum=sum+1.0/(2*i-1);
}
printf("sum = %.6lf\n",sum);
return 0;
}
练习2-15 求简单交错序列前N项和 (15 分)
#include<stdio.h>
int main(){
double sum=0;
int i,n,flag=1;
scanf("%d",&n);
for(i=1;i<=n;i++){
sum+=1.0/(3*i-2)*(flag);
flag*=-1;
}
printf("sum = %.3lf",sum);
return 0;
}
练习2-17 生成3的乘方表 (15 分)
#include<stdio.h>
#include<math.h>
int main(){
int i,n;
scanf("%d",&n);
for(i=0;i<=n;i++){
printf("pow(3,%d) = %.0f\n",i,pow(3,i));
}
return 0;
}
练习2-18 求组合数 (15 分)
#include<stdio.h>
double fact(int n){
double fact=1;
for(int i=1;i<=n;i++){
fact*=i;
}
return fact;
}
int main(){
double result;
double m,n;
scanf("%lf %lf",&m,&n);
result = fact(n)/(fact(m)*fact(n-m));
printf("result = %.0f",result);
return 0;
}
习题2-1 求整数均值 (10 分)
#include<stdio.h>
int main(){
int a,b,c,d,sum;
float average;
scanf("%d %d %d %d",&a,&b,&c,&d);
sum=a+b+c+d;
average=sum/4.0;
printf("Sum = %d; Average = %.1f",sum,average);
return 0;
}
习题2-2 阶梯电价 (15 分)
#include<stdio.h>
int main(){
int n;
double cost;
scanf("%d",&n);
if(n<0){
printf("Invalid Value!");
return 0;
}
else if(n<=50)cost=0.53*n;
else cost=50*0.53+0.58*(n-50);
printf("cost = %.2f",cost);
return 0;
}
习题2-3 求平方与倒数序列的部分和 (15 分)
#include<stdio.h>
int main(){
int m,n;
double sum=0;
scanf("%d %d",&m,&n);
for(int i=m;i<=n;i++)
sum+=i*i+1.0/i;
printf("sum = %.6f",sum);
return 0;
}
习题2-4 求交错序列前N项和 (15 分)
#include<stdio.h>
int main(){
double i,item,sum=0;
int n,flag=1;
scanf("%d",&n);
for(i=1;i<=n;i++){
item=flag*i/(2*i-1);
sum+=item;
flag*=-1;
}
printf("%.3f",sum);
return 0;
}
习题2-5 求平方根序列前N项和 (15 分)
#include<stdio.h>
#include<math.h>
int main(){
int n,i;
double sum=0,item;
scanf("%d",&n);
for(i=1;i<=n;i++){
item=sqrt(i);
sum+=item;
}
printf("sum = %.2f",sum);
return 0;
}
习题2-6 求阶乘序列前N项和 (15 分)
#include<stdio.h>
int main(){
int n,sum=0,i,j=1;
scanf("%d",&n);
for(i=1;i<=n;i++) {
j*=i;
sum+=j;
}
printf("%d",sum);
}
练习3-2 计算符号函数的值 (10 分)
#include<stdio.h>
int main(){
int n,sign;
scanf("%d",&n);
if(n<0)sign=-1;
if(n==0)sign=0;
if(n>0)sign=1;
printf("sign(%d) = %d",n,sign);
return 0;
}
练习3-3 统计学生平均成绩与及格人数 (15 分)
#include<stdio.h>
int main(void){
int i,N,score,count=0;
double sum=0,average;
scanf("%d",&N);
if(N==0){
printf("average = 0.0\n");
printf("count = 0");
}else{
for(i=1;i<=N;i++){
scanf("%d",&score);
sum=sum+score;
if(score>=60)count++;
}
average=sum/N;
printf("average = %.1f\n",average);
printf("count = %d",count);
}
return 0;
}
练习3-4 统计字符 (15 分)
#include <stdio.h>
int main(){
int i,letter = 0, blank = 0, digit = 0, other = 0;
char ch;
for(i=0;i<=9;i++){
ch=getchar();
if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))letter++;
else if((ch==' ')||(ch=='\n'))blank++;
else if(ch>='0'&&ch<='9')digit++;
else other++;
}
printf("letter = %d, blank = %d, digit = %d, other = %d",letter,blank,digit,other);
return 0;
}
练习3-5 输出闰年 (15 分)
#include<stdio.h>
int main(){
int i,j=0,year;
scanf("%d",&year);
if(year<=2000||year>2100)printf("Invalid year!");
else{
for(i=2001;i<=year;i++){
if((i%4==0&&i%100!=0)||(i%400==0)){
printf("%d\n",i);
j=1;
}
}
if(j==0)printf("None");
}
return 0;
}
练习3-7 成绩转换 (15 分)
#include <stdio.h>
int main(){
int x;
scanf("%d",&x);
switch(x/10){
case 10:printf("A");break;
case 9:printf("A"); break;
case 8:printf("B"); break;
case 7:printf("C"); break;
case 6:printf("D"); break;
default:printf("E");
}
return 0;
}
练习3-8 查询水果价格 (15 分)
#include<stdio.h>
int main(void){
int i,a;
printf("[1] apple\n[2] pear\n[3] orange\n[4] grape\n[0] exit\n");
for(i=1;i<=5;i++){
scanf("%d",&a);
if(a==0)break;
switch(a){
case 1:printf("price = 3.00\n");break;
case 2:printf("price = 2.50\n");break;
case 3:printf("price = 4.10\n");break;
case 4:printf("price = 10.20\n");break;
default:printf("price = 0.00\n");
}
}
return 0;
}
习题3-1 比较大小 (10 分)
#include<stdio.h>
int main(){
int x,y,z,t;
scanf("%d %d %d",&x,&y,&z);
if(x>y){t=y;y=x;x=t;}
if(x>z){t=z;z=x;x=t;}
if(y>z){t=z;z=y;y=t;}
printf("%d->%d->%d\n",x,y,z);
return 0;
}
习题3-2 高速公路超速处罚 (15 分)
#include<stdio.h>
int main(){
int v,limit;
double exceed;
scanf("%d %d",&v,&limit);
exceed=(v-limit)*100.0/limit;
if(exceed>=50)printf("Exceed %.f%%. License Revoked",exceed);
else if(exceed>=10)printf("Exceed %.f%%. Ticket 200",exceed);
else printf("OK");
return 0;
}
习题3-3 出租车计价 (15 分)
#include<stdio.h>
int main(){
double mileage;
int time,pay;
scanf("%lf %d",&mileage,&time);
if(mileage<=3)pay=10;
else if(mileage<=10)pay=10+2*(mileage-3)+0.5;
else pay=24+(mileage-10)*3+0.5;
pay+=time/5*2;
printf("%d", pay);
return 0;
}
习题3-4 统计学生成绩 (15 分)
#include<stdio.h>
int main(){
int n,i,grade,a=0,b=0,c=0,d=0,e=0;
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d",&grade);
switch (grade/10){
case 10:
case 9:a++;break;
case 8:b++;break;
case 7:c++;break;
case 6:d++;break;
default:e++;break;
}
}
printf("%d %d %d %d %d",a,b,c,d,e);
return 0;
}
习题3-5 三角形判断 (15 分)
#include<stdio.h>
#include<math.h>
int main(){
double x1,y1,x2,y2,x3,y3,p,s;
double j,k,l;
scanf("%lf %lf %lf %lf %lf %lf",&x1,&y1,&x2,&y2,&x3,&y3);
j=sqrt(pow(x1-x2,2)+pow(y1-y2,2));
k=sqrt(pow(x2-x3,2)+pow(y2-y3,2));
l=sqrt(pow(x1-x3,2)+pow(y1-y3,2));
if(j+k>l&&k+l>j&&j+l>k){
p=(j+k+l)/2;
s=sqrt(p*(p-j)*(p-k)*(p-l));//海伦公式
printf("L = %.2lf, A = %.2lf",p*2,s);
}
else printf("Impossible");
return 0;
}
练习4-3 求给定精度的简单交错序列部分和 (15 分)
#include<stdio.h>
int main (){
double sum=0,eps,item;
int n=1,flag=1;
scanf("%lf",&eps);
do{
item=1.0/(3*n-2);
sum+=flag*item;
flag=-flag;
n++;
}while(item>eps);
printf("sum = %f",sum);
return 0;
}
练习4-6 猜数字游戏 (15 分)
while循环
#include <stdio.h>
int main(){
int random,i=1,n,input;
scanf("%d %d",&random,&n);
scanf("%d",&input);
while(i<=n&&input>=0){
if(i==1&&input==random){
printf("Bingo!\n");
break;
}
if((i==2||i==3)&&input==random){
printf("Lucky You!\n");
break;
}
if(i>3&&input==random){
printf("Good Guess!\n");
break;
}
if(input>random)
printf("Too big\n");
if(input<random)
printf("Too small\n");
scanf("%d",&input);
i++;
}
if (i==n+1||input<0)
printf("Game Over");
return 0;
}
for循环
#include<stdio.h>
int main (){
int random,n,i,a;
scanf("%d %d",&random,&n);
for(i=1;i<=n;i++){
scanf("%d",&a);
if(a<0){printf("Game Over\n");break;}
if(a==random){
if(i==1){printf("Bingo!");break;}
else if(i<=3){printf("Lucky You!");break;}
else if(i<=n){printf("Good Guess!");break;}
}
if(a>random)printf("Too big\n");
if(a<random)printf("Too small\n");
if(i==n)printf("Game Over\n");
}
return 0;
}
练习4-7 求e的近似值 (15 分)
#include<stdio.h>
int main(){
double e=1,fact=1;
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
fact*=i;
e+=1/fact;
}
printf("%.8lf",e);
return 0;
}
练习4-10 找出最小值 (20 分)
#include<stdio.h>
int main(){
int min,n,temp;
scanf("%d",&n);
scanf("%d",&min);
for(int i=1;i<n;i++){
scanf("%d",&temp);
if(temp<min)min=temp;
}
printf("min = %d",min);
return 0;
}
练习4-11 统计素数并求和 (20 分)
#include<stdio.h>
int main(){
int M,N,count=0,sum=0,i,j;
scanf("%d %d",&M,&N);
for(i=M;i<=N;i++){
for(j=2;j<i;j++)
if(i%j==0)break;
if(i==j){
count++;
sum+=i;
}
}
printf("%d %d",count,sum);
return 0;
}
习题4-1 求奇数和 (15 分)
#include<stdio.h>
int main(){
int num,sum=0;
do{
scanf("%d",&num);
if(num>0&&num%2==1)sum+=num;
}while(num>0);
printf("%d",sum);
return 0;
}
习题4-2 求幂级数展开的部分和 (20 分)
#include <stdio.h>
#define eps 0.00001
int main(){
double x,sum=1,item = 1.0,n = 1.0;
scanf("%lf",&x);
while(item>=eps){
item *= x/n;
sum+=item;
n++;
}
printf("%.4f",sum);
return 0;
}
习题4-3 求分数序列前N项和 (15 分)
#include <stdio.h>
int main(){
int n,i;
double a=2,b=1,temp,sum=0;
scanf("%d", &n);
for(i=1;i<=n;i++){
sum+=a/b;
temp=a;
a+=b;
b=temp;
}
printf("%.2f",sum);
return 0;
}
习题4-4 特殊a串数列求和 (20 分)
#include<stdio.h>
int main(){
int a,n,i,item=0,sum=0;
scanf("%d %d",&a,&n);
for(i=1;i<=n;i++){
item=item*10+a;
sum+=item;
}
printf("s = %d",sum);
return 0;
}
习题4-5 换硬币 (20 分)
# include <stdio.h>
int main(){
int count=0,i,j,k;
double x;
if(scanf("%lf",&x)==1);
for(i=x/5;i>=1;i--){
for(j=(x-5*i)/2;j>=1;j--){
for(k=x-5*i-2*j;k>=1;k--){
if(5*i+2*j+k==x){
printf("fen5:%d, fen2:%d, fen1:%d, total:%d\n",i,j,k,i+j+k);
count++;
}
}
}
}
printf("count = %d",count);
return 0;
}
习题4-6 水仙花数 (20 分)
#include <stdio.h>
int ipow( int x, int n);
int main() {
int N, i,j,temp,remainder,Npower, sum;
scanf("%d", &N);
for (i = ipow(10, N - 1); i < ipow(10, N ); i++) {
sum = 0;
temp = i;
while (temp != 0) {
Npower=1;
remainder=temp % 10;
Npower=ipow(remainder,N);
sum += Npower;
temp /= 10;
}
if (i == sum)printf("%d\n", i);
}
return 0;
}
int ipow( int x, int n){
int i, p=1;
for (i=0; i<n; i++) p *=x;
return p;
}
习题4-7 最大公约数和最小公倍数 (15 分)
#include <stdio.h>
int GCD( int M, int N);
int main(){
int M, N, gcd, lcm;
scanf("%d %d", &M, &N);
if (M>N) gcd = GCD(M, N);
else gcd = GCD(N, M);
lcm=M*N/gcd;
printf("%d %d\n", gcd, lcm);
return 0;
}
int GCD( int M, int N){
int r = M%N;
while (r) {
M = N; N = r;
r = M%N;
}
return N;
}
习题4-8 高空坠球 (20 分)
#include<stdio.h>
int main(){
int i,n;
double H,h,s;
scanf("%lf %d",&H,&n);
if(n==0)printf("0.0 0.0");
else {
s=H;
h=H/2;
for(i=2;i<=n;i++){
s+=2*h;
h/=2;
}
printf("%.1lf %.1lf",s,h);
}
return 0;
}
习题4-9 打印菱形图案 (15 分)
#include<stdio.h>
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n/2+1;i++){
for(int j=(n/2+1-i)*2;j>=1;j--)printf(" ");
for(int j=1;j<=2*i-1;j++)printf("* ");
printf("\n");
}
for(int i=1;i<=n/2;i++){
for(int j=1;j<=2*i;j++)printf(" ");
for(int j=n-2*i;j>=1;j--)printf("* ");
printf("\n");
}
return 0;
}
习题4-10 猴子吃桃问题 (15 分)
#include<stdio.h>
int main(){
int n,i,sum=0,num=1;
scanf("%d",&n);
for(i=n-1;i>=1;i--){
sum=(num+1)*2;
num=sum;
}
printf("%d",sum);
return 0;
}
习题4-11 兔子繁衍问题 (15 分)
//斐波那契数列
#include<stdio.h>
int main(){
int month,N,F1=1,F2=1,F3=0;
//F1,F2,F3表示连续三个月的兔子数量
scanf("%d",&N);
if(N==1)month=1;
else{
month=2;
while(F3<N){
F3=F1+F2;
F1=F2;
F2=F3;
month++;
}
}
printf("%d",month);
return 0;
}
练习6-3 英文字母替换加密(大小写转换+后移1位) (15 分)
#include<stdio.h>
int main(){
char c,delta;
delta='A'-'a';
do{
scanf("%c",&c);
if(c>='a'&&c<'z')c+=(delta+1);
else if(c>='A'&&c<'Z')c-=(delta-1);
else if(c=='Z')c='a';
else if(c=='z')c='A';
printf("%c",c);
}while(c!='\n');
return 0;
}
习题6-7 简单计算器 (20 分)
#include<stdio.h>
int main(){
int a,sum;
char c;
scanf("%d",&sum);
while((c=getchar())!='='){
scanf("%d",&a);
switch(c){
case '+':sum+=a;break;
case '-':sum-=a;break;
case '*':sum*=a;break;
case '/':
if(a==0){
printf("ERROR");
return 0;
}
else sum/=a;
break;
default:printf("ERROR");
return 0;
}
}
printf("%d",sum);
return 0;
}
习题6-8 单词首字母大写 (15 分)
#include<stdio.h>
int main(){
char ch,prev=' ';
while((ch=getchar())!='\n'){
if (ch>='a'&&ch<='z'&&prev==' ') ch=ch-'a'+'A';
putchar(ch);
prev=ch;
}
return 0;
}
练习7-2 求最大值及其下标 (20 分)
#include<stdio.h>
int main(){
int n,i,max,index=0;
scanf("%d",&n);
int a[n];
for(i=0;i<n;i++)scanf("%d",&a[i]);
max=a[0];
for(i=0;i<n;i++){
if(a[i]>max){
max=a[i];
index=i;
}
}
printf("%d %d",max,index);
return 0;
}
练习7-3 将数组中的数逆序存放 (20 分)
#include<stdio.h>
int main(){
int n,i;
scanf("%d",&n);
int a[n];
for(i=n-1;i>=0;i--)scanf("%d",&a[i]);
for(i=0;i<n-1;i++)printf("%d ",a[i]);
printf("%d",a[n-1]);
return 0;
}
练习7-4 找出不是两个数组共有的元素 (20 分)
#include <stdio.h>
int main() {
int n, m, i, j, flag,cnt=0;
scanf("%d", &n);
int a[n];
for (i = 0; i < n; i++)scanf("%d", &a[i]);
scanf("%d", &m);
int b[m];
int s[m+n];
for (j = 0; j < m; j++)scanf("%d", &b[j]);
for (i = 0; i < n; i++) {
flag = 0;
for (j = 0; j < m; j++) {
if (a[i] == b[j]) {
flag = 1;
break;
}
}
if (flag == 0) {
s[cnt]=a[i];
cnt++;
}
}
for (j = 0; j < m; j++) {
flag = 0;
for (i = 0; i < n; i++) {
if (a[i] == b[j]) {
flag = 1;
break;
}
}
if (flag == 0) {
s[cnt]=b[j];
cnt++;
}
}
printf("%d",s[0]);
for(i=1;i<cnt;i++){
flag=0;
for(j=0;j<i;j++){
if(s[i]==s[j]){
flag=1;
break;
}
}
if(flag==0)printf(" %d",s[i]);
}
return 0;
}
练习7-7 矩阵运算 (20 分)
#include<stdio.h>
int main(){
int i,n,j,s=0;
scanf("%d",&n);
int a[n][n];
for(i=0;i<n;i++)for(j=0;j<n;j++)scanf("%d",&a[i][j]);
for(i=0;i<n;i++)for(j=0;j<n;j++)if(j!=n-1-i&&i!=n-1&&j!=n-1)s+=a[i][j];
printf("%d",s);
return 0;
}
练习7-8 方阵循环右移 (20 分)
#include<stdio.h>
int main(){
int m,n,i,j;
scanf("%d %d",&m,&n);
int a[m][n],b[m][n];
m=m%n;
for(i=0;i<=n-1;i++)for(j=0;j<=n-1;j++)scanf("%d ",&a[i][j]);
for(i=0;i<=n-1;i++){
for(j=0;j<=n-1;j++){
if(j+m>(n-1))b[i][j+m-n]=a[i][j];
else b[i][j+m]=a[i][j];
}
}
for(i=0;i<=n-1;i++){
for(j=0;j<=n-1;j++)printf("%d ",b[i][j]);
printf("\n");
}
return 0;
}
练习7-9 计算天数 (15 分)
#include <stdio.h>
int main(){
int i,year,month,day,n=0,
a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
scanf("%d/%d/%d",&year,&month,&day);
if((year%4==0&&year%100)||year%400==0)a[2]=29;
for(i=1;i<month;i++)n+=a[i];
printf("%d",n+day);
return 0;
}
练习7-10 查找指定字符 (15 分)
#include<stdio.h>
int main(){
char ch,c[80];
int i=0,j,flag=0,index;
ch=getchar();
getchar();
while((c[i]=getchar())!='\n')i++;
for(j=0;j<i;j++)
if(ch==c[j]){
index=j;
flag=1;
}
if(flag==1)printf("index = %d",index);
else printf("Not Found");
return 0;
}
练习7-11 字符串逆序 (15 分)
#include <stdio.h>
int main(){
int n=0,i;
char a[80];
while((a[n]=getchar())!='\n')n++;
for(i=n-1;i>=0;i--)printf("%c",a[i]);
return 0;
}
习题7-1 选择法排序 (20 分)
#include<stdio.h>
int main(){
int i,j,n,temp;
scanf("%d",&n);
int a[n];
for(i=0;i<n;i++)scanf("%d",&a[i]);
for(i=0;i<n;i++){
temp = a[i];
for(j=i;j<n;j++)
if(a[j]>a[i]){
a[i] = a[j];
a[j] = temp;
temp = a[i];
}
}
printf("%d",a[0]);
for(int i=1;i<n;i++)printf(" %d",a[i]);
}
习题7-2 求一批整数中出现最多的个位数字 (20 分)
#include<stdio.h>
int main(){
int n,cnt_max,i;
scanf("%d",&n);
int a[n],b[10]={0};
for(i=0;i<n;i++)scanf("%d",&a[i]);
for(i=0;i<n;i++){
do{
b[a[i]%10]++;
a[i]/=10;
}while(a[i]!=0);
}
cnt_max=b[0];
for(i=1;i<10;i++)if(cnt_max<b[i])cnt_max=b[i];
printf("%d:",cnt_max);
for(i=0;i<10;i++)if(b[i]==cnt_max)printf(" %d",i);
return 0;
}
习题7-3 判断上三角矩阵 (15 分)
#include <stdio.h>
int main(){
int T,i,j,k,l,flag;
scanf("%d",&T);
int a[T];
int b[T][11][11];
for(i=0;i<T;i++){
scanf("%d",&a[i]);
j = a[i];
for(k=0;k<j;k++)
for(l=0;l<j;l++)
scanf("%d",&b[i][k][l]);
}
for(i=0;i<T;i++){
j = a[i];
flag = 1;
for(k=1;k<j;k++){
for(l=0;l<k;l++){
if(b[i][k][l]){
flag=0;
break;
}
}
if(!flag)break;
}
if(flag)printf("YES\n");
else{
printf("NO\n");
flag = 0;
}
}
return 0;
}
习题7-4 求矩阵各行元素之和 (15 分)
#include<stdio.h>
int main(){
int m,n,sum=0;
scanf("%d %d",&m,&n);
int a[m][n],i,j;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
for(i=0;i<m;i++){
for(j=0;j<n;j++)
sum+=a[i][j];
printf("%d\n",sum);
sum=0;
}
return 0;
}
习题7-5 找鞍点 (20 分)
#include<stdio.h>
int main(){
int n,i,j,k;
int max,flag;
scanf("%d",&n);
int a[n][n];
for(i=0;i<n;i++)for(j=0;j<n;j++)scanf("%d",&a[i][j]);
for(i=0;i<n;i++){
max=0;
for(j=0;j<n;j++)if(a[i][j]>=a[i][max])max=j;
flag=1;
for(k=0;k<n;k++)if(a[i][max]>a[k][max])flag=0;
if(flag){
printf("%d %d\n",i,max);
break;
}
}
if(flag==0)printf("NONE");
return 0;
}
习题7-6 统计大写辅音字母 (15 分)
参考答案1
if分支
#include<stdio.h>
int check ( char c ){
if( c<'A' || c>'Z' ) return 0;
if(c!='A'&&c!='E'&&c!='I'&&c!='O'&&c!='U')
return 1;
else return 0;
}
int main(){
char a[80];
int cnt=0,i=0;
while((a[i]=getchar())!='\n')i++;
for(i=0;a[i]!='\n';i++)
cnt+=check (a[i]);
printf("%d",cnt);
return 0;
}
参考答案2
switch-case分支
#include <stdio.h>
int check ( char c ){
int ret;
if ( c<'A' || c>'Z' ) return 0;
switch (c) {
case 'A':
case 'E':
case 'I':
case 'O':
case 'U':
ret=0; break;
default: ret=1; break;
}
return ret;
}
int main(){
char c;
int cnt = 0;
while ( (c=getchar())!='\n' )
cnt += check(c);
printf("%d\n", cnt);
return 0;
}
习题7-7 字符串替换 (15 分)
参考答案1
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main(){
char str[81];
gets(str);
for( int i=0; i<strlen(str); i++ )
if( isupper(str[i]) )str[i]='A'+'Z'-str[i];
for( int i=0; i<strlen(str); i++ )printf("%c",str[i]);
return 0;
}
参考答案2
自定义函数
#include <stdio.h>
#include <string.h>
int isupper(char c){
int isupper=0;
if(c>='A'&&c<='Z')isupper=1;
return isupper;
}
int main(){
char str[81];
gets(str);
for( int i=0; i<strlen(str); i++ )
if( isupper(str[i]) )str[i]='A'+'Z'-str[i];
for( int i=0; i<strlen(str); i++ )printf("%c",str[i]);
return 0;
}
习题7-8 字符串转换成十进制整数 (15 分)
#include<stdio.h>
int main(){
int i=0,j,flag=0,n=0;
char ch,a[80];
a[0]='\0';
while((ch=getchar())!='#'){
if(ch=='-'&&a[0]=='\0'){
a[i]=ch;
i++;
}
if((ch>='a'&&ch<='f')||(ch>='A'&&ch<='F')||(ch>='0'&&ch<='9')){
a[i]=ch;
i++;
flag=1;
}
}
if(a[0]=='-'&&flag)printf("-");
j=i;
for(i=0;i<j;i++){
if(a[i]>='0'&&a[i]<='9')n=n*16+a[i]-'0';
else if(a[i]>='A'&&a[i]<='Z')n=n*16+a[i]-'A'+10;
else if(a[i]>='a'&&a[i]<='z')n=n*16+a[i]-'a'+10;
}
printf("%d",n);
return 0;
}
习题8-7 字符串排序 (20 分)
#include<stdio.h>
#include<string.h>
#define N 5
#define M 80
int main(){
char str[N][M]={'0'};
int i,j;
for(i=0;i<N;i++)scanf("%s",str[i]);
char temp[M];
for(i=0;i<N;i++){
for(j=i+1;j<N;j++){
if(strcmp(str[i],str[j]) >= 0){
strcpy(temp, str[i]);
strcpy(str[i], str[j]);
strcpy(str[j], temp);
}
}
}
printf("After sorted:\n");
for(int i=0;i<N;i++)printf("%s\n",str[i]);
return 0;
}
习题8-10 输出学生成绩 (20 分)
本题题干建议使用动态内存分配
#include<stdio.h>
#include<stdlib.h>
int main(){
int n,i;
scanf("%d",&n);
float *score,sum,average,min,max;
score=(float*)malloc(sizeof(n*score[0]));
scanf("%f",&score[0]);
min=score[0];
max=score[0];
sum=score[0];
for(i=1;i<n;i++){
scanf("%f",&score[i]);
if(score[i]>max)max=score[i];
if(score[i]<min)min=score[i];
sum+=score[i];
}
average=sum/n;
printf("average = %.2f\n",average);
printf("max = %.2f\n",max);
printf("min = %.2f",min);
free(score);
return 0;
}
习题9-1 时间换算 (15 分)
#include <stdio.h>
struct time {
int h, m, s;
} T;
int main(){
int n;
scanf("%d:%d:%d\n", &T.h, &T.m, &T.s);
scanf("%d", &n);
T.s += n;
if (T.s >= 60) {
T.s -= 60;
T.m++;
if (T.m >=60) {
T.m -= 60;
T.h++;
if (T.h==24) T.h = 0;
}
}
printf("%02d:%02d:%02d\n", T.h, T.m, T.s);
return 0;
}
习题9-3 平面向量加法 (15 分)
#include <stdio.h>
struct Vec {
double x, y;
};
int main(){
struct Vec v1, v2;
double x,y;
scanf("%lf %lf %lf %lf", &v1.x, &v1.y, &v2.x, &v2.y);
x = v1.x + v2.x;
y = v1.y + v2.y;
if ((x>-0.05) && (x<0)) x = 0.0;
if ((y>-0.05) && (y<0)) y = 0.0;
printf("(%.1f, %.1f)", x, y);
return 0;
}
习题9-4 查找书籍 (20 分)
参考答案1
#include <stdio.h>
#include <string.h>
struct Book{
double price;
char name[31];
};
int main(){
int n;
scanf("%d",&n);
struct Book book[n];
int i,max = 0,min = 0;
for(i=0; i<n; i++){
getchar();
gets(book[i].name);
scanf("%lf",&book[i].price);
if(book[i].price>book[max].price)max = i;
if(book[i].price<book[min].price)min = i;
}
printf("%.2lf, %s\n",book[max].price,book[max].name);
printf("%.2lf, %s\n",book[min].price,book[min].name);
return 0;
}
参考答案2
学习使用enum
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef enum{false, true} bool;
struct book_info {
double price;
char name[31];
};
int main(){
int n;
struct book_info highest, lowest, cur;
bool first = true;
scanf("%d\n", &n);
while(n--) {
gets(cur.name);
scanf("%lf\n", &cur.price);
if(first) {
highest.price = cur.price;
strcpy(highest.name, cur.name);
lowest.price = cur.price;
strcpy(lowest.name, cur.name);
first = false;
continue;
}
if(cur.price > highest.price) {
highest.price = cur.price;
strcpy(highest.name, cur.name);
} else if(cur.price < lowest.price) {
lowest.price = cur.price;
strcpy(lowest.name, cur.name);
}
}
printf("%.2f, %s\n", highest.price, highest.name);
printf("%.2f, %s\n", lowest.price, lowest.name);
return 0;
}
习题9-5 通讯录排序 (20 分)
参考答案1
自定义选择排序
#include <stdio.h>
#include <stdlib.h>
struct friends {
char name[11];
int birth;
char tele[18];
} friend[11];
void sort(struct friends friend[],int n){
struct friends temp;
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
if(friend[i].birth>friend[j].birth){
temp=friend[i];
friend[i]=friend[j];
friend[j]=temp;
}
}
}
}
int main() {
int n, i;
scanf("%d", &n);
for (i = 0; i < n; i++) {
getchar();
scanf("%s%d%s", friend[i].name, &friend[i].birth, friend[i].tele);
}
sort(friend, n);
for (i = 0; i < n; i++) printf("%s %d %s\n", friend[i].name, friend[i].birth, friend[i].tele);
return 0;
}
参考答案2文章来源:https://www.toymoban.com/news/detail-782697.html
qsort排序
文章来源地址https://www.toymoban.com/news/detail-782697.html
#include <stdio.h>
#include <stdlib.h>
struct friends {
char name[11];
int birth;
char tele[18];
} friend[9];
int cmp(const void *a, const void *b) {
return ((struct friends *)a)->birth > ((struct friends *)b)->birth;
}
int main() {
int n, i;
scanf("%d", &n);
for (i = 0; i < n; i++) {
getchar();
scanf("%s%d%s", friend[i].name, &friend[i].birth, friend[i].tele);
}
qsort(friend, n, sizeof(struct friends), cmp);
for (i = 0; i < n; i++) printf("%s %d %s\n", friend[i].name, friend[i].birth, friend[i].tele);
return 0;
}
到了这里,关于PTA 浙大版《C语言程序设计(第4版)》题目集 参考答案(编程题)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!