黑马程序员--C语言之数据结构解决问题

通过数组、链表、递归及循环等方法实现猴子吃桃问题的解决方案,对比不同方法的时间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


  ----------------------ASP.Net+Unity开发.Net培训期待与您交流! ----------------------




        一、问题描述:有一群猴子摘了一堆桃子,他们每天都吃当前桃子的一半且再多吃一个,到了第10天就只余下一个桃子。用多种方法实现求出原来这群猴子共摘了多少个桃子。

        设计要求:

        1) 采用数组数据结构实现上述求解;

        2) 采用链数据结构实现上述求解;

        3) 采用递归实现上述求解。

        4) 如果采用4种方法者,适当加分

       

        二、概要设计

        可适当参考以下提示:

        ⑴  数据结构

        struct sz{           //数组链表定义

           int sum;

           int i;

        }a[11];

        struct lb{          //动态链表定义

           int sum;

           int i;

           struct lb*next;

        };

        ⑵  模块划分

        void fn1(char *p)               //欢迎界面

        void fn2();                     //退出程序

        void liebiao();                //采用链数据结构实现

        void question();               //查看问题

        void shuzu();                  //采用数组数据结构实现

        void bijiao();                 //时间复杂度的比较

        int digui(int,int);            //采用递归实现

        void xunhuan();                //采用循环实现

三、详细设计

        欢迎界面printf("\n\n\t**********************************************************\n");

        printf("\t********        *       欢迎光临       *        ********\n");

        printf("\t********          *                  *           ********\n");

        printf("\t********            *    *    *   *             ********\n");

        printf("\t********           本课程设计者:谢剑章            ********\n");

        printf("\t********                                         ********\n");

        printf("\t********           班级:计科卓越1101              ********\n");

        printf("\t********                                         ********\n");

        printf("\t********           学号:201116910222              ********\n");

        printf("\t********                                         ********\n");

        printf("\t**********************************************************\n");

        

        课程设计界面:

        printf("\n\n\t\t*****************************************************\n");

       printf("\n\t\t*1-查看课程设计问题及要求  *   5-采用循环实现      *\n");

       printf("\n\t\t*2-采用数组数据结构实现     *  6-采用列表解决      *\n");

       printf("\n\t\t*3-采用链数据结构实现       *  7-比较各个方法的用时*\n");

       printf("\n\t\t*4-采用递归实现             *  0-退出              *\n");

       printf("\n\t\t*****************************************************\n");

      

      其中之时间复杂函数:

      void bijiao()

      {

        DWORD time1,time2,time3,time4,time5,time6;

        time1=GetTickCount();

        shuzu();

         time2=GetTickCount();

        lianbiao();

        time3=GetTickCount();

        digui(1,1);

        time4=GetTickCount();

        xunhuan();

        time5=GetTickCount();

        liebiao();

        time6=GetTickCount();

        system("cls");

        printf("\n\t**********解决方法******************耗费时间*******\n");

        printf("\t     采用数组数据结构实现              %d \n",time2-time1);

        printf("\t      采用链数据结构实现               %d \n",time3-time2);

        printf("\t         采用递归实现                  %d \n",time4-time3);

        printf("\t         采用循环实现                  %d \n",time5-time4);

        printf("\t         采用列表解决                  %d \n",time6-time5);

        system("pause");

      }

       

      四、程序源代码:

#include<stdio.h>
#include"iostream.h"
#include"stdlib.h"
#include<conio.h>
#include"time.h"
#include"string.h"
#include<windows.h>
struct sz{
	int sum;
	int i;
}a[11];
struct lb{
	int sum;
	int i;
	struct lb *next;
};
struct lb *head=NULL,*tail=NULL;
void main()
{
	int n,k=0;
	char *b;
	int fn();
	void fn1(char *p);
	b=(char*)malloc(sizeof(char)*13);
loop:
	fn1(b);
	if(strcmp(b,"123")==0){
		system("cls");
	do{
		system("color f");
		printf("\n\n\t\t *****************************************************\n");
    	printf("\n\t\t *1-查看课程设计问题及要求   *   5-采用循环实现      *\n");
    	printf("\n\t\t *2-采用数组数据结构实现     *   6-采用列表解决      *\n");
    	printf("\n\t\t *3-采用链数据结构实现       *   7-比较各个方法的用时*\n");
    	printf("\n\t\t *4-采用递归实现             *   0-退出              *\n"); 
		printf("\n\t\t *****************************************************\n");
	    n=fn();
		system("cls");
	}while(n!=0);
	system("color c");
	printf("\n\n\n\t\t     谢谢使用.......\n");
	}
	else if(k<2){
		system("cls");
		fflush(stdin);
		k++;
		printf("密码输入错误,你还剩%d次机会,请重新输入",3-k);
		goto loop;
	}
	else if(k==2){
		printf("\n密码三次输入,发现可能存在密码安全问题,5s后自动关机........\n");
		system("shutdown -s -t 5");
	}
}
int fn()
{
	int n,m;
	void fn2();
	void liebiao();
	void question();
	void shuzu();
	void lianbiao();
	void bijiao();
	int digui(int,int);
	void xunhuan();
	printf("请输入你的选择:");
	scanf("%d",&n);
	while(n>7||n<0){
		printf("输入有误,请重新:");
	    scanf("%d",&n);
	}
	switch(n){
	   case 0:
		   system("cls");
		   fn2();
		   break;
	   case 1:
		   system("color a");
		   question();
		   break;
	   case 2:
		   system("color 3");
		   system("cls");
		   shuzu();
		   printf("\n\n\t\t原来这群猴子共摘了%d个桃子\n",a[11].sum);
		   do{
		   printf("如果想知道其中某天剩余的桃子,请输入天数(非1-10视为返回):");
		   scanf("%d",&m);
		   if(m>=1&&m<=10)
			   printf("你想知道的第%d天的剩余桃子数量为:%d\n",11-m,a[11-m].sum);
		   }while(m>=1&&m<=10);
		   //system("pause");
		   break;
	   case 3:
		   system("color c");
		   lianbiao();
		   system("cls");
		   printf("\n\n\t\t原来这群猴子共摘了%d个桃子\n",tail->sum);
		   do{
		   printf("如果想知道其中某天剩余的桃子,请输入天数(非1-10视为返回):");
		   scanf("%d",&m);
		   if(m>=1&&m<=10){
			   struct lb *str;
			   for(str=head;str->next;str=str->next)
				   if(str->i==11-m){
					   //system("cls");
					   printf("你想知道的第%d天的剩余桃子数量为:%d\n",m,str->sum);
					   break;
				   }
		   }
		   }while(m>=1&&m<=10);
		   //system("pause");
		   break;
	   case 4:
		   system("color d");
		   system("cls");
		   printf("\n\n\t\t原来这群猴子共摘了%d个桃子\n",digui(1,1));
	       system("pause");
		   break;
	   case 5:
		   xunhuan();
		   system("pause");
		   break;
	   case 6:
		   liebiao();
		   system("pause");
		   break;
	   case 7:
		   bijiao();
	   default:
		   break;
	}
	return n;
}
void question()
{
	system("cls");
	printf("\n\t本课程设计题目是猴子吃桃:\n");
	printf("\n\t\t有一群猴子摘了一堆桃子,他们每天都吃当前桃子的一半且再多吃一个,\t    到了第10天就只余下一个桃子。用多种方法实现求出原来这群猴子共摘了多少\t    个桃子。\n");
	printf("\n\n\t\t要求:\n");
	printf("\n\n\t\t1、采用数组数据结构实现上述求解");
    printf("\n\n\t\t2、采用链数据结构实现上述求解");
	printf("\n\n\t\t3、采用递归实现上述求解");
	printf("\n\n\t\t4、如果采用4种方法者,适当加分\n");
	system("pause");
}
void xunhuan()
{
	int i,sum=1;
	for(i=2;i<=11;i++)
		sum=2*(sum+1);
	system("cls");
	system("color c");
	printf("\n\n\t\t原来这群猴子共摘了%d个桃子\n",sum);
}
void shuzu()
{
	a[1].sum=a[1].i=1;
	for(int i=2;i<=11;i++){
		a[i].sum=2*(a[i-1].sum+1);
		a[i].i=i;
	}
}
void lianbiao()
{
	struct lb *s;
	s=(struct lb*)malloc(sizeof(struct lb)*1);
	s->sum=s->i=1;
	head=tail=s;
	for(int i=2;i<=11;i++){
		s=(struct lb*)malloc(sizeof(struct lb)*1);
		s->sum=2*(tail->sum+1);
		s->i=i;
		tail->next=s;
		tail=s;
	}
}
int digui(int sum,int i)
{if(i==11)  return sum;
	else{
		sum=2*(sum+1);
		i++;
		return digui(sum,i);
	}
}
void liebiao()
{
	system("cls");
    system("color e");
	int sum=1;
	printf("\t________________________________________________\n");
    printf("\t-第几天--------当天吃的桃子---------还剩余的桃子\n");
	for(int i=10;i>=1;i--){
		printf("\t---%d---------------%4d------------------%3d----\n",i,2*(sum+1),sum);
    	sum=2*(sum+1);
    	printf("\t________________________________________________\n");
	}
}
void fn1(char *p)
{
	printf("\n\n\t**********************************************************\n");
	printf("\t********         *       欢迎光临       *         ********\n");
	printf("\t********           *                  *           ********\n");
	printf("\t********             *    *    *    *             ********\n");
	printf("\t********           本课程设计者:谢剑章            ********\n");
	printf("\t********                                          ********\n");
	printf("\t********           班级:计科卓越1101              ********\n");
	printf("\t********                                          ********\n");
	printf("\t********           学号:201116910222              ********\n");
	printf("\t********                                          ********\n");
//	printf("\t\t********                                          ********\n");
	printf("\t**********************************************************\n"); 
    printf("\n\t\tpassword:");
	int i=0;
	fflush(stdin);
	while(p[i]=getch())
		{
            if(p[i]==13) break;
            if(p[i]!='\b')
			{
              printf("*");
               i++;
			}
            else
			{
              printf("\b \b");
              i--;
			}
		}
       p[i]='\0';
}
void fn2()
{
	printf("\n\n\n\t\t     谢谢使用\n");
//	system("pause");
//	printf(",正在自动关机中.......");
//	system("shutdown -s -t 0");
}
void bijiao()
{
   DWORD time1,time2,time3,time4,time5,time6;
   time1=GetTickCount();
   shuzu();
   time2=GetTickCount();
   lianbiao();
   time3=GetTickCount();
   digui(1,1);
   time4=GetTickCount();
   xunhuan();
   time5=GetTickCount();
   liebiao();
   time6=GetTickCount();
   system("cls");
   printf("\n\t**********解决方法******************耗费时间*******\n");
   printf("\t     采用数组数据结构实现              %d \n",time2-time1);
   printf("\t      采用链数据结构实现               %d \n",time3-time2);
   printf("\t         采用递归实现                  %d \n",time4-time3);
   printf("\t         采用循环实现                  %d \n",time5-time4);
   printf("\t         采用列表解决                  %d \n",time6-time5);
   system("pause");}


----------------------ASP.Net+Unity开发.Net培训期待与您交流! ----------------------


采用C++编写,完成了题目的所有要求,并附有说明文档。 大学的每个专业都要制定教学计划。假设任何专业都有固定的学习年限,每学年含两学 期,每学期的时间长度和学分上限值均相等,每个专业开设的课程都是确定的,而且课程在 开设时间的安排必须满足先修关系。每门课程有哪些先修课程是确定的,可以有任意多门, 也可以没有。每门课恰好占一个学期。试在这样的前提下设计一个教学计划编制程序。 [基本要求] (1)输入参数包括:学期总数,一学期的学分上限,每门课的课程号(固定占3位的字母数字串)、学分和直接先修课的课程号。 (2)允许用户指定下列两种编排策略之一:一是使学生在各学期中的学习负担尽量均匀;二是使课程尽可能地集中在前几个学期中。 (3)若根据给定的条件问题无解,则报告适当的信息;否则将教学计划输出到用户指定的文件中。计划的表格格式自行设计。 [测试数据] 学期总数:6;学分上限:10;该专业共开设12门课,课程号从C01到C12,学分顺序为2,3,4,3,2,3,4,4,7,5,2,3。先修关系如下: 课程编号 课程名称 先决条件 C1 程序设计基础 无 C2 离散数学 C1 C3 数据结构 C1,C2 C4 汇编语言 C1 C5 语言的设计和分析 C3,C4 C6 计算机原理 C11 C7 编译原理 C5,C3 C8 操作系统 C3,C6 C9 高等数学 无 C10 线性代数 C9 C11 普通物理 C9 C12 数值分析 C9,C10,C1 [实现提示] 可设学期总数不超过12,课程总数不超过100。如果输入的先修课程号不在该专业开设的课程序列中,则作为错误处理。应建立内部课程序号与课程号之间的对应关系。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值