大一老师给了一个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博客https://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博客https://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博客https://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++;}
}
那就到这了,题目是自己写的,所以也不确实是否就一定正确,题目也没太深入了,仅供参考。希望能够帮助到大家。