NEFU锐格实验七[动态数组]

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

NEFU锐格实验七[动态数组]

知识点

题目知识点
5859约瑟夫问题,一维动态数组建立与赋值
5860动态开辟多个字符串数组
5861动态开辟结构体数组
5862重新分配内存,字符串处理

题目

如果不会写动态数组可以参考一下这个博客

5859

约瑟夫环很经典,也有很多解法,这里把t出多少人改为剩余多少人,这样免去最后循环遍历,当然这样做并非最高效解法(比如数学解法),不过或许更符合教学要求一些

#include<stdio.h>
#include<stdlib.h>

int main()
{
    int n,m,cnt=0;
	int *p=NULL;
	while(~scanf("%d%d",&n,&m)&&(n||m))//写成(n||m)简单些
	{
		int last=n;//剩余人数
		p=(int *)calloc(n,sizeof(int));//开动态数组
		for(int i=0;i<n;i++)
			*(p+i)=1;
		while(last>=1)
		{
			for(int i=0;i<n;i++)
			{
				if(*(p+i))//没出局的,可以报数的人
				{
					++cnt;
					if(cnt==m)//出局
					{
						*(p+i)=0;
						cnt=0;
						last--;	
					}	
				}
				if(last==0)
				{
					printf("%d\n",i);
					break;
				}
			}
		}
		free(p);//释放第一维指针,看到一些博客说,这样更好,防止内存泄漏
		p=NULL;//重置为空指针防止出现野指针
	}
	return 0;	
} 

5860

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main()
{
	int n,max=0,maxi;
	char (*p)[100];//指向含100个char类型元素的数组的 指针变量
	while(~scanf("%d",&n))
	{
		getchar();
		p=(char(*)[100])calloc(n,sizeof(char[100]));//动态开辟n个字符串
		for(int i=0;i<n;i++)
		{
			gets(p[i]);
			if(strlen(p[i])>max)
			{
				max=strlen(p[i]);
				maxi=i;
			}
		}
		printf("%s\n",p[maxi]);
		free(p);//释放
		p=NULL;
	}
	return 0;
} 

5861

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
typedef struct
{
    double x,y;
}Point;
int main()
{
	int n;
	Point *p;
	while(~scanf("%d",&n))
	{
		p=(Point *)calloc(n,sizeof(Point));
		for(int i=0;i<n;i++)
			scanf("%lf%lf",&(*(p+i)).x,&(*(p+i)).y);
		double min=999999999.9;
		for(int i=0;i<n;i++)
			for(int j=i+1;j<n;j++)
			{
				double len=pow(p[i].x-p[j].x,2)+pow(p[i].y-p[j].y,2);
				min=len<min?len:min;
			}
		printf("%.1lf\n",sqrt(min));
		free(p);
		p=NULL;
	}	
	return 0;
} 

5862

这题我动态写得比较懵逼hh,等老师讲了我再看看吧,这个写法不一定符合这章的要求,将就看吧
总之我写的这玩意还有很多不大对劲的地方,先码了再说

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main()
{
    int n,cnt=0,len=0;
	char *s;//读入段落
	char (*p)[50];//存单词 
	char tmp[50];//临时存一个完整单词
	s=(char *)malloc(1005*sizeof(char));
	gets(s); 
	p=(char(*)[50])calloc(1,sizeof(char[50]));
	//A:这个写成p=(char(*)[50])calloc(0,sizeof(char[50])),不知道为什么也可以
	int flag=0;//主要防止连续空格这种
	for(int i=0;s[i];++i)
	{
		if(s[i]>='a'&&s[i]<='z'||s[i]>='A'&&s[i]<='Z'||s[i]=='.'||s[i]==';')
		{
			tmp[len++]=s[i];
			flag=1;
		}
		else if(flag)
		{
			strcpy(p[cnt],tmp);
			memset(tmp,0,sizeof tmp);
			len=0;
			flag=0;
			p=(char(*)[50])realloc(p,(cnt+2)*sizeof(char[50]));//B:重新分配内存,当然你也可以猛一些开两倍什么的貌似c++vector就是这样的,有个问题是,把这行注释掉好像也没问题?
			cnt++;
		}	
	}
	if(len)strcpy(p[cnt++],tmp);//处理最后一个 
    
	printf("%d\n",cnt);
	for(int i=0;i<cnt;i++)
		printf("%s\n",p[i]);
	free(p);free(s);//C:不知道为啥,如果上面那个p重新分配内存写cnt+1,free后会报runtime error
	p=NULL;s=NULL;
	return 0;
} 

对于问题A的资料,BC待解

https://blog.csdn.net/sinat_35297665/article/details/78925121
https://www.zhihu.com/question/21570597
https://www.cnblogs.com/csdndreamer/p/5490680.html
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值