大一老师给了一个C语言的复习题,但是感觉班上可能其他人都没有写,现在重新回过头看一下,如果有错误希望大家能够指出。
转载请注明出处,尊重作者劳动成果。
这个题目最开始的想法是保存10个实数可以用到数组,把最大值和最小值值移动到最前面,然后计算的时候就从下标为2的开始计算,也就是这样:
#include
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]){
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
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(maxarr[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
这题目思路就很清晰了,先找规律,第一项又可以写成1/1,那这个式子的每一项的分子就都是1,分母的话每次都加上一个数,这个数又刚好和他的项数有关,第一项分母就是0+1,第二项的分母就是0+1+2,0+1又是上一项的分母值,也就是说需要保存上一项分母的值加上此时是第几项,第几项刚好是可以写在循环里面,整个下来就是这样:
#include
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
首先求素数的话可以参考我之前写的。求法我就不赘述了,相信大家都知道了,接下来就是格式的问题,这个其实之前也有写到,每行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
#include
#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
欧几里得算法_百度百科 (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
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的效果一致了。这个后面我知道可能是不容易想到的,后面有看到了一种遍历的方法来求解。
#include
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
#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;
}
斐波拉契数列还是比较经典的,那么要注意的就是边界的判断了,他是小于多少的值,随着项数的增加数值会越来越大,最开始的时候都是小于这个边界值的,所以其实小于他的边界不好判断,可以先求得大于他的时候,然后跳出,这个项之前的就都是小于他的了,这是我自己的思路。斐波那契数列_百度百科 (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
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
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;
}
像这种自幂数也是比较好判断的,这里还有很多类似的,感兴趣的也可以去求一下。
自幂数_百度百科 (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
#include
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
这种题目就和鸡兔同笼一样了,虽然计算机不能设x,y,但是他擅长的是可以枚举每一种可能,然后判断每一种可能是否可行,最后输出满足要求的结果即可。
#include
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开始。判断就是百元买百鸡,满足要求就可以直接跳出了。
这个这很清晰了,按要求就可以求出来。这个如果要用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
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
这个分析可以知道这斐波拉契数列有关,那可以先求得斐波拉契数列的值存储在数组中,然后直接带入即可,然后就是动态的更新分子和分母的值,然后累加求和即可。除的时候先成1.0转换成浮点数的运算,就不是整除了。
#include
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;
}
这个的每一项的分子就是1,分母和项数也有关系,求阶层可以由上一项的阶层乘以此时的项数得到。精确小数点后16位就.16%lf即可,要主要就是这里的stratum来表示阶层,用int的话后面会越界,这就意味着无法跳出循环vc用long不知道为什么也越界了,所以我这里就用double类型了。
#include
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;
}
后半部分的功能都写在函数里面了,这个判断就是或所以是或运算,最大的10个数,只要倒数着一个一个判断找到十个即可。
#include
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;
}
这个没什么讲的,就是前面两道题的结合,直接看代码了。
#include
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
按照要求得到得到每一项,然后求得平方根之和即可,这里也可以用3个变量来保存之前的值就不需要数组了,我这里是先得到每一项,再重新累加求平方根。对于n<3的时候如果相加也可以加一个,然后就直接返回值了,我这里就没有分情况讨论了。
#include
#include
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
随便写一个排序算法就行了,我这里选择的是冒泡排序,算是最开始学的排序算法了。我的理解是外层循环是控制要比较的趟数,内层循环控制的比较的次数,一共是走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
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]
这个我现在发现我之前写错了,之前是将主对角线上面的元素置零也就是修改了对角线,现在看起来应该是错误的,应该是主对角线以上的元素,不是主对角线上的元素。
#include
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
这个要注意的就是数组是从0号位置开始的,所以在交换的时候就很容易写错越界,当i从0开始的,用arr[N-i]不就越界了,这个我感觉还是比较容易我错的,我已经错了几次了-_-,还要注意的就是交换只需要交换一半就行了意思就是第一行和倒数第一行交换一次就行了,你交换N次的话,原本已经交换好的,又被你交换回去了。
#include
#define N 5
int main(){
int arr[N][N];//定义一个N*N的二维数组
int i,j;
//得到二维数组
for(i=0;i
思路就是得到首位字符的位置,然后逐个进行交换,这个是之前的思路,现在话就是把位置的交换,整数的会这个的就会,同样就是交换一半,整个的长度就是strlen(s)求得就行了,这个大家可以自己去尝试一下。
#include
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++;
}
}
这个就有提示了按照空格来判断,主要就是记录空格的位置,如果空格后面是小写字母就可以把他变成大写字母,就是ascii减去32就是的了。因为是按照空格来判断的,所以输入字符串的时候可以在最前面增加一个空格即可,这个while循环的话,总是忘记p++,我真的哭死,所以还是用for循环好一点,可以先用strlen求得字符串的长度,边界就确定了。for循环就交给大家来实现了。如果空格后面不是小写字母的话就不能减32了。
#include
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++;
}
}
不知道为什么用strlen好像失效了,我这还是用之前的方案吧,截取就是把c的值赋值成'\0'就行了,字符串输出遇到'\0'就停止了,还有就是没用scanf和printf输出字符串是感觉有点麻烦,还是用这个gets和puts算了。
C语言scanf()和gets()及printf()和puts()的区别_xingjiarong的博客-CSDN博客https://blog.csdn.net/xingjiarong/article/details/47282817
#include
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++;
}
}
后面几题字符串的题目思路都是差不多的,这个删除很简单,主要就是字符串的移动,这个还是比较直观的。
#include
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++;
}
}
那就到这了,题目是自己写的,所以也不确实是否就一定正确,题目也没太深入了,仅供参考。希望能够帮助到大家。