爱悠闲 > 函数与指针

函数与指针

标签: 指针与函数的结合运用,指针,源代码,struct  |  作者: gotoandplay1 相关  |  发布日期 : 2015-04-15  |  热度 : 828°

最近编写了一个程序,判断某年的天气问题,中间遇到了许多的问题,在这做一下总结,也希望能对大家有所帮助。

这中间有许多要求函数有多个返回值问题,这个用到指针还是比较方便的。(初学者应该看着不吃力)

源代码如下:

#include<stdio.h>

///////////////////////////////////////////
//结构体
struct content
{
    float maxtime;
float mintime;
float aver;
float min;
float max;
int orderday;
};
void sample(struct content *sa,float g[],int t[])
{
sa->maxtime=g[3]+1;
sa->mintime=g[4]+1;
    sa->aver=g[0];
sa->min=g[2];
sa->max=g[1];
sa->orderday=t[0];
}
//////////////////////////////////////////////////////////
//不同时期的温度值
int degree(int k,float g[])
{
    float avero=0.0;
float data_data[10][24]={
{10,10,11,12,15,9,10,10,11,15,16,17,13,19,20,20,22,19,18,16,15,11,10,9},
{5,10,13,15,15,8,9,10,11,15,16,17,13,19,20,20,25,19,18,16,15,11,9,4},
{8,7,11,12,15,9,14,10,11,15,16,17,13,19,20,20,27,17,13,12,13,11,10,9},
{10,9,11,12,15,9,4,10,11,15,16,17,13,19,20,20,23,19,18,16,15,11,10,3},
//////下面三行均少一个数字,我自己在末尾加上了
{20,26,27,28,29,30,29,30,30,31,32,33,35,34,31,30,30,27,26,27,25,22,21,0},
{20,26,27,28,29,30,30,29,30,31,32,33,35,34,31,30,30,27,26,27,25,22,21,0},
{5,10,13,15,15,18,25,30,29,31,32,33,36,34,32,30,30,25,12,13,11,10,9,0},
{-4,-4,-4,-3,-3,-2,-2,-1,-2,-1,0,1,0,-1,2,5,2,1,2,1,2,1,0,-1},
{-4,-5,-4,-3,-3,-2,-2,-1,-2,-1,0,0,0,-1,4,8,2,1,2,1,1,1,0,-1},
{-6,-4,-4,-3,-3,-2,-1,-1,-2,-1,0,0,0,-1,2,2,2,1,2,1,3,0,-2,-1},
};
int mino=40,i,maxo=-10;
for(i=0;i<24;i++)
{
avero+=data_data[k][i]/24.0;
g[0]=avero;
if(maxo<data_data[k][i])
{
g[1]=maxo=data_data[k][i]*1.0;
g[3]=i*1.0;
}
if(mino>data_data[k][i])
{
g[2]=mino=data_data[k][i]*1.0;
g[4]=i*1.0;
}
}
return 0;
}
/////////////////////////////////////////////////////////////////
//判断第几天
void judge(int t[])
{
int m[][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};
int year,month,day,j,leap,dayrel;
scanf("%d-%d-%d",&year,&month,&dayrel);
t[4]=month;t[5]=dayrel;
if(month>=1&&month<=12)
 {
t[2]=leap=year%4==0&&year%100!=0||year%400==0;////////////////////////////闰年为1
if(month==2)
{
if(t[2]==1&&dayrel<=29)
{
      for(j=0;j<month;j++)
     dayrel+=m[leap][j];
      if(dayrel>=100)
     day=dayrel%100%10;
      else if(dayrel>=10)
     day=dayrel%10;
      else
      day=dayrel;
          t[0]=dayrel;
            t[1]=day;
}
else if((t[2]==0)&&(dayrel<=28))
{
            for(j=0;j<month;j++)
            dayrel+=m[leap][j];
              if(dayrel >= 100)
            day = dayrel%100%10;
            else if(dayrel>=10)
            day=dayrel%10;
             else
           day=dayrel;
               t[0]=dayrel;
               t[1]=day;
 }
 else
  t[3]=1;
}
else if((month/2.0==0)&&(dayrel<=30)&&(month!=8))
{
            for(j=0;j<month;j++)
            dayrel+=m[leap][j];
              if(dayrel>=100)
            day=dayrel%100%10;
            else if(dayrel>=10)
            day=dayrel%10;
             else
           day=dayrel;
               t[0]=dayrel;
               t[1]=day;
 }
else if((month/2.0!=0&&dayrel<=31)||(month=8&&dayrel<=31))
 {
            for(j=0;j<month;j++)
            dayrel+=m[leap][j];
              if(dayrel>=100)
            day=dayrel%100%10;
            else if(dayrel>=10)
            day=dayrel%10;
             else
           day=dayrel;
               t[0]=dayrel;
               t[1]=day;
 }
 else
  t[3]=1;
 }
else
 t[3]=1;//为1则说明格式错误
}
///////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////
//主函数
void main()
{
int v;
for(v=0;v<366;v++)
{
int t[6]={0,0,0,0,0,0};//t[0]为真实日期t[1]为日期尾数t[2]为闰年判断t[3]为格式判断
    int *a2=t;
    printf("请输入时间yy-mm-dd\n");
    judge(a2);
getchar();
    if(t[3]==1)
{
       printf("输入格式有误\n\n");
}
    else
{
float g[5]={0,0,0,0,0};
float *p=g;
struct content a1;
degree(t[1],p);
sample(&a1,g,t);
printf("%d月%d日为第%d天\n%d月%d日的平均温度为%.2f\n%d月%d日%.0f点最高温度为%.0f\n%d月%d日%.0f点最低温度为%.0f\n\n",t[4],t[5],a1.orderday,t[4],t[5],a1.aver,t[4],t[5],a1.maxtime,a1.max,t[4],t[5],a1.mintime,a1.min);
}
}

}

菜鸟一枚,代码可能太繁杂,不当之处,多多指教。