C程序设计-方法与实践(江西财经大学计算机考研831)课后习题解析

考研自用,不一定每题都写,有的太简单的或者阅读题需要直接出输出结果的就直接写书上了。大家对代码有什么问题也可以指出,一起学习。
本文参考C程序设计-方法与实践(清华大学出版社)习题解析如果要看更完整的解析可以看他的噢。

习题 2.1
计算函数y的值。

#include<stdio.h>
 int main(){
	int x,y;
	scanf("%d",&x);
	if(x<1)y=x;
	if(x>=1&&x<10)y=2*x-1;
	if(x>=10)y=3*x+11;
	printf("%d",y);
	return 0;
} 

习题2.2
找出一元三次方程的求根公式。

篇幅过长这里位置太小写不下。

习题2.3
求三个数中 的最小数

#include<stdio.h>
int main(){
	int x,y,z;
	scanf("%d %d %d",&x,&y,&z);
	if(x>y){
		if(y>z)printf("%d",&z);//如果x>y>z输出z,否则输出y
		else printf("%d",&y);
	}else if(x>z)printf("%d",z);//如果z<x<y,输出z,否则输出x
	else printf("%d",&x);
	return 0;
}

习题2.4
变量赋值

#include<stdio.h>
int main(){
	int x,y;
	scanf("%d %d",&x,&y);
	if(x>y)printf(%d %d,x,x-y);
	else printf("%d %d",y,y-x);
	return 0;
}

习题2.5

#include<stdio.h>
int main(){
	int sum=0;
	for(int i=1;i<100;i+=2)//每次+2;
		sum+=i;
	printf("%d",sum);
	return 0;
}

习题2.6
统计1000以内的自然数的3的倍数之和

#include<stdio.h>
int main(){
	int sum=0;
	for(int i=1;3*i<1000;i++)
		sum+=i*3;
	printf("%d",sum);
}

习题2.7
输出0~360度中5的倍数的sin和cos值

在这里插入代码片

习题2.8
求正整数负整数零数量、和、平均值

#include<stdio.h>

int main(){
	int n,zz=0,fz=0,zero=0,zzs=0,fzs=0;
	for(int i=1;i<=20;i++){
		scanf("%d",&n);
		if(n>0)zz+=n,zzs++;
		else if(n<0)fz+=n,fzs++;
		else zero++;
	}
	printf("正整数:%d 负整数:%d 零:%d\n",zzs,fzs,zero);//正整数,负整数,0的数量
	
	printf("正整数之和:%d 负整数之和:%d\n",zz,fz);//正整数负整数之和

	printf("正整数平均值:%.2lf 负整数平均值:%.2lf\n",(double)zz/zzs,(double)fz/fzs));//正整数负整数平均值 
	return 0;
}

习题2.9
求最大正整数、最小正整数、最大负整数、最小负整数

#include<stdio.h>

int main(){
	int n,maxint=0,minint=1e9,maxfint=-1e9,minfint=0;
	for(int i=1;i<=20;i++){
		scanf("%d",&n);
		if(n>0){
			maxint = n > maxint ? n : maxint;
			minint = n < minint ? n : minint;
		}else if(n<0){
			maxfint = n > maxfint ? n : maxfint;
			minfint = n < minfint ? n : minfint;
		}
	}
	printf("%d %d %d %d",maxint,maxfint,minint,minfint);
	return 0;
}

习题3.4
去掉最大最小值求平均值

#include <stdio.h>
int main() {
	int m,sum=0,max=-1,min=1e9;
	for(int i=1;i<=10;i++){
		scanf("%d",&m);
		sum+=m;
		if(m>max)max=m;
		if(m<min)min=m;
	}
	printf("%d\n",sum);
	printf("%.3lf\n",(double)(sum-max-min)/8);
	return 0;
}

习题3.5
求相邻两个数的差值

#include<stdio.h>

int main(){
	int a[11]={0};
	for(int i=1;i<=10;i++)scanf("%d",&a[i]);
	for(int i=2;i<=10;i++)printf("%d ",a[i]-a[i-1]);
	return 0;
}

习题3.6
输出字符串中askii码中最大的字符

#include<stdio.h>
#include <string.h>

int main(){
	char s[1005];
	scanf("%s",s);
	int max=s[0];
	int len=strlen(s);
	for(int i=0;i<len;i++){
		max=s[i]>max?s[i]:max;
	}
	printf("%c",max);
	return 0;
}

习题3.7
计算字母出现次数

#include<stdio.h>
#include<string.h>


int main(){
	char s[1005];
	int num[200]={0};
	scanf("%s",s);
	int len=strlen(s);
	for(int i=0;i<len;i++){
		num[(int)s[i]]++;
	}
	for(char c='A';c<='Z';c++){
		printf("%c出现的次数为:%d\n",c,num[(int)c]);
	}
	for(char c='a';c<='z';c++){
		printf("%c出现的次数为:%d\n",c,num[(int)c]);
	}
	return 0;
}

习题3.8
判断是否为空串

#include<stdio.h>
#include<string.h>
int main(){
	char s[1005];
	scanf("%s",s);
	int len=strlen(s);
	if(len!=0)printf("%s",s);
	else printf("你输入的是空串");	
	return 0;
}

习题4.8
日期转换

#include<stdio.h>

int main(){
	int n;
	scanf("%d",&n);
	printf("%d周%d天",n/7,n%7);
	return 0;
}

习题4.9、4.10通用
反向输出数字

#include<stdio.h>
int main(){
	int n;
	scanf("%d",&n);
	while(n){
		printf("%d",n%10);
		n/=10;
	}
	return 0;
}

习题4.11
计算1~10的平方和

#include<stdio.h>
int main(){
	int sum=0;
	for(int i=1;i<=10;i++){
		sum+=i*i;
	}
	printf("%d",sum);
	return 0;
}

习题5.6
ASKII码字符比较,可以直接进行比较。

#include<stdio.h>

int main(){
	char n;
	scanf("%c",&n); 
	if(n<32){
		printf("控制字符\n");
	}
	else if(n>=48&&n<=57){
		printf("数字字符\n");
	}
	else if(n>=65&&n<=90){
		printf("大写字符\n");
	}
	else if(n>=97&&n<=122){
		printf("小写字符\n");
	}
	else printf("其他字符\n");
	
	
	return 0;
}

习题5.8
(1)
语法题一个一个判断就行

#include<stdio.h>
int main(){
	int x;
	scanf("%d",&x);
	if(x<-5){
		x=x*3+10;
	}else if(x>=-5&&x<0){
		;
	}else if(x==0){
		x=0;
	}else if(x>0&&x<=5){
		x*=2;
	}else if(x>5){
		x=x*4-10;
	} 
	printf("%d",x);
	
	return 0;
}

(2)
简单冒泡排序

#include<stdio.h>

int main(){
	int num[4]={};
	for(int i=1;i<=3;i++){
		scanf("%d",&num[i]);
	}
	for(int i=1;i<3;i++){
		for(int j=1;j<=2;j++){
			if(num[j]>num[j+1]){
				int t=num[j];
				num[j]=num[j+1];
				num[j+1]=t;
			}
		}
	}
	for(int i=1;i<=3;i++)printf("%d ",num[i]);
	
	return 0;
}

(3)
分支结构

#include<stdio.h>
int main(){
	int score,x5=0,x6=0,x7=0,x8=0,x9=0;
	for(int i=1;i<=20;i++){
		scanf("%d",&score);
		if(score<60)x5++;
		else if(score>=60&&score<70)x6++;
		else if(score>=70&&score<80)x7++;
		else if(score>=80&&score<90)x8++;
		else if(score>=90)x9++;
	} 
	printf("90及90分以上人数有:%d\n", x9);
	printf("80-89分人数有:%d\n", x8);
	printf("70-79分人数有:%d\n", x7);
	printf("60-69分人数有:%d\n", x6);
	printf("60分以下人数有:%d\n", x5);
	return 0;
}

习题6.3.4
求s=a+aa+aaa+…

#include<stdio.h>

int main(){
	int n,a,sum=0;
	scanf("%d %d",&n,&a);
	int single=a;//将个位记录起来
	for(int i=1;i<=n;i++){
		sum+=a;
		a*=10;//每次乘10升位
		a+=single;//之后再加上个位数
	}
	printf("%d",sum);	
	return 0;
}

习题6.3.5

#include<stdio.h>

int main(){
	int n;
	double count=0;
	scanf("%d",&n);
	while(n>0){
		if(n<=10)count+=n*1.5,n=-1;//如果点歌时间不超过十分钟,金额为n*1.5; 
		else if(n>10&&n<=120)count+=15+(n-10),n=-1;//如果在10到120分钟之间,先加上10分钟的,在加上剩余的n分钟(元); 
		else if(n>120)count+=165,n-=360;//如果大于两个小时,就加上两个小时内的金额并减去6个小时的时间,这时如果大于六个小时则会进入下次循环。 
	}
	printf("%.3lf",count);
	return 0;
}

习题6.4.1
求给定值满足abc+cba=n的所有abc组合

#include<stdio.h>

int main(){
		int n,flag=0;
		scanf("%d",&n);
		for(int i=100;i<=999;i++){
			int t=i,s=0;
			while(t){
				s*=10;
				s+=t%10;
				t/=10;
			}
			if(i+s==n)printf("%d %d %d\n",i,s,n),flag=1;
		}
	if(!flag)printf("不存在ABC组合"); 
	return 0;
}

习题6.4.2
百文钱买百只鸡,枚举,每次公鸡3+母鸡2+小鸡/3看是不是100文钱,之后在将小鸡数量相加看是不是一百只。

#include<stdio.h>

int main(){
	for(int i=0;i<=100;i++){//公鸡
		for(int j=0;j<=100;j++){//母鸡
			for(int k=0;k<=100;k+=3){//这里每次一定要+3而不能+1,因为我们每次除的必须是3的倍数,否则答案会错误
				if((i*3+j*2+k/3)==100&&i+j+k==100)printf("%d %d %d\n",i,j,k);
			}	
		}
	} 
	return 0;
}

习题6.4.4
思想:通过数组1~9的下标是否为1来判断是否出现了重复,如果有数组为0则说明出现了重复,通过除模取余等运算每次拿到数字中的一位,然后将他赋值给数组。

#include<stdio.h>

int main(){
	int a[12]={0},flag=0;
	for(int i=100;i<=999;i++){ //循环100~999,并且将i*2,i*3分别赋值
		int k=i,s=i*2,t=i*3,flag=0;
		while(k){a[k%10]=1;k/=10;}//将k的每一位赋值给数组
		while(s){a[s%10]=1;s/=10;}//将s的每一位赋值给数组
		while(t){a[t%10]=1;t/=10;}//将t的每一位赋值给数组
		for(int j=1;j<10;j++){ //遍历数组,如果有为0的,说明这组数出现了重复,将flag置为1
			if(!a[j]){
				flag=1;
				a[j]=0;	//不管重复没重复都要将a[j]置为0方便下次遍历
			}else a[j]=0;
		}
		if(!flag&&i*3<1000)printf("%d %d %d\n",i,i*2,i*3);//最后判断flag是否出现了重复,如果没出现并且i*3<1000则输出
	}
	return 0;
}

习题6.4.6
求同构数

#include<stdio.h>

int main(){
	for(int i=2;i<=1000;i++){
		if(i>1&&i<10){
			if((i*i)%10==i)printf("%d\n",i);		
		}if(i>9&&i<100){
			int t=i*i,g,s;
			g=t%10;//取个位 
			t/=10;
			s=t%10;//取十位
			if((s*10+g)==i)printf("%d\n",i); 
		}if(i>99&&i<1000){
			int t=i*i,g,s,b;
			g=t%10;//取个位 
			t/=10;
			s=t%10;//取十位
			t/=10;
			b=t%10;//取百位
			if((b*100+s*10+g)==i)printf("%d\n",i); 
		}
	}
	return 0;
}

习题6.4.7
阿姆斯特朗数

#include<stdio.h>

bool check(int n,int kk){
	int sum=0,t=n;
	while(t){
		int s=t%10; 
		int k=kk; //每次将kk的值赋值给k,这样即使while循环把k减完了我们依旧可以重新赋值 
		while(k){ //累乘k次 
			k--;
			s*=t%10;
		}
		sum+=s;//每次加上当前数位的kk次方 
		t/=10;
	}
	if(sum==n)return true;
	else return false;
}
int main(){
	for(int i=10;i<=99;i++)if(check(i,1))printf("%d\n",i);
	for(int i=100;i<=999;i++)if(check(i,2))printf("%d\n",i);
	for(int i=1000;i<=9999;i++)if(check(i,3))printf("%d\n",i);
	for(int i=10000;i<=99999;i++)if(check(i,4))printf("%d\n",i);
	return 0;
}

习题7.5.2
打印字符

#include<stdio.h>

void prn_pict(int m,int n){
	for(int i=0;i<m;i++){
		char c='A'+i;
		for(int j=1;j<=n;j++){
			printf("%c",c);
		}
		printf("\n");
	}
}

int main(){
	int n,m;
	scanf("%d %d",&n,&m);
	prn_pict(n,m);
	return 0;
}

习题7.6
求最大公约数、最小公倍数

#include<stdio.h>
int gcd(int a,int b){//最大公约数
	int tmp = 1;
	while (tmp)
	{
		tmp = a % b;
		a = b;
		b = tmp;
	}
	return a;
}
int min(int c , int d) {//最小公倍数
	int tmp;
	tmp = c * d / gcd(c, d); //两数相乘再除于他们的最大公约数得出最小公倍数 
	return tmp ;
}
int main(){
	int n,m;
	scanf("%d %d",&n,&m);
	printf("%d\n",gcd(n,m)); 
	printf("%d\n",min(n,m)); 
	return 0;
}

习题7.7
求离数值x最近的fibo数列的值

#include<stdio.h>

int n,a[1005]={0};
int nearest_fibo(int x){
	for(int i=2;i<=x;i++){
		if(a[i]<=x&&a[i+1]>=n){ //如果a[i]的值小于等于x并且a[i+1]的值大于等于x
			int result= x-a[i] < a[i+1]-x ? a[i] : a[i+1];//通过做差找到哪个值离它最近
			printf("%d",result);
			break;
		}
	}
	return 0;
}

int main(){
	a[1]=a[2]=1;
	for(int i=3;i<=1005;i++){
		a[i]=a[i-1]+a[i-2];
	}
	scanf("%d",&n);
	nearest_fibo(n);
	return 0;
} 

习题7.10
计算年龄和距离下一次生日的天数

#include<stdio.h>

int main(){
	int a[13]={0,31,0,31,30,31,30,31,31,30,31,30,31};
	int d,m,y,nd,nm,ny,birthday=0;
	scanf("%d %d %d %d %d %d",&y,&m,&d,&ny,&nm,&nd);
	if((y%100!=0&&y%4==0)||y%400==0)a[2]=29;//判断二月份
	else a[2]=28;
	if(nm>m||(nm==m&&nd>=d)){ //计算周岁 
		//如果今年已经过过生日
		birthday+=a[nm]-d+a[m];//先把当前这个月和过生日那个月的天数加上 
		for(int i=nm+1;i<12;i++)birthday+=a[i];//加上今年剩余的 
		for(int i=1;i<m;i++)birthday+=a[i];//加上明年的 
		printf("%d %d\n",ny-y,birthday);
	}else {
		//如果今年还没过过生日
		birthday+=a[nm]-d+a[m];//先把当前这个月和过生日那个月的天数 
		for(int i=nm+1;i<m;i++)birthday+=a[i];//加上中间完整的几个月 
		printf("%d %d\n",ny-y-1,birthday);	
	}
	
	
	return 0;
}

习题11.3

#include<stdio.h>

struct student{ //用结构体存储
	int id;
	char name[50];
	int yw,sx,yy;
	float ave;
}stu[41];

int main(){
	for(int i=1;i<=40;i++){ //输入数据并计算平均值
		scanf("%d %s %d %d %d",
		&stu[i].id,&stu[i].name,&stu[i].yw,&stu[i].sx,&stu[i].yy);
		stu[i].ave=(stu[i].yw+stu[i].sx+stu[i].yy)/3;
	}
	for(int i=1;i<40;i++){
		for(int j=1;j<=40-i;j++){ //按照平均值从小到大排序
			if(stu[j].ave<stu[j+1].ave){
				student tmp=stu[j];
				stu[j]=stu[j+1];
				stu[j+1]=tmp;
			}
		}
	}
	for(int i=1;i<=5;i++){
			printf("%s %.3f\n",stu[i].name,stu[i].ave);
	}	
	return 0; 
}
/*
1 xiaonie 20 30 100
2 xiaoniu 50 100 10
3 xiaozhu 15 25 95
*/

习题11.4

#include<stdio.h>
struct directory{
	char id[5];
	char name[50];
	char num[50];
}drt[50];
int main(){
	for(int i=1;i<=3;i++){
		gets(drt[i].id);
		gets(drt[i].name);
		gets(drt[i].num);
	}
	printf("工作证号   姓名  	 电话号码\n");
	for(int i=1;i<=3;i++){
		printf("%-10s %-10s %-15s\n",drt[i].id,drt[i].name,drt[i].num);
	}
	return 0;
}
/*
201
Li Min
86214756
204
Gong Li zheng
86238556
218
Kong Ping
86222800
*/
  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
广州大学操作系统课后习题zyl主要涉及操作系统的基本概念、功能和特征。学习这些习题可以帮助我们更好地理解操作系统的工作原理和应用场景。 首先,操作系统是计算机系统中的核心软件,它负责管理和控制计算机硬件资源,并为用户和应用程序提供服务。习题zyl中可能会涉及到操作系统的功能,如进程管理、内存管理、文件系统管理等。我们需要学习各个管理模块的基本概念和功能。 其次,操作系统有着不同的特征和分类。习题zyl可能会要求我们了解操作系统的特征,如并发性、共享性、虚拟性、异步性等。我们需要对这些特征有深入的理解,并能够应用到具体的操作系统场景中。 此外,习题可能还会要求我们掌握操作系统的基本概念和术语,如进程、线程、调度算法、页表等。这些概念是操作系统的基础,也是我们理解和使用操作系统的前提。 为了更好地完成习题zyl,我们可以采取以下学习方法:首先,认真听讲课堂上的操作系统相关知识,掌握基本概念和原理。其次,多做一些操作系统实验和编程练习,提高对操作系统的实际应用能力。最后,多和同学、老师或者在线讨论区交流,共同解决习题中的难题。 通过认真学习和应用,我们将能够更好地掌握操作系统的基本知识和技能,为我们的学业和职业发展打下坚实的基础。同时,操作系统作为计算机科学的重要基础学科,对我们理解计算机原理和技术具有重要作用。因此,我们应该积极投入到操作系统习题的学习中,提高对操作系统的理解和应用水平。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

这咋又bug了嘛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值