算算你活了多少天(代码学习)

思路

你现在活的天数=你当时出生时到出生那年(可能是闰年)年末的天数+出生那年的下一年到今年上一年的年末(中间这些是完整的年)+今年年初到今天的天数,由这三部分的天数组成。这里我们计算的时候也是将三个部分的天数分别去计算,在后面的变量中,我们用tian1,tian2,tian3分别表示这三部分的天数;

思路实现

一年有十二个月,除了二月份,每一个月的天数都固定(一三五七八十腊,三十一天永不差),而二月份可以通过计算当年是否是闰年去决定它的天数,如果是闰年,二月是29天,如果不是闰年,二月是28天;

我们知道判断某一年是否是闰年有两个方面去考虑:

1、能被4整除并且能被100整除

2、能整除400

两个条件满足其一即可,我们用nian表示年数,tian表示天数,以下是判断某一年是否是闰年,并表示二月天数的程序:

if(((nian%4==0)&&((nian%100)!=0))||(nian % 400 == 0))  //二月天数
            {
                tian=29;
            }
            else{
                tian=28;                
            }

第一部分的天数

从你出生到当年年末的天数:这时候可以假设你输入你的生日,某某年某某月某某日,这里假设2002年3月24日(这里需要写一个程序让电脑知道你输入的时间);OK,现在我们可以先把当月剩下的天数算出来(3月整月的天数31天减去已经过去的日子24天)+ 剩下几个月的天数;

因为这里是先要判断输入月数,并且把当月剩下的天数和剩下的月的天数加起来,而且每一个月都有自己固定的天数,思来想去,这里我们用一个switch语句去实现最合适(swith语句:通过判断某个值,进入某个情况,执行语句,并且在不遇到break时,会继续执行下去,直至执行完整个switch语句);这里将nian,yue,ri分别表示你输入的你出生时的年月日,tian1表示从你出生那年到出生那年年末的天数,以下是这部分的程序代码:

    //从出生那年到年末的天数 
    switch(yue)
    {
        case 1:
            tian1=tian1+31; 
        case 2:
            if(((nian%4==0)&&((nian%100)!=0))||(nian % 400 == 0))
            {
                tian1=tian1+29;
            }
            else{
                tian1=tian1+28;                
            }
        case 3:
            tian1=tian1+31; 
        case 4:
            tian1=tian1+30;
        case 5:
            tian1=tian1+31; 
        case 6:
            tian1=tian1+30;
        case 7:
            tian1=tian1+31; 
        case 8:
            tian1=tian1+31; 
        case 9:
            tian1=tian1+30;
        case 10:
            tian1=tian1+31; 
        case 11:
            tian1=tian1+30;
        case 12:
            tian1=tian1+31; 
            break;
        default:
            break;
    }
    tian1=tian1-ri+1;//
    printf("从出生那天到当时年末的天数:%d\n",tian1);   
//从你出生当月的整月到剩下的月数的天数相加 减去 出生当月已经过去的天数  
//+1的原因是:你出生当日即生活开始的日子,得加一哦

 第二部分的天数

出生那年的下一年到生活当年(今年)上一年的年末(中间这些是完整的年):这一部分比较简单,先判断你出生那年和你生活的当年是不是同一年(有时会计算小baby的生活天数);如果不是,就开始判断,如果是平年,天数加365,如果是闰年,天数加366;这里用year,month,day表示输入的当年当月当日(今天)的参量;

这一部分的代码可以展示如下:

    //中间这些年的天数相加 
    //先判断一下查询的日期是不是同一年
    if(nian!=year)
    {
        for(int i=nian+1;i<year;i++)//i才是后面过的每一年,才是要判断的,nian是已经固定的,输入的出生的那年 
        {
         //if(((nian%4==0)&&((nian%100)!=0))||(nian % 400 == 0))  错误示例,一共才加了一次 
            if(((i%4==0)&&((i%100)!=0))||(i % 400 == 0))
            {
                tian2=tian2+366;
            }
            else
            {
                tian2=tian2+365;//注意检查,不要写错数值,一直找代码错误 
            }
        }
        printf("中间这些年一共过的天数:%d\n",tian2);
    }

第三部分的天数

今年年初到今天的天数:我的程序思路是用当年总天数减去当年剩下的天数,在下面程序中,tian3表示第三部分的天数,用year,month,day表示输入的当年当月当日(今天)的参量,

    //第三段 算出今年过了多少天
    int tian3=0;
      switch(month)
      {
       case 1:
               tian3 +=31;
       case 2:
               tian3 +=28;
            if((year%4==0&&year%100!=0)||(year%400==0))
            {
                tian3+=1;
            }
       case 3:
               tian3+=31;
       case 4:
               tian3+=30;
       case 5:
               tian3+=31;
       case 6:
               tian3+=30;
       case 7:
               tian3+=31;
       case 8:
               tian3+=31;
       case 9:
               tian3+=30;
       case 10:
               tian3+=31;
       case 11:
              tian3+=30;
       case 12:
               tian3+=31;
               break;
        }
      tian3=tian3-day;
      if((year%4==0&&year%100!=0)||(year%400==0))
      {
          tian3=366-tian3;
      }
      else
      {
          tian3=365-tian3;      //现在今年  年初到今天过了多少天tian3
      }
      printf("从今年最开始到现在的天数:%d\n",tian3);

剩下要做的就是把三部分的天数加起来,假设总天数用sum表示;

但是这里还遗留了一个小点,就是如果当年的天数正好是出生那年的年份(也就是算小baby的天数)时,按照这种程序思路,会多加了一年的天数,所以我们必须判断年份,减去这一年的天数;如果是平年,就减去365天,如果是闰年,就减去366天;这一部分的代码如下:

     if(nian==year)//如果出生那年和计算那年是同一年的话,那么按照这个程序思路就多加了一年,需要减去 
     {
         if((nian%4==0&&nian%100!=0)||(nian%400==0))
         {
             sum=sum-366;
         }
         else{
             sum=sum-365;
         }
     } 

第三部分的第二种思路: 

我们都知道switch里面的case语句进行整数匹配,它可以用来匹配任意整数类型的表达式,只要匹配到,就会一直往下执行,而不会去判断你到底是应该怎么执行;所以在这里我们可以改变swich语句里面的case语句选择的顺序,对应另外一种思路:可以先匹配当月的前一个月,用switch语句把前几个月的总天数加起来,再加上本月已经过去的天数;

这个思路可表示代码如下:

    switch(month - 1)
    {
        case 12: tian3 += 31;
        case 11: tian3 += 30;
        case 10: tian3 += 31;
        case 9: tian3 += 30;
        case 8: tian3 += 31;
        case 7: tian3 += 31;
        case 6: tian3 += 30;
        case 5: tian3 += 31;
        case 4: tian3 += 30;
        case 3: tian3 += 31;
        case 2:
            tian3 += 28;
            //判断是不是闰年
            if((year%400 == 0) || (year%4 == 0 && year%100 != 0))
            {
                tian3 += 1;
            }
        case 1: tian3 += 31;
            break;
        default:
            break;
    }
    //还要加上当前月已经过了的日子
    tian3 += day;

整体代码实现

#include<stdio.h>
#include<math.h>
//计算从出生日期到今日活了多久
int main()
{ 
	int nian,yue,ri;//出生的年月日 
	int year,month,day;//当年的年月日 
	int tian1=0;//注意赋初值,否则会出现乱值 
	int tian2=0;
	int tian3=0;
	int sum=0;//总天数 
	printf("本代码将实现:你从出生到现在一共活了多少天!");
	printf("请输入你的出生日期:\n");
	scanf("%d %d %d",&nian,&yue,&ri);
	printf("请输入今天的日期:\n");
	scanf("%d %d %d",&year,&month,&day);
	
	//从出生那年到年末的天数 
	switch(yue)
	{
		case 1:
			tian1=tian1+31; 
		case 2:
			if(((nian%4==0)&&((nian%100)!=0))||(nian % 400 == 0))
			{
				tian1=tian1+29;
			}
			else{
				tian1=tian1+28;				
			}
		case 3:
			tian1=tian1+31; 
		case 4:
			tian1=tian1+30;
		case 5:
			tian1=tian1+31; 
		case 6:
			tian1=tian1+30;
		case 7:
			tian1=tian1+31; 
		case 8:
			tian1=tian1+31; 
		case 9:
			tian1=tian1+30;
		case 10:
			tian1=tian1+31; 
		case 11:
			tian1=tian1+30;
		case 12:
			tian1=tian1+31; 
			break;
		default:
			break;
	}
	tian1=tian1-ri+1;
//	printf("从出生那天到当时年末的天数:%d\n",tian1);
	
	//中间这些年的天数相加 
	//先判断一下查询的日期是不是同一年
	if(nian!=year)
	{
		for(int i=nian+1;i<year;i++)//i才是后面过的每一年,才是要判断的,nian是已经固定的,输入的出生的那年 
		{
			//if(((nian%4==0)&&((nian%100)!=0))||(nian % 400 == 0))  错误示例,一共才加了一次 
			if(((i%4==0)&&((i%100)!=0))||(i % 400 == 0))
			{
				tian2=tian2+366;
			}
			else
			{
				tian2=tian2+365;//注意检查,不要写错数值,一直找代码错误 
			}
		}
//		printf("中间这些年一共过的天数:%d\n",tian2);
	}
    
	//第三段 算出今年过了多少天
      switch(month)
      {
       case 1:
       		tian3 +=31;
       case 2:
       		tian3 +=28;
		    if((year%4==0&&year%100!=0)||(year%400==0))
		    {
		    	tian3+=1;
		    }
       case 3:
       		tian3+=31;
       case 4:
       		tian3+=30;
       case 5:
       		tian3+=31;
       case 6:
       		tian3+=30;
       case 7:
       		tian3+=31;
       case 8:
       		tian3+=31;
       case 9:
       		tian3+=30;
       case 10:
       		tian3+=31;
       case 11:
      		tian3+=30;
       case 12:
       		tian3+=31;
       		break;
   	 }
	  tian3=tian3-day;
	  if((year%4==0&&year%100!=0)||(year%400==0))
	  {
	  	tian3=366-tian3;
	  }
	  else
	  {
	  	tian3=365-tian3;	  //现在今年  年初到今天过了多少天tian3
	  }
//	  printf("从今年最开始到现在的天数:%d\n",tian3);
	  
	 sum=tian1+tian2+tian3;//注意上下顺序,注意值的前后出现的顺序 

	//注意赋值符号== 
	 if(nian==year)//如果出生那年和计算那年是同一年的话,那么按照这个程序思路就多加了一年,需要减去 
	 {
	 	printf("你是今年出生的哦!\n",nian,year);
	 	if((nian%4==0&&nian%100!=0)||(nian%400==0))
	 	{
	 		sum=sum-366;
		 }
		 else{
		 	sum=sum-365;
		 }
	 }
	 	 
	 printf("你已经活了%d天哟!\n",sum);
	 return 0;
} 

实现代码中的错误总结:

1、年月日数值填写错误
2、语句上下顺序错误(语句上下顺序会改变代码执行顺序以至于改变代码执行结果)
3、符号错误(C语言输入数值时&符号经常忘记)
4、赋初值的错误(不能忘记赋初值)   

注意:这个代码还需要优化,还有一些小bug,我相信随着后面的学习中我会持续改进这个代码及思路的,争取用更好的算法实现它!               


这是我在学C语言中,通过老师讲解和询问同学对自己的学习的一个总结,文中有不对或说法不准确的地方,恳请各位大佬指正!


本人的评论区欢迎大家讨论技术性的问题!

绝对的练习 计算过的数(C语言),本人刚刚学,大家多多指教。 #include "stdio.h" int main(void) { int erorr1(); int y/*年*/,m/*月*/,d/*日*/,t1,t2/*头一年过的数*/,tlife/*过的总数*/,i/*循环计数器*/,i1=0/*闰年计数器*/,r1/*闰年判断*/; printf("--------------------------------------------------------------------------------"); printf("计算过的数(更新到2010/3/10)\n"); printf("--------------------------------------------------------------------------------"); printf("输入生日(如1987/3/30):"); scanf("%d/%d/%d",&y,&m,&d);/*输入生日*/ if ((y%4==0 && y%100!=0)||(y%100==0 && y%400==0))/*判断是否是闰年*/ r1=1; else r1=0; switch(m)/*分情况讨论输入的月份*/ { case 1: if(d>0 && d0 && d0 && d0 && d0 && d0 && d0 && d0 && d0 && d0 && d0 && d0 && d0 && d<32) /*判断日子是否输入有误*/ { t1=31+28+31+30+31+30+31+31+30+31+30+d; } else { erorr1(); return 0; } break; default:/*避免月份输入有误*/ erorr1(); return 0; } /*通过判断输入的月份来计算头年过的数*/ t2=365-t1; if (r1==1&&(t1<=59)) t2++;/*闰年过的头年的数*/ for(i=y+1;i0) printf("你总共了%d,珍惜生命,因为它不会重来!\n",tlife); else if (tlife<0) printf("你总共了%d(貌似还没出生)别乱来,生命不能拿来开玩笑!\n",tlife); else printf("你总共了%d(刚刚出生的宝宝)赶紧喊你妈妈给你喂奶!\n",tlife); printf("--------------------------------------------------------------------------------"); main(); } int erorr1() { printf("生日输入有误!\n按任意键退出..."); getch(); return 0; }
<think>嗯,用户让我介绍一下深度学习,好的,我得先理清楚思路。首先,深度学习是机器学习的一个分支,对吧?然后它主要基于神经网络,尤其是多层的神经网络。需要解释清楚深度学习的基本概念,可能要从神经网络的历史说起,比如感知机到多层感知机的发展。 然后,得提到深度学习的核心结构,比如深度神经网络、卷积神经网络CNN、循环神经网络RNN这些。还要讲清楚为什么“深度”重要,也就是深层网络能够学习更复杂的特征,层次化的表示。 接下来,可能需要介绍一些关键的技术,比如反向传播算法,激函数的作用,比如ReLU,防止梯度消失的问题。还有优化器,比如Adam,SGD这些,以及正则化方法,比如Dropout,Batch Normalization。 然后应用领域也很重要,计算机视觉、自然语言处理、语音识别这些,举几个例子,比如图像分类、机器翻译、语音助手。 不过用户可能已经有一定的基础,所以是否需要避免太基础的内容呢?可能还是需要从基础讲起,确保不同层次的读者都能理解。另外,要提到深度学习的发展推动因素,比如大数据、计算力的提升(GPU)、算法改进。 还有,可能比较一下传统机器学习和深度学习的区别,比如特征工程 vs 自动特征提取。再讨论一下当前的挑战,比如数据需求量大、模型可解释性差、计算资源消耗大等。 要确保用中文,口语化,但不要用Markdown格式。注意使用正确的LaTeX,行内公式用$...$,独立公式用$$...$$并换行。比如提到损失函数可以用$L(\theta)$,反向传播的梯度下降公式可以单独写出来。 可能还需要提到一些流行的框架,比如TensorFlow、PyTorch,帮助读者了解实际应用中的工具。最后,可以简要提一下未来的发展方向,比如更高效的模型、自监督学习、强化学习结合等等。 检查有没有遗漏的重点,比如常见的模型结构举例,如ResNet、Transformer,这些在应用中的重要性。同时,避免过于技术性的术语,保持解释的易懂性。可能需要用比喻,比如神经网络层像处理信息的层次,每一层提取更抽象的特征。 还要注意逻辑结构,分点分段落,让回答清晰。可能先定义,再历史发展,核心技术,应用,挑战,框架,未来展望这样的顺序。确保每个部分过渡自然,不要突然跳转话题。 最后,检查LaTeX是否正确,比如激函数ReLU的公式$\text{ReLU}(x) = \max(0, x)$是否正确,反向传播的梯度公式是否正确使用$$...$$。确保没有拼写错误,中文流畅,专业术语准确。</think>深度学习是机器学习的一个分支,主要基于多层神经网络结构,通过数据自动学习多层次特征表示。以下从核心概念、技术原理和应用场景逐步解析: --- ### 一、核心概念 1. **神经网络基础** 模拟人脑神经元,每个神经元接收输入$x_i$,通过权重$w_i$加权求和后,经激函数$\sigma$(如$\text{ReLU}(x)=\max(0,x)$)输出。单层网络公式: $$ y = \sigma\left(\sum_{i=1}^n w_i x_i + b\right) $$ 2. **“深度”的含义** 与传统机器学习相比,深度学习通过堆叠多个隐藏层(通常≥5层)实现特征的多级抽象。例如: - 图像识别中:底层学习边缘→中层学习纹理→高层学习物体部件。 --- ### 二、关键技术 1. **反向传播算法** 通过链式法则计算损失函数$L$对参数$\theta$的梯度,并更新参数: $$ \theta \leftarrow \theta - \eta \cdot \nabla_\theta L $$ 其中$\eta$为学习率。 2. **核心组件** - **卷积神经网络(CNN)**:通过卷积核提取空间特征(如图像局部模式)。 - **循环神经网络(RNN)**:处理序列数据,引入时间维度上的记忆(如文本生成)。 - **Transformer**:基于自注意力机制,解决长距离依赖问题(如BERT、GPT)。 3. **优化与正则化** - 优化器:Adam(自适应学习率)、SGD(随机梯度下降)。 - 正则化:Dropout(随机失神经元)、Batch Norm(标准化层输入)。 --- ### 三、发展推动力 1. **大数据**:ImageNet(1400万标注图像)等数据集提供训练基础。 2. **算力提升**:GPU并行计算加速矩阵运算(如NVIDIA CUDA)。 3. **算法突破**:ResNet的残差连接解决梯度消失,GAN生成逼真数据。 --- ### 四、典型应用 1. **计算机视觉** - 目标检测:YOLO算法实时定位物体。 - 图像生成:Stable Diffusion生成高分辨率图片。 2. **自然语言处理(NLP)** - 机器翻译:Transformer实现中英文互译(如谷歌翻译)。 - 情感分析:LSTM判断评论情感极性。 3. **其他领域** - 医疗:DeepMind的AlphaFold预测蛋白质3D结构。 - 自动驾驶:Tesla使用CNN识别车道线和行人。 --- ### 五、挑战与趋势 1. **当前挑战** - 数据依赖性强:小样本场景效果受限。 - 可解释性差:模型决策过程如“黑箱”。 2. **未来方向** - 轻量化模型:MobileNet适用于移动端。 - 多模态学习:CLIP联合训练文本与图像。 - 自监督学习:利用无标签数据预训练(如SimCLR)。 --- ### 六、学习工具推荐 - **框架**:PyTorch(动态计算图)、TensorFlow(生产部署)。 - **实践平台**:Kaggle(数据集+竞赛)、Colab(免费GPU环境)。 通过理解这些核心内容,读者可以逐步掌握深度学习的基本原理和应用方法。实际学习中建议结合项目实践(如手写数字识别),从代码层面加深理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值