找到
9
篇与
lx5555iou
相关的结果
-
【2025.12.13】函数指针-用于定积分计算 $[泡泡表情]::(哈哈)今天我们来学c语言的指针函数 函数指针顾名思义,是一个指向函数的指针 基本写法 类型名 (*函数指针)(指向函数的类型); 现在我举一个小学二年级就学过的定积分示范一下如何使用函数指针 #include<stdio.h> #include<math.h> //因为f2要用到三角函数,这里需要调用math.h double calc(double(*funp)(double),double a,double b){ return (b-a)/2.0*(funp(a)+funp(b)); } //这里用梯形公式计算定积分,第一个形参就是一个函数指针 //如果没有这个函数指针,calc的形参不能直接写具体函数,那么就得把梯形公式放到每个函数里面,就比较麻烦 //所以引用函数指针可以省很多事 //只需要把具体函数的地址传给funp,就可以反复套用定积分计算公式 double f1(double x){ return x*x; } double f2(double x){ return sin(x)/x; } double (*funp)(double); int main(void) { double a,b; double result; printf("此代码用梯形公式计算定积分\n"); printf("请输入定义域左边:"); scanf("%lf",&a); printf("\n"); printf("请输入定义域右边:"); scanf("%lf",&b); //下面给大家介绍函数内以函数指针为形参的两种用法 //第一种用法直接传具体函数f1,这里传入的函数在c语言中会自动转换为函数的地址,然后计算定积分 result=calc(f1,a,b); printf("此定义域内第一个函数的定积分:%.4f\n",result); //第二种方法是先将具体函数f2的地址传给funp,再调用calc计算定积分 funp=f2; result=calc(funp,a,b); printf("此定义域内第二个函数的定积分:%.4f\n",result); return 0; } 继续学 -
马上期末考试了,水一道发扑克牌 //$[泡泡表情]::(哈哈)前言:虽然用的是cpp,但下文写的代码本质上是c语言。 #include<stdio.h> #include<stdlib.h>//用于调用rand函数和srand函数 #include<time.h>//用系统时间设定随机数 struct card{ int suit; int face; //$[泡泡表情]::(小乖)可以看到这里的suit和face都是整型变量而不是char型 //花色有四个,面值有十三个,这是suit和face数字化的前提 //之后可以通过数学运算,通过随机数确定每个牌的suit和face的值是多少 //然后用这个值作为新数组char *suit和char *face的项,就能得到对应牌号的花色和面值 };//用结构体定义card的所包含的两个元素suit和face void deal(struct card *wdeck){//引用deal函数发牌 int i,m,t;//i是循环变量,m用于选取随机数,然后i给t定调,保证t遍历0~51(合计52张牌,也就是除去大小王) int temp[52]={0};//0和1判断未发牌和发牌 srand(time(NULL));//随机数的初始化,如果只写rand会导致每次随机生成的结果不变 for(i=0;i<52;i++){ while(1){//如果temp[m]不是0就一直循环 m=rand()%52; if(temp[m]==0){ break; } } temp[m]=1; t=(i%4)*13+(i/4);//$[泡泡表情]::(吐舌)这样做模拟了整个发牌流程,i%4保证是依次发牌,*13保证了每个人是13张牌,i/4表示每个人都得到一张牌后,进入下一个周期 //部分流程示意:i=0时,t=0*13+0,此时给1号玩家发牌;i=1时,t=13+0,此时给2号玩家发牌;i=2时,t=26+0,此时给3号玩家发牌;i=3时,t=39+0,此时给4号玩家发牌;i=4时,t=0*13+1,此时给1号玩家发牌,加法前一部分定了发牌顺序,牌主所得牌的牌号范围,后一部分则保证了经历过一遍循环之后牌号就往前挪一次。 //照这种分法,1号玩家的牌号就是0~12,2号玩家的牌号就是13~25,以此类推。 wdeck[t].suit=m/13;//m/13只有四种可能,随机确定花色 wdeck[t].face=m%13;//m%13只有十三种可能,随机确定面值 } } int main(void){ struct card deck[52]; const char *suit[]={"Heart","Diamond","Club","Spade"};//定义char型的指针数组, //方便使用%s直接打印 const char *face[]={"A","K","Q","J","2","3","4","5","6","7","8","9","10"}; //道理同上 deal(deck); //引用deal函数发牌 for(int i=0;i<52;i++){ if(i%13==0){ //一个玩家需要循环13次,从0~12为第一位玩家,所以以0,13,26,39作为玩家标记 printf("Player %d\n",i/13+1); //加1让结果向后偏移一位,正好能指向当前被发牌的玩家 } printf("%s ",face[deck[i].face]); //回看结构体中suit和face的定义,再去看主函数中的suit和face的定义 //就能理解为什么这里是face[deck[i].face]了 //我简单解释一下,内层i确定了内层face的值是多少 //然后用这个值作为外层face的项数,就能确定face是多少了,suit同理。 printf("%s\n",suit[deck[i].suit]); } return 0; }感谢您的收看,如果您有其他见解(如算法优化),不妨留言讨论吧!$[阿鲁表情]::(害羞) -
洛谷(学习c++字符串)写了一整天的王老师的任务 #include<bits/stdc++.h> using namespace std; int i,q[1000],z[1000],sum[1000],changdu=0;//i是循环总数,q,z用于存储当前循环的两个数字,sum是两个数通过运算得到的结果,changdu用于计算q+z=sum这个算式的长度 char x[1000],y[1000];//x用于存储当前的运算符,y是用于判断第一个输出结果是运算符还是数字 string string1[1000],string2[1000],string3[1000];//因为c++中数字没有长度的概念,所以需要用三个字符串分别存储数组长度,以便计算算式的长度“changdu” int main(void)//多数情况下可以省略void,只是我写习惯了$[阿鲁表情]::(高兴){ cin>>i; if(i<=0||i>50)return 0;//根据题意,限制i的范围 for(int j=0;j<i;j++)//第一个循环用于输入数字,不过我现在相通了,洛谷的题不需要把输入和输出分成两个循环写,因为你输入和输出并不在同一个输入框,所以一边输入一边输出也可以正常执行{ cin>>y;//用y来判断是否满足算式符号abc或者数字 if(y[0]>='a'&&y[0]<='z')//如果输入的是运算符就给x赋值{ x[j]=y[0]; cin>>q[j]>>z[j]; } else//如果输入的是数字就给q赋值,并让这次的运算符与上一次保持一致{ sscanf(y,"%d",&q[j]); x[j]=x[j-1]; cin>>z[j]; } if(x[j]=='a')//这个sum[j]完全可以用q[j]+z[j]代替 //例如printf("%d+%d=%d",q[j]+z[j],q[j]+z[j])$[阿鲁表情]::(赞一个);{ sum[j]=q[j]+z[j]; } else if(x[j]=='b')//减法{ sum[j]=q[j]-z[j]; } else if(x[j]=='c')//乘法{ sum[j]=q[j]*z[j]; } else sum[j]=0; string1[j]=to_string(q[j]);//to_string可以将括号内的数字类型转换成字符串类型 string2[j]=to_string(z[j]); string3[j]=to_string(sum[j]); } for(int c=0;c<i;c++){ //计算changdu changdu=2+string1[c].size()+string2[c].size()+string3[c].size(); if(x[c]=='a'){ printf("%d+%d=%d\n",q[c],z[c],sum[c]); cout<<changdu<<endl; } if(x[c]=='b'){ printf("%d-%d=%d\n",q[c],z[c],sum[c]); cout<<changdu<<endl; } if(x[c]=='c'){ printf("%d*%d=%d\n",q[c],z[c],sum[c]); cout<<changdu<<endl; } changdu=0; } return 0; }只能说我太菜了,入门题写了这么久,不过通过这题学到了一堆东西。$[泡泡表情]::(惊哭) 按照输入输出同时进行的逻辑,存储q,z是完全没有必要的,并且printf支持直接计算结果sum,所以没有必要多定义一个数组sum来存储运行结果。如果你有更简单的方法,欢迎留言分享。$[泡泡表情]::(吐舌) 《口算练习题》题目链接: https://www.luogu.com.cn/problem/P1957 -
洛谷(c++学习数组)P1047 [NOIP 2005 普及组] 校门外的树 #include<bits/stdc++.h> using namespace std; int l,m,u,v,sum=0; int main(void){ cin>>l>>m; int x[10001];//用数组统计哪些树被覆盖了,覆盖就sum+1 for(int i=0;i<=10000;i++){ x[i]=1;//先设置每一个坐标点上有一棵树 }//初始化这个数组 for(int i=0;i<m;i++){ cin>>u>>v; for(int i=u;i<=v;i++){ if(x[i]==1){ sum++;//用于统计被移除的树 x[i]=0; //0表示把该区间内的树移除。 //解释一下为什么要这样修改,这并不多余。 //因为这是内部循环,i会重置,为避免当前的项被重复读取 //我们需要修改这一项为不是1的数字,防止后续循环再读一次 //就会导致统计结果sum偏大。 } } } cout<<l+1-sum;//原先数量是l+1,去掉统计sum得到剩余数量 return 0; } 题目链接就放在这里了 https:www.luogu.com.cn/problem/P1047$[阿鲁表情]::(高兴)