​​推荐:NEFU大一下C语言锐格实验与作业参考程序目录​​

文章目录

  • ​​NEFU锐格实验四[指针与函数]​​
  • ​​知识点​​
  • ​​题目​​
  • ​​5880​​
  • ​​5881​​
  • ​​5882​​
  • ​​5883​​
  • ​​5884​​

NEFU锐格实验四[指针与函数]

知识点

题目

知识点

5880

指针写个函数算平均值,总和

5881

指针写个函数实现单词统计

5882

写个返回指针值的函数

5883

指针malloc库函数实现字符串数组内存动态开辟

5884

貌似是不属于这个章节的玩意

题目

5880

数据太少,题目也没要求,懒得写函数了hh,函数传个数组头然后搬运进去就可以了(不会吧不会吧,不会有人改成函数都不会吧)

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#define N 5

int main()
{
int n;
double sc[N],total[N];//sc存个人的三门,total存每门课总分
while(scanf("%d",&n)!=EOF)
{
for(int i=1;i<=n;i++)
{
for(int i=0;i<3;i++)
scanf("%lf",&sc[i]);
double *p=sc;double sum=0;//sum存个人总分
for(int i=0;i<3;i++)
{
sum+=*(p+i);
total[i]+=*(p+i);
}
printf("%.2lf %.2lf\n",sum,sum/3.0);
}
double *p=total;//这里*p已经不是sc了
for(int i=0;i<3;i++)
printf("%.2lf %.2lf\n",*(p+i),*(p+i)/n);
}
return 0;
}

5881

喜闻乐见的字符串+指针,大底是令很多人头疼的组合

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#define N 1005

void solve(char *p)
{
int cnt=0;
bool flag=0;
while(*p!='\0')
{
if(*p>='a'&&*p<='z'||*p>='A'&&*p<='Z')
{
printf("%c",*p);
flag=1;
}
else if(flag)//没有想象中的末尾直接接'\0'所以这样就可以了
{
printf(" ");
cnt++;
flag=0;
}
++p;
}
if(cnt)printf("\n分出了%d个单词\n",cnt);//如果没有的话就不输出
}
int main()
{
int n;
char str[N];
char *p=str;//其实直接写str用到下面也ok,走个流程
while(scanf("%d ",&n)!=EOF)
{
for(int i=1;i<=n;i++)
{
gets(p);
solve(p);
}
}
return 0;
}

5882

略有难度,不过把字符串当成二维数组就完事了,不会的建议复习一下指针代替二维数组下标

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#define N 105

char* solve(char str[][N],int n)
{
char *res;
char (*p)[N]=&str[0];//行指针
int max=0;
for(int i=0;i<n;i++)
{
int cnt=0;
for(int j=0;*(*(p+i)+j)!='\0';j++)
{
if(*(*(p+i)+j)=='*')cnt++;
}
if(cnt>max)
{
res=*(p+i);
max=cnt;
}
}
return res;
}
int main()
{
int n;
char str[N][N];
while(scanf("%d",&n)!=EOF)
{
for(int i=0;i<n;i++)
scanf("%s",&str[i]);
char *p=solve(str,n);
printf("%s\n",p);
}
return 0;
}

5883

看到动态开辟内存时我是懵逼的,想到了C++里的vector。这里就查些资料现学现卖吧,等老师进度到这了再瞅瞅,貌似可以借助malloc函数?
附上:​​​链接​​ 不过可以学一下已给出程序片段里指针传字符串数组的方式

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void sort1(char **pp,int n)
{
char tmp[100];
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++)
if(strcmp(pp[i],pp[j])>0)
{
strcpy(tmp,pp[i]);
strcpy(pp[i],pp[j]);
strcpy(pp[j],tmp);
}
//补充完成程序
}
void output1(char *p[],int n)
{
for(int i=0;i<n;i++)
printf("%s\n",p[i]);
//补充完成程序
}
int main()
{
void sort1(char **pp,int n);
void output1(char *p[],int n);
char str[50],*cp[20];
int n,l,i;
while(scanf("%d\n",&n)!=EOF)
{
for(i=0;i<n;i++)
{
gets(str);
//start
int len=strlen(str);
cp[i]=(char*)malloc(len*sizeof(char)+1);
strcpy(cp[i],str);
//在此写动态开辟并存储程序
//end
}
sort1(cp,n);
output1(cp,n);
}
return 0;
}

5884

不是很懂为啥把这玩意放这个章节,这玩意也有指针做法??(想象力贫困)
数学题目

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <stdbool.h>
double get_fun(int id,double x)
{
if(id==1)return x*x*x-x*x-1;
else if(id==2)return x*x*x*x-3*x+1;
else return x-exp(-x);//exp求e的幂次
}

double get_der(int id,double x)
{
if(id==1)return 3*x*x-2*x;
else if(id==2)return 4*x*x*x-3;
else return 1+exp(-x);
}
int main()
{
int id;
double st,eps,ne;//st为初始的,ne为下一次,eps为精度
while(scanf("%d",&id)!=EOF)
{
scanf("%lf%lf",&st,&eps);
for(int i=1;i<=100000;i++)
{
double f1=get_fun(id,st);//计算原函数
double f2=get_der(id,st);//计算导数
ne=st-f1/f2;
if(fabs(ne-st)<eps)break;
st=ne;
}
printf("%d %.2e %.5lf\n",id,eps,ne);
}
return 0;
}