C语言复习题

大一老师给了一个C语言的复习题,但是感觉班上可能其他人都没有写,现在重新回过头看一下,如果有错误希望大家能够指出

转载请注明出处,尊重作者劳动成果。

1、输入10个实数,去掉一个最大数,去掉一个最小数,输出剩下8个数的平均数。

这个题目最开始的想法是保存10个实数可以用到数组,把最大值和最小值值移动到最前面,然后计算的时候就从下标为2的开始计算,也就是这样:

#include<stdio.h>
int main(){
	int arr[10];
	int i,x,y;
	double sum=0;
	printf("请输入10个整数:");
	for(i=0;i<10;i++)
		scanf("%d",&arr[i]);//输入10个整数
	for(i=0;i<10;i++){
		if(arr[0]<arr[i]){
			x=arr[i];arr[i]=arr[0];arr[0]=x;//最大值和arr[0]进行调换
		}
		if(arr[1]>arr[i]){
			y=arr[i];arr[i]=arr[1];arr[1]=y;//最小值和arr[1]进行调换
		}
	}
	for(i=2;i<10;i++){
		sum+=arr[i];//剩下8个数实现累加
	}
	sum/=8;//求平均值
	printf("%f\n",sum);
	return 0;
}

这个问题就是对于10个实数是用了一个整型数组来存储,并没有考虑浮点数的情况,所以这个数组应该改成double类型的。这个程序的意思就是将最大值放在0号位置,最小值放在1号位置,从2号位置开始累计求和到sum,对sum进行除8就得到的平均值。就是这种调换我当时记得是出了一种问题,现在不太能想起来了,这里可以用一个max和min变量以及sum变量来分别统计最大值,最小值和总和,然后用总和减去最大值和最小值即可,最后就是除8求平均值了。实现就是这样:

#include<stdio.h>
int main(){
	double arr[10];
	double max,min,sum,avg;
	int i=0;
	//得到十个实数
	printf("请输入10个实数:");
	for(i=0;i<10;i++){
		scanf("%lf",&arr[i]);
	}
	//赋初值,初值应该是数组中的元素
	max=min=sum=avg=arr[0];
	for(i=1;i<10;i++){
		//记录最大值
		if(max<arr[i]){
			max=arr[i];
		}
		//记录最小值
		if(min>arr[i]){
			min=arr[i];
		}
		//求总和
		sum+=arr[i];
	}
	//总和去掉一个最大值和一个最小值
	sum=sum-max-min;
	//求平均值
	avg=sum/8;
	printf("平均值为%lf\n",avg);
	return 0;
}

这种方法我感觉就更加容易理解一点,要注意的是用scanf来得到double类型的数据用的是%lf,而不是%f。还有就是对于max和min的初值问题,首先是他赋初值的位置不能是在还没输入数据之前,在之前会导致max和min里面的值仍旧是随机数,一般就是一个类似这样的数-858993460,最大值还好,如果是求最小值的话,很大的可能就仍旧是随机数,再者就是不能赋初值为0,取一个极端的假设,当数组里面的元素都是负数的时候,初值为0就是最大值,但是0都不存在与数组当中,这显然是不成立的,所以初值应该是数组当中的元素,我是将0号位置的元素值赋值给max和min,也给sum变量,这样循环从1号位置开始就行了。我之前写程序是没有提示用户输入的语句printf("请输入10个实数:");后面我发现还是需要的,不然都不知道什么什么意思。

当然了这个也可以拓展一下,让用户先输入一个的整数n(n>2),然后去掉最大值和最小值,对剩下数的平均值,这个大家可以自己实现一下。

scanf函数输入double类型需要注意的地方_scanf double_wutieliu的博客-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/wutieliu/article/details/88054123

2、求的值。

这题目思路就很清晰了,先找规律,第一项又可以写成1/1,那这个式子的每一项的分子就都是1,分母的话每次都加上一个数,这个数又刚好和他的项数有关,第一项分母就是0+1,第二项的分母就是0+1+2,0+1又是上一项的分母值,也就是说需要保存上一项分母的值加上此时是第几项,第几项刚好是可以写在循环里面,整个下来就是这样:

#include<stdio.h>
int main(){
	int i=0,tmp=0;
	double sum=0;
	for(i=1;i<=50;i++){
		//求得每一项分母的值
		tmp+=i;
		//累加分项的结果
		sum+=(1.0/tmp);//1.960784
		//sum+=(1/tmp);//1.000000
	}
	printf("%lf\n",sum);
	return 0;
}

这里的话是用tmp的值是当做分母,最后一项的分母也没有越界,所以用int就行了,这就导致做除法的时候是1.0/tmp而不是1/tmp,区别就是整数做除法的时候结果是取整的,这个显示不是这个意思,所以需要用1.0而不是1来做除法。

C语言中的除法_c语言除法_生信猿人的博客-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_44952348/article/details/110522187

3、打印200~400之间的素数,每行输出15个数,每个数占5列。

首先求素数的话可以参考我之前写的。求法我就不赘述了,相信大家都知道了,接下来就是格式的问题,这个其实之前也有写到,每行15个数,可以通过取余来实现,当刚好是15的倍数的时候就可以输出换行,每一个数占5列可以用%5d来实现。求范围内的质数的个数_封奚泽优的博客-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_64066303/article/details/130451290?spm=1001.2014.3001.5501


(1条消息) %d,%05d,%-5d,%.5d的区分_岁忧的博客-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_46028214/article/details/112854472


#include<stdio.h>
#include<math.h>
#define ROW 15
int main(){
	//统计素数的个数
	int count=0;
	//仅仅判断奇数
	for(int i=201;i<400;i+=2){
		//求平方根,缩小范围
		double tmp=sqrt(i);
		//每次都先假设当前这个整数是质数
		bool flag=true;
		for(int j=2;j<=tmp;j++){
			//找到其他因子直接不符合要求了,跳出循环,标记不满足要求
			if(i%j==0){
				flag=false;
				break;
			}
		}
		//flag=true;说明此时这个数是质数
		if(flag){
			count++;
			if(count%ROW==0){
				printf("%5d\n",i);
			}else{
				printf("%5d",i);
			}
		}
	}
	printf("\n");
	return 0;
}

 

 开根号是需要#include<math.h>,可能会有人疑问为什么不直接出15,反而要用宏定义,这个话其实是用15没有实际的意思,所以我还是想养成一个好的习惯,当然注释也是每一个程序要有的,尽管我这里ROW也不是能很生动的表示他的含义。

4、求179869和196037的最大公约数。

欧几里得算法_百度百科 (baidu.com)icon-default.png?t=N7T8https://baike.baidu.com/item/%E6%AC%A7%E5%87%A0%E9%87%8C%E5%BE%97%E7%AE%97%E6%B3%95/1647675

#include<stdio.h>
int main(){
	int a=179869,b=196037;
	int tmp=a;
	//辗转相除法
	while(b!=0){
		tmp=a%b;//保存余数
		a=b;
		b=tmp;
	}
	printf("%d\n",a);//2021
	return 0;
}

这个要是理解了还是很好用的,这个我当时有一个疑问就是对于a和b的大小有要求吗,需要加上一个判断吗,这个其实可以直接假设,带入数值进去,如果a<b的时候tmp=a%b的值a,那么循环里面的效果其实就是a与b的值进行了交换,然后就是a>=b的效果一致了。这个后面我知道可能是不容易想到的,后面有看到了一种遍历的方法来求解。

#include<stdio.h>
int main(){
	int a=179869,b=196037;
	int gcd=1;//记录最大当前的公约数
	int k=2;//公约数的可能
	while(k<=a && k<=b){
		//直接是公约数的概念
		if(a%k==0 && b%k==0){
			//保存当前最大公约数
			gcd=k;
		}
		//判断下一个数值
		k++;
	}
	printf("%d\n",gcd);
	return 0;
}

这个是从小到大来判断,所以是要判断完,直到min(a,b)的时候才会停止,这就可以改成从大到小来判断,最先找到的就是最大的公约数了。


#include<stdio.h>
#define MIN(a,b) ((a)<(b)?(a):(b))
int main(){
	int a=179869,b=196037;
	int gcd=1;//记录最大当前的公约数
	int k=MIN(a,b);//公约数的可能
	while(k>1){
		//直接是公约数的概念
		if(a%k==0 && b%k==0){
			//保存当前最大公约数
			gcd=k;
			//找到既是最大
			break;
		}
		//判断下一个数值
		k--;
	}
	printf("%d\n",gcd);
	return 0;
}

5、斐波那契(Fibonacci)数列的前两项是1、1,后面每一项是前两项的和。求小于的最大斐波那契数。

斐波拉契数列还是比较经典的,那么要注意的就是边界的判断了,他是小于多少的值,随着项数的增加数值会越来越大,最开始的时候都是小于这个边界值的,所以其实小于他的边界不好判断,可以先求得大于他的时候,然后跳出,这个项之前的就都是小于他的了,这是我自己的思路。斐波那契数列_百度百科 (baidu.com)icon-default.png?t=N7T8https://baike.baidu.com/item/%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0%E5%88%97/99145?fr=aladdin

#include<stdio.h>
int main(){
	int F[100];
	F[0]=1;
	F[1]=1;//前两项的值都为1
	//前两项都是1,所以递推从第三项开始
	for(int i=2;i<100;i++){
		//递推公式
		F[i]=F[i-1]+F[i-2];
		//先找到大于1E7的值
		if(F[i]>1E7){
			//输出前一项的值
			printf("%d\n",F[i-1]);9227465
			break;
		}
	}
}

来表示可以直接写出来,但是0太多了,容易出错,所以我这里是用了1E7来表示,这个是合法的。循环设置这么大如果不提前break的话肯定是会越界的,这个越界就很明显了。

#include<stdio.h>
int main(){
	int F[100];
	int i=0;
	F[0]=1;
	F[1]=1;//前两项的值都为1
	//前两项都是1,所以递推从第三项开始
	for(i=2;i<100;i++){
		//递推公式
		F[i]=F[i-1]+F[i-2];
	}
	for(i=0;i<100;i++){
		printf("第%d项的值为:%d\n",(i+1),F[i]);
	}
	return 0;
}

 

6、 如果一个正整数数等于它各位数的立方之和,则称该数为水仙花数。例如,407是一个水仙花数。打印100~999之间的所有水仙花数。

像这种自幂数也是比较好判断的,这里还有很多类似的,感兴趣的也可以去求一下。

自幂数_百度百科 (baidu.com)icon-default.png?t=N7T8https://baike.baidu.com/item/%E8%87%AA%E5%B9%82%E6%95%B0/4397236?fromModule=lemma_inlink常用API-02-练习:两道数学算法题_哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV17F411T7Ao?p=156&vd_source=7c3bfbf39d037fe80c97234396acc524

#include<stdio.h>
#include<math.h>
int main(){
	int tmp=0;
	//确定区间的范围
	for(int i=100;i<1000;i++){
		//求各位数的立方之和
		tmp=pow(i/100,3)+pow(i/10%10,3)+pow(i%10,3);
		//判断是否相等
		if(i==tmp){
			printf("%d\n",tmp);
		}
	}
}

 这个要就立方我就用到了pow,然后就是用i%10就可以得到个位数上的数值,然后先i/10%10就先除10然后求余这个得到十位数上面的数值也很容易理解,以此类推就可以得到每一位了,你要说最高位要不要求余,这其实都一样,想保持一致也行。

(2条消息) 得到一个数字中每一位的数字_对于一个位数会变的数,怎么求各个位的数_meishadevs的博客-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/u010105970/article/details/25958279

7、求解百钱买百鸡问题:鸡翁一,钱值五;鸡母一,钱值三;鸡雏三,钱值一。欲百钱买百鸡,鸡翁、鸡母、鸡雏各几何(要求每个鸡种至少有一只)?

这种题目就和鸡兔同笼一样了,虽然计算机不能设x,y,但是他擅长的是可以枚举每一种可能,然后判断每一种可能是否可行,最后输出满足要求的结果即可。

#include<stdio.h>
int main(){
	for(int x=1;x<20;x++){//枚举鸡翁的可能
		for(int y=1;y<33;y++){//枚举鸡母的可能
			for(int z=3;z<100;z+=3){//枚举鸡雏的可能
				//百鸡
				if(x+y+z==100){
					//百钱
					if(5*x+3*y+z/3==100){
						printf("鸡翁有:%d,鸡母有:%d,鸡雏有:%d\n",x,y,z);
					}
				}
			}
		}
	}
	printf("\n");
	return 0;
}

这里虽然是枚举,但是也要尽量避免无效的判断情况,鸡翁一个就五钱了,如果20个就要一百了,又因为 要求每个鸡种至少有一只,所以他是不能取到20的,其他的同样也是,因为是百钱,所以鸡雏的个数固然是3的倍数,又因为都要有,所以他直接从3开始。判断就是百元买百鸡,满足要求就可以直接跳出了。

8、如果一个正整数n恰好等于它的1~n/2的因子之和,则称该数为完数。例如,6 = 1 + 2 + 3,6是一个完数。打印1000以内的所有完数。

这个这很清晰了,按要求就可以求出来。这个如果要用n/2的话,这个是闭区间,当然一些人是写成n,这个就是开区间了。其实就是多了n/2的判断,大家可以自己分析一下。

C语言判断完数(完整版)_判断完数c语言程序_丶无殇的博客-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/qq_42372031/article/details/85016200#:~:text=%E9%82%A3%E4%B9%88%E4%BB%80%E4%B9%88%E5%8F%AB%E5%AE%8C%E6%95%B0%EF%BC%9F%20%E5%AE%8C%E6%95%B0%E5%B0%B1%E6%98%AF%EF%BC%9A%E5%AE%83%E6%89%80%E6%9C%89%E7%9A%84%E7%9C%9F%E5%9B%A0%E5%AD%90%EF%BC%88%E5%8D%B3%E9%99%A4%E4%BA%86%E8%87%AA%E8%BA%AB%E4%BB%A5%E5%A4%96%E7%9A%84%E7%BA%A6%E6%95%B0%EF%BC%89%E7%9A%84%E5%92%8C%EF%BC%88%E5%8D%B3%E5%9B%A0%E5%AD%90%E5%87%BD%E6%95%B0%EF%BC%89%EF%BC%8C%E6%81%B0%E5%A5%BD%E7%AD%89%E4%BA%8E%E5%AE%83%E6%9C%AC%E8%BA%AB%E3%80%82,%E5%A6%82%E6%9E%9C%E4%B8%80%E4%B8%AA%E6%95%B0%E6%81%B0%E5%A5%BD%E7%AD%89%E4%BA%8E%E5%AE%83%E7%9A%84%E5%9B%A0%E5%AD%90%E4%B9%8B%E5%92%8C%EF%BC%8C%E5%88%99%E7%A7%B0%E8%AF%A5%E6%95%B0%E4%B8%BA%E2%80%9C%E5%AE%8C%E5%85%A8%E6%95%B0%E2%80%9D%E3%80%82%20%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%AE%8C%E5%85%A8%E6%95%B0%E6%98%AF6%EF%BC%8C%E7%AC%AC%E4%BA%8C%E4%B8%AA%E5%AE%8C%E5%85%A8%E6%95%B0%E6%98%AF28%EF%BC%8C%E7%AC%AC%E4%B8%89%E4%B8%AA%E5%AE%8C%E5%85%A8%E6%95%B0%E6%98%AF496%EF%BC%8C%E5%90%8E%E9%9D%A2%E7%9A%84%E5%AE%8C%E5%85%A8%E6%95%B0%E8%BF%98%E6%9C%898128%E3%80%8133550336%E7%AD%89%E7%AD%89%E3%80%82

#include<stdio.h>
int main(){
	int tmp=0;
	for(int i=2;i<1000;i++){
		tmp=0;
		//因子的范围[1,n/2]
		for(int j=1;j<=i/2;j++){//闭区间
		//for(int j=1;j<i;j++){也行,左开右闭
			//累加因子
			if(i%j==0){
				tmp+=j;
			}
		}
		//完数判断
		if(i==tmp){
			printf("%d\n",i);
		}
	}
	return 0;
}

9、求分数序列的前20项的和。

这个分析可以知道这斐波拉契数列有关,那可以先求得斐波拉契数列的值存储在数组中,然后直接带入即可,然后就是动态的更新分子和分母的值,然后累加求和即可。除的时候先成1.0转换成浮点数的运算,就不是整除了。

#include<stdio.h>
int main(){
	double sum=0;
	int fenmu=1,fenzi=1;
	for(int i=0;i<20;i++){
		int tmp=fenzi;//临时保存上一项的分子
		fenzi=fenmu+fenzi;//分子等于上一项的分子+分母
		fenmu=tmp;//更新分母
		sum+=1.0*fenzi/fenmu;
	}
	printf("前20项的和为:%lf\n",sum);
	return 0;
}

10、求的近似值,计算到时的。精确到16位小数。

这个的每一项的分子就是1,分母和项数也有关系,求阶层可以由上一项的阶层乘以此时的项数得到。精确小数点后16位就.16%lf即可,要主要就是这里的stratum来表示阶层,用int的话后面会越界,这就意味着无法跳出循环vc用long不知道为什么也越界了,所以我这里就用double类型了。

#include<stdio.h>
int main(){
	double e=1;
	//记录每一项的阶层
	double stratum=1;
	for(int i=1;;i++){
		stratum*=i;
		if(stratum>1E15){
			break;
		}
		e+=1.0/stratum;
	}
	//2.7182818284590455
	printf("%.16lf\n",e);//精确到16位小数
	return 0;
}

11、 输入一个整数k,用函数计算k以内最大的10个能被13或17整除的自然数之和。

后半部分的功能都写在函数里面了,这个判断就是或所以是或运算,最大的10个数,只要倒数着一个一个判断找到十个即可。

#include<stdio.h>
int main(){
	int Fun(int k);//函数声明
	int k=0;
	printf("k=");
	scanf("%d",&k);
	printf("函数值为为:%d\n",Fun(k));
	return 0;
}

int Fun(int k){
	int sum=0;
	//统计十个数就行,因为是要求最大的
	//倒序枚举求最大倍数
	for(int i=0;i<10;k--){
		//能被13整除或能被17整除
		if(k%13==0 || k%17==0){
			sum+=k;//求和
			i++;//累计记录个数
		}
	}
	return sum;
}

12、输入一个整数k,用函数计算k以内最大的10个素数之和。

这个没什么讲的,就是前面两道题的结合,直接看代码了。

#include<stdio.h>
int main(){
	int Fun(int k);//函数声明
	int k=0;
	printf("k=");
	scanf("%d",&k);
	printf("函数值为为:%d\n",Fun(k));
	return 0;
}

int Fun(int k){
	int sum=0;
	//统计十个数就行,因为是要求最大的
	//倒序枚举求最大10个素数之和
	for(int i=0;i<10;k--){	
		//判断该数是否满足要求
		for(int j=2;j<k;j++){
			if(k%j==0)break;
		}
		if(k==j){
			sum+=k;//符合条件的进行累加
			i++;//限定循环次数
		}	
	}
	return sum;
}

13、已知数列a的前三项为0,0,1,后面各项都是其相邻的前三项之和。输入一个整数n,用函数计算该数列前n项的平方根之和。

按照要求得到得到每一项,然后求得平方根之和即可,这里也可以用3个变量来保存之前的值就不需要数组了,我这里是先得到每一项,再重新累加求平方根。对于n<3的时候如果相加也可以加一个,然后就直接返回值了,我这里就没有分情况讨论了。

#include<stdio.h>
#include<math.h>
int main(){
	double Fun(int n);//函数声明
	int n=0;
	printf("n=");
	scanf("%d",&n);
	printf("sum=%lf\n",Fun(n));
	return 0;
}

double Fun(int n){
	double sum=0;
	int arr[100],i=0;
	//初始化
	arr[0]=0;arr[1]=0;arr[2]=1;
	for(i=3;i<n;i++){
		//递推公式
		arr[i]=arr[i-1]+arr[i-2]+arr[i-3];
	}
	//求平方根之和
	for(i=0;i<n;i++){
		sum+=sqrt(arr[i]);
	}
	return sum;
}

14、输入10个整数,用函数对其降序排序。

随便写一个排序算法就行了,我这里选择的是冒泡排序,算是最开始学的排序算法了。我的理解是外层循环是控制要比较的趟数,内层循环控制的比较的次数,一共是走9趟就行了,自己和自己就不用比了,走一趟之后9号位置就是最小值了,然后再比较就是[0,8]的范围的比较。也可以往前面冒泡,冒泡排序还有改良版本的,可以提前跳出循环。

常用十大排序算法_calm_G的博客-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/qq_51664685/article/details/124427443?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168415668516800182771614%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=168415668516800182771614&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-2-124427443-null-null.142%5Ev87%5Einsert_down28,239%5Ev2%5Einsert_chatgpt&utm_term=%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95&spm=1018.2226.3001.4187排序算法-冒泡排序(改进)_进击的黑子的博客-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/qq_37266079/article/details/104877508#:~:text=%E5%86%92%E6%B3%A1%E6%8E%92%E5%BA%8F%E6%94%B9%E8%BF%9B%E6%80%9D%E8%B7%AF%EF%BC%9A%20%E8%BF%99%E7%A7%8D%E6%83%85%E5%86%B5%E4%B8%8B%EF%BC%8C%E5%A6%82%E6%9E%9C%E6%88%91%E4%BB%AC%E8%83%BD%E5%88%A4%E6%96%AD%E5%87%BA%E6%95%B0%E5%88%97%E5%B7%B2%E7%BB%8F%E6%9C%89%E5%BA%8F%EF%BC%8C%E5%B9%B6%E4%B8%94%E5%81%9A%E5%87%BA%E6%A0%87%E8%AE%B0%EF%BC%8C%E5%89%A9%E4%B8%8B%E7%9A%84%E5%87%A0%E8%BD%AE%E6%8E%92%E5%BA%8F%E5%B0%B1%E5%8F%AF%E4%BB%A5%E4%B8%8D%E5%BF%85%E6%89%A7%E8%A1%8C%EF%BC%8C%E6%8F%90%E6%97%A9%E7%BB%93%E6%9D%9F%E5%B7%A5%E4%BD%9C%E3%80%82,%E5%9B%A0%E6%AD%A4%E6%88%91%E4%BB%AC%E5%8F%AF%E4%BB%A5%E7%94%A8%E4%B8%80%E4%B8%AA%20%E6%A0%87%E5%BF%97%E5%8F%98%E9%87%8F%20%E6%9D%A5%E6%A0%87%E5%87%86%E5%BA%8F%E5%88%97%E6%98%AF%E5%90%A6%E6%9C%89%E5%BA%8F%EF%BC%8C%E5%BD%93%E4%B8%80%E6%AC%A1%E5%86%92%E6%B3%A1%E8%BF%87%E7%A8%8B%E4%B8%AD%E5%8F%91%E7%8E%B0%E6%B2%A1%E6%9C%89%E4%BA%A4%E6%8D%A2%E6%93%8D%E4%BD%9C%E6%97%B6%EF%BC%8C%E8%A1%A8%E6%98%8E%E5%BA%8F%E5%88%97%E5%B7%B2%E7%BB%8F%E6%8E%92%E5%A5%BD%E5%BA%8F%E4%BA%86%EF%BC%8C%E4%BE%BF%E7%BB%88%E6%AD%A2%E5%86%92%E6%B3%A1%E6%93%8D%E4%BD%9C%E3%80%82

#include<stdio.h>
int main(){
	void Fun(int *arr);//函数声明
	int arr[10];
	int i;
	printf("请输入10个整数:");
	for(i=0;i<10;i++){
		scanf("%d",&arr[i]);
	}
	printf("原始数据为:");
	for(i=0;i<10;i++){
		printf("%d ",arr[i]);
	}
	Fun(arr);//函数调用
	printf("\n降序数据为:");
	for(i=0;i<10;i++){
		printf("%d ",arr[i]);
	}
	printf("\n");
}
//冒泡降序
void Fun(int *arr){
	for(int i=1;i<10;i++){
		for(int j=0;j<10-i;j++){
			if(arr[j]<arr[j+1]){
				int tmp=arr[j];
				arr[j]=arr[j+1];
				arr[j+1]=tmp;
			}
		}
	}
}

15、输入一个5×5矩阵A,用函数将A的主对角线以上的元全部置为0。

这个我现在发现我之前写错了,之前是将主对角线上面的元素置零也就是修改了对角线,现在看起来应该是错误的,应该是主对角线以上的元素,不是主对角线上的元素。

#include<stdio.h>
int main(){
	int arr[5][5];
	int i=0,j=0;
	//得到矩阵的数据
	for(i=0;i<5;i++){
		for(j=0;j<5;j++){
			printf("arr[%d][%d]=",i,j);
			scanf("%d",&arr[i][j]);
		}
	}
	printf("\n原始矩阵为:\n");
	for(i=0;i<5;i++){
		for(j=0;j<5;j++){
			printf("%-5d",arr[i][j]);
		}
		//记得要换行
		printf("\n");
	}
	
	printf("\n修改矩阵为:\n");
	for(i=0;i<5;i++){
		for(j=0;j<5;j++){
			//主对角线以上置零,不包括主对角线
			if(i<j){
				arr[i][j]=0;
			}
			printf("%-5d",arr[i][j]);
		}
		//记得要换行
		printf("\n");
	}
	return 0;
}

16、输入一个N×N矩阵A,N为符号常量,其值定义为5。用函数将A的第一行元素与倒数第一行元素对调,第二行与倒数第二行对调,……,其它依此类推。

这个要注意的就是数组是从0号位置开始的,所以在交换的时候就很容易写错越界,当i从0开始的,用arr[N-i]不就越界了,这个我感觉还是比较容易我错的,我已经错了几次了-_-,还要注意的就是交换只需要交换一半就行了意思就是第一行和倒数第一行交换一次就行了,你交换N次的话,原本已经交换好的,又被你交换回去了。

#include<stdio.h>
#define N 5
int main(){
	int arr[N][N];//定义一个N*N的二维数组
	int i,j;
	//得到二维数组
	for(i=0;i<N;i++){
		for(j=0;j<N;j++){
			printf("arr[%d][%d]=",i,j);
			scanf("%d",&arr[i][j]);
		}
	}
	printf("\n原始矩阵为:\n");
	for(i=0;i<N;i++){
		for(j=0;j<N;j++){
			printf("%-5d",arr[i][j]);
		}
		//记得要换行
		printf("\n");
	}
	//进行交换,只要循环一半就行了
	//i<N的话又交换回去了
	for(i=0;i<N/2;i++){
		for(j=0;j<N;j++){
			int tmp=arr[i][j];
			arr[i][j]=arr[N-1-i][j];
			arr[N-1-i][j]=tmp;
		}
	}
	printf("\n修改矩阵为:\n");
	for(i=0;i<N;i++){
		for(j=0;j<N;j++){
			printf("%-5d",arr[i][j]);
		}
		//记得要换行
		printf("\n");
	}
	return 0;
}

17、输入一行字符(≤80个),用函数将其逆序存放。

思路就是得到首位字符的位置,然后逐个进行交换,这个是之前的思路,现在话就是把位置的交换,整数的会这个的就会,同样就是交换一半,整个的长度就是strlen(s)求得就行了,这个大家可以自己去尝试一下。

#include<stdio.h>
int main(){
	void Fun(char *p);
	char s[80];
	char *p=s;//修改副本,s始终指向字符串的首地址
	printf("请输入一个字符串:");
	gets(s);//输入得到一个字符串
	Fun(p);
	printf("修改后:");
	puts(s);//输出字符串
}
void Fun(char *p){
	while(*(p+1)!='\0'){
		if(*p==' '){
			//如果是小写字母才修改
			if(*(p+1)>='a' && *(p+1)<='z'){
				*(p+1)-=32;
			}
		}
		p++;
	}
}

 

18、输入一行字符,用函数实现将其中每个单词(以空格为界)的第一个字母改为大写。

这个就有提示了按照空格来判断,主要就是记录空格的位置,如果空格后面是小写字母就可以把他变成大写字母,就是ascii减去32就是的了。因为是按照空格来判断的,所以输入字符串的时候可以在最前面增加一个空格即可,这个while循环的话,总是忘记p++,我真的哭死,所以还是用for循环好一点,可以先用strlen求得字符串的长度,边界就确定了。for循环就交给大家来实现了。如果空格后面不是小写字母的话就不能减32了。

#include<stdio.h>
int main(){
	void Fun(char *p);
	char s[80];
	char *p=s;//修改副本,s始终指向字符串的首地址
	printf("请输入一个字符串:");
	gets(s);//输入得到一个字符串
	Fun(p);
	printf("修改后:");
	puts(s);//输出字符串
    return 0;
}
void Fun(char *p){
	while(*(p+1)!='\0'){
		if(*p==' '){
			if(*(p+1)>='a' && *(p+1)<='z'){
				*(p+1)-=32;
			}
		}
		p++;
	}
}

 

19、输入一个字符串s,再输入一个字符c,用函数截取s中第1个与c相同的字符前面的字符串(不包括c)并返回,若s中不含c,则截取整个字符串。

不知道为什么用strlen好像失效了,我这还是用之前的方案吧,截取就是把c的值赋值成'\0'就行了,字符串输出遇到'\0'就停止了,还有就是没用scanf和printf输出字符串是感觉有点麻烦,还是用这个gets和puts算了。

C语言scanf()和gets()及printf()和puts()的区别_xingjiarong的博客-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/xingjiarong/article/details/47282817

#include<stdio.h>
int main(){
	void Fun(char *s,char c);
	char s[80],c;
	printf("请输入一个字符串:");
	gets(s);//输入字符串
	printf("请输入一个字符");
	c=getchar();//输入字符
	char *p=s;//操作p,s用来输出
	Fun(p,c);
	printf("截取后的字符串为:");
	puts(s);//输出字符串
	return 0;
}
void Fun(char *p,char c){
	while(*p!='\0'){
		//字符串输出遇到'\0'就停止输出了
		if(*p==c){
			*p='\0';
		}
		p++;
	}
}

20、输入一个字符串s,再输入一个字符c,用函数删除s中所有与c相同的字符,例如,若s="Do you see now?",c='o',则返回"D yu see nw?"。

后面几题字符串的题目思路都是差不多的,这个删除很简单,主要就是字符串的移动,这个还是比较直观的。

#include<stdio.h>
int main(){
	void Fun(char *s,char c);
	char s[80],c;
	printf("请输入一个字符串:");
	gets(s);//输入字符串
	printf("请输入一个字符");
	c=getchar();//输入字符
	char *p=s;//操作p,s用来输出
	Fun(p,c);
	printf("删除后的字符串为:");
	puts(s);//输出字符串
	return 0;
}

void Fun(char *p,char c){
	char *q=p;
	while(*p!='\0'){
		if(*p==c){
			q=p;
			//后面的字符串整体前移一位
			while(*q!='\0'){
				*q=*(q+1);
				q++;
			}
		}
		p++;
	}
}

那就到这了,题目是自己写的,所以也不确实是否就一定正确,题目也没太深入了,仅供参考。希望能够帮助到大家。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: 广东专升本C语言历年真题主要涵盖了C语言的基本语法、据类型、函、指针、数组、结构体、文件操作等知识点。这些题目旨在考察考生对C语言的掌握程度以及解决实际问题的能力。 对于这些历年真题,考生可以通过以下几个方面进行复习和准备: 首先,熟悉C语言的基本语法和常用函。这包括变量的声明与使用、运算符的使用、条件语句、循环语句等。可以通过阅读相关教材和编写简单的程序来提高对这些知识点的掌握程度。 其次,重点关注指针和数组的应用。指针是C语言中的一个重要概念,掌握指针的使用方法对于解决实际问题至关重要。考生可以多编写涉及指针和数组的程序来深入理解相关知识点。 另外,结构体和文件操作也是考点之一。结构体是C语言中用于存储多个不同类型据的一种据类型,考生需要掌握结构体的定义和使用方法。文件操作是指对文件进行读写操作,考生需要了解文件的打开、读写和关闭等操作。 最后,多做历年真题进行练习和巩固。通过做真题,考生可以了解考试的出题思路和考察重点,同时也可以发现自己的不足之处,及时进行补充和提高。还可以通过参加模拟考试来检验自己的复习效果和应试能力。 总之,广东专升本C语言历年真题的准备需要全面掌握C语言的基本知识,并通过练习和模拟考试来提高自己的应试能力。只有充分准备,才能在考试中取得好的成绩。 ### 回答2: 广东专升本考试是专门为在广东地区工作的大专毕业生提供升本科的机会的考试。其中包含了C语言的考试科目,所以对于考生来说,熟悉C语言的历年真题对于备考很有帮助。 广东专升本C语言历年真题主要涵盖了C语言基础知识、语法规则、编程题等方面。通过解答这些历年真题,考生可以加深对C语言相关知识的理解,熟悉常见的编程题型,掌握解题思路和方法。 历年真题的解答过程中,考生需要先理清题目要求,然后通过对题目的分析,确定解题思路和算法。接着,根据题目要求编写相应的C代码实现解题目标,同时注意代码的规范和优化。最后,对代码进行调试和测试,确保代码的正确性和可行性。 通过解答历年真题,考生不仅可以提高对C语言知识的理解和掌握,还能了解到考试中常见的题型和难度,为应对考试做好准备。同时,通过不断练习解题,考生还可以培养自己的编程思维和解决问题的能力。 总之,广东专升本C语言历年真题对于备考非常重要。考生应该认真对待这一资源,通过解答历年真题来提高自己的编程水平和应试能力,从而在考试中取得好成绩。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

封奚泽优

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

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

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

打赏作者

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

抵扣说明:

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

余额充值