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博客https://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博客https://blog.csdn.net/weixin_44952348/article/details/110522187

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

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


(1条消息) %d,%05d,%-5d,%.5d的区分_岁忧的博客-CSDN博客https://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)https://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);//2021return 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)https://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]);9227465break;}}
}

来表示可以直接写出来,但是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)https://baike.baidu.com/item/%E8%87%AA%E5%B9%82%E6%95%B0/4397236?fromModule=lemma_inlink常用API-02-练习:两道数学算法题_哔哩哔哩_bilibilihttps://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博客https://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博客https://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.7182818284590455printf("%.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=N3I4https://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^v87^insert_down28,239^v2^insert_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=N3I4https://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=N3I4https://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++;}
}

 

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/27957.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【问题记录】html双横杠换行问题,white-space的重要性

废话 前言&#xff1a; 如图&#xff0c;就是这两个小玩意儿。两个 -- 同时出现在 html 就会傻逼地给你进行 智障 智能换行 。前期&#xff0c;以为是浏览器把这个当做 英文单词的换行 来处理了&#xff0c;所以用 css 的 word-break: break-word; 一顿猛操作&#xff0c;发现毫…

聊一聊Flutter自定义组件

自定义组件介绍 何时需要自定义组件 Flutter提供的现有组件无法满足业务需求&#xff0c;或者需要封装一些通用组件&#xff0c;多处复用时 Flutter中自定义组件有三种方式&#xff1a; 通过组合其它组件自绘组件实现RenderObject 自定义组件类型 组合其它Widget 该方式通过…

复旦团队大模型 MOSS 开源了,有哪些技术亮点值得关注?

来源&#xff1a;知乎 孙天祥&#xff08;AWS应用科学家&#xff09;回答&#xff1a; 新上传3个gptq量化版模型权重本回答新增对线区 首先解释一下我们的MOSS版本&#xff0c;目前开源的版本我们称为MOSS 003&#xff0c;二月份公开邀请内测的版本为MOSS 002&#xff0c;一月份…

Google杀入AI聊天机器人领域,暴跌千亿?错哪了?

大家好&#xff0c;ChatGPT 现在被大家玩坏了&#xff0c;甚至在用户的不断逼问之下&#xff0c;露出了鸡脚&#xff0c;原来 ChatGPT 也是小黑子 ChatGPT 太火了&#xff0c;火的谷歌都坐不住了。 为了应对爆火的ChatGPT&#xff0c;谷歌推出的Bard&#xff0c;但是谷歌翻车了…

不满足当 ChatGPT “接口侠”?轻松可视化 Fine-tuning 训练你的模型!

项目地址&#xff1a;https://github.com/ltyzzzxxx/gpt-web-terminal 欢迎大家Star、提出PR&#xff0c;一起快乐地用 GPT Terminal 玩耍吧&#xff5e; 前言 距 ChatGPT 问世已经过去半年多啦&#xff0c;大家一定有些审美疲劳了&#xff0c;不满足于 ChatGPT 提供的对话服…

PyCaret:低代码自动化的机器学习工具

PyCaret简介 随着ChatGPT和AI画图的大火&#xff0c;机器学习作为实现人工智能的底层技术被大众越来越多的认知&#xff0c;基于机器学习的产品也越来越多。传统的机器学习实现方法需要较强的编程能力和数据科学基础&#xff0c;这使得想零基础尝试机器学习变得非常困难。 机器…

Science子刊带来新遗传证据:早期人类驯化了自己

来源&#xff1a;中国生物技术网 在开始驯化狗、猫、绵羊和牛等动物前&#xff0c;人类可能已经有了驯化一种完全不同动物的传统&#xff0c;就是我们人类自己。近日&#xff0c;发表在《Science Advances》上的一项新研究引用从某种程度上反映驯化元素的一种疾病的遗传证据表明…

人类早期驯化VS2019的珍贵记录

代码自动补全 在输入符号的时候VS会自动把代码补全&#xff0c;比如我想写一个函数名mai()&#xff0c;但是在我打出括号“&#xff08; ”的时候&#xff0c;VS自动把代码补成了main( 解决方法&#xff1a; 打开选项窗口&#xff0c;按图找到那个“成员列表提交字符”的栏&am…

Chart GPT 暗黑版上线,网络安全问题已经显现

前言 Chart GPT刚刚发布&#xff0c;一位不知名的作者将它的孪生兄弟“DAN”就在世界上最黑暗的暗网上线了。 这个黑化的GPT刚刚上线的一周后&#xff0c;就已经有组织利用“DAN”犯罪了。 他们利用虚拟电话号码注册各种交友平台的账号&#xff0c;然后再模仿有魅力的男女人…

2023最新网络安全岗位面试题汇总

前言 一、渗透测试 如何绕过CDN找到真实IP&#xff0c;请列举五种方法 (★★★) redis未授权访问如何利用&#xff0c;利用的前提条件是&#xff1f;(★★★) mysql提权方式有哪些?利用条件是什么? (★) windowsmysql&#xff0c;存在sql注入&#xff0c;但是机器无外网权…

Bito AI——智能编程辅助软件,提升10倍开发效率!(New)

目录 前言 [Bito News] Updates更新于2023-06-15 1、Bito融资320万美元&#xff0c;加速下一代版本的研发 2、支持自定义设置输出语言&#xff08;超过17种语言&#xff09; 3、IDE 上下文菜单中自定义模板 4、Bito CLI中引入上下文记忆 5、自定义模板&#xff08;Prompt…

干货渗透测试面试题汇总

干货|渗透测试面试题汇总 以下为信息安全各个方向涉及的面试题&#xff0c;星数越多代表问题出现的几率越大&#xff0c;没有填答案是希望大家如果不懂能自己动手找到答案&#xff0c;祝各位都能找到满意的工作:) 注:做这个List的目标不是全&#xff0c;因为无论如何都不可能…

ChatGPT模型大战:讯飞星火认知大模型、百度文心一言能否击败GPT-4(含个人内测体验测试邀请码获取方法,2小时申请成功,亲测有效)

目录 前言讯飞星火内测申请申请方式内测体验登录界面 百度内测申请内测对比基本问答事实性问答科普文写作小红书文案项目计划撰写古文理解模型的常识能力和反事实推理代码理解法律相关广告话术数字排序数值计算推理解题跨语言能力文生图 总结个人感受一、你有使用过这种对话式A…

OpenAI

OpenAI ChatGPT OpenAI: https://openai.com 禾斗 ChatGPT ChatGPT: https://chat.openai.com/chat zhuce 接码(zhuce需要国外手机号接收验证码) SMS-Activate: https://sms-activate.org zhuce登录 接码 登录 ChatGPT: https://chat.openai.com/chat

Aleo隐私智能合约__火箭准备发射

文章目录 走进误区大哥大时代 点对点电子现金系统智能机时代 去中心化状态机月球与地心引力火箭Aleo 我们&#xff0c;都是站在巨人的肩膀上&#xff0c;进行不断地探索、创新&#xff0c;完善这个人类生态。在此&#xff0c;感谢前人们对去中心化技术的不断探索。 走进误区 …

讯飞版大模型来了,现场发布四大行业应用成果

文章目录 人工智能福利文章前言SparkDesk讯飞星火认知大模型简介语言理解知识问答逻辑推理数学题解答代码理解与编写亲自体验写在最后 ✍创作者&#xff1a;全栈弄潮儿 &#x1f3e1; 个人主页&#xff1a; 全栈弄潮儿的个人主页 &#x1f3d9;️ 个人社区&#xff0c;欢迎你的…

美国版权局《AI生成作品版权申请指南》:大利好!

真的非常有意思。 2月22日&#xff0c;无界AI发布了《文生文、文生图……狂飙的AIGC&#xff0c;会先在哪里落地&#xff1f;》提到当时文生文大模型还没有一家选择开源&#xff0c;导致小模型生态难以发展。结果3月2日&#xff0c;ChatGPT就开放了API&#xff0c;甚至在3月14日…

[Python+Django]Web图书管理系统毕业设计之数据库及系统实现源码篇

前排提醒,本文干货超多,为避免消化不良建议配合目录食用 本系列博文献给即将毕业的程序猿们,系列文章共三篇,在编写的过程中可以说几乎是参照毕业设计目录样式来进行的. 相关图表和截图也都几乎按照毕业设计论文的要求来编制,完整阅读消化此系列博文套上一个毕业论文的目录和格…

SpringBoot + Websocket + Vue 构建聊天室

前言 关于 WebSocket: 1、WebSocket 是 html5 提供的通讯协议 2、特点是建立在单个 tcp 连接上的全双工协议 3、浏览器向服务器发起 WebSocket 连接请求&#xff0c;当成功获取到连接后&#xff0c;就可以实现浏览器和服务器之间的数据传输版本 后端: springboot 2.0 前端: vu…

Geoffrey Hinton、姚期智、张钹、Sam Altman等专家共话AI安全与对齐丨2023智源大会议程公开...

6月9日&#xff0c;2023北京智源大会&#xff0c;将邀请AI领域的探索者、实践者、以及关心智能科学的每个人&#xff0c;共同拉开未来舞台的帷幕&#xff0c;你准备好了吗&#xff1f;与会知名嘉宾包括&#xff0c;图灵奖得主Yann LeCun、OpenAI创始人Sam Altman、图灵奖得主Ge…