【c语言自学视频教程】里的问题 求教
发表在C语言图书答疑 2015-07-21
是否精华
版块置顶:
c语言自学视频教程-第3章-例题3.9
#include<stdio.h>

int leap(int a) /*自定义函数leap用来指定年份是否为闰年*/
{
    if (a % 4 == 0 && a % 100 != 0 || a % 400 == 0) /*闰年判定条件*/
        return 1; /*是闰年返回1*/
    else
        return 0; /*不是闰年返回0*/
}

int number(int year, int m, int d)  /*自定义函数number计算输入日期为该年第几天*/
{
    int sum = 0, i, a[12] =
    {
        31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
    }; /*数组a存放平年每月的天数*/
    int b[12] =
    {
        31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
    }; /*数组b存放闰年每月的天数*/
    if (leap(year) == 1) /*判断是否为闰年*/
        for (i = 0; i < m - 1; i++)
            sum += b[i]; /*是闰年,累加数组b前m-1个月份天数*/
    else
        for (i = 0; i < m - 1; i++)
            sum += a[i]; /*不是闰年,累加数组a前m-1个月份天数*/
    sum += d; /*将前面累加的结果加上日期,求出总天数*/
    return sum; /*将计算的天数返回*/
}

int main()
{
int year, month, day, n; /*定义变量为基本整型*/
printf("请输入年月日\n");
scanf("%d%d%d", &year, &month, &day); /*输入年月日*/
n = number(year, month, day); /*调用函数number*/
printf("第%d天\n", n);

return 0;
}
第一行int leap(int a){}a是怎么调用键盘输入的年份的,实在是想不通 还有下面的
int number(int year, int m, int d) 这个麻烦也详细解读一下
分享到:
精彩评论 7
爱学习
学分:0 LV1
TA的每日心情
开心
2020-03-23 20:54:03
2015-07-22
沙发
建议您看一下函数的知识,要理解函数在哪调用的。这个程序中,输入年份的代码在main函数中,
scanf("%d%d%d", &year, &month, &day); /*输入年月日*/ 
这条语句,就是可以接收从键盘输入的数字。

输入数字之后。你输入的各个值保存在变量year, month, day,中了。
然后year, month, day,作为number(year, month, day); 的参数,也就是number这个函数会处理你刚刚从键盘输入的值。number中就是计算多少天的,这个函数中又使用到了int leap(int a)这个函数,这个函数是判断一个年是不是闰年的。这个函数是在number函数中被调用的。你应该知道一个程序的执行时从主函数开始执行的吧!所以为什么会问“第一行int leap(int a){}a是怎么调用键盘输入的年份的,实在是想不通”。还是建议你将基础的知识看一下,再看例子。
逆风笑
学分:0 LV1
2015-07-22
板凳
程序从int main()开始执行(这句好像是废话),接受键盘输入的年月日储存在year,month,day中,然后执行n=number(year,month,day),n需要赋number的值,然后运行number函数体,number中有个if(leap(year)==1)这一条不仅执行了判断功能还把year的值赋给了leap(int a)的a.leap函数体运行完后把值返回给if........number运行完后把num的值返回给number,最后number把值赋给n,输出n程序结束。
如果我在主函数内写上leap(year)在执行number函数体中的if语句是是否可以直接写成if(leap==1)?
爱学习
学分:0 LV1
TA的每日心情
开心
2020-03-23 20:54:03
2015-07-23
地板
[FIELDSET][LEGEND]引自:2楼[/LEGEND]
程序从int main()开始执行(这句好像是废话),接受键盘输入的年月日储存在year,month,day中,然后执行n=number(year,month,day),n需要赋number的值,然后运行number函数体,number中有个if(leap(year)==1)这一条不仅执行了判断功能还把year的值赋给了leap(int a)的a.leap函数体运行完后把值返回给if........number运行完后把num的值返回给number,最后number把值赋给n,输出n程序结束。
如果我在主函数内写上leap(year)在执行number函数体中的if语句是是否可以直接写成if(leap==1)?
[/FIELDSET]

回复:
  “如果我在主函数内写上leap(year)在执行number函数体中的if语句是是否可以直接写成if(leap==1)?”你这个的想法很奇怪,leap是函数,if(leap==1)这样的语句是错误的!这个程序的主体思想是,判断输入的年份是不是闰年,因为闰年和平年的计算结果有可能不同。你如果在主函数中先判断是不是闰年的话,number函数就需要改动了,参数需要改动,也需要三个参数,第一个是月份,第二个是天,第三个是bool 的变量来标识当前是闰年还是平年。然后再去计算天数。如果你想改动代码,那就试着编写代码,代码的运行结果最能说明问题。
爱学习
学分:0 LV1
TA的每日心情
开心
2020-03-23 20:54:03
2015-07-23
4L
[FIELDSET][LEGEND]引自:2楼[/LEGEND]
程序从int main()开始执行(这句好像是废话),接受键盘输入的年月日储存在year,month,day中,然后执行n=number(year,month,day),n需要赋number的值,然后运行number函数体,number中有个if(leap(year)==1)这一条不仅执行了判断功能还把year的值赋给了leap(int a)的a.leap函数体运行完后把值返回给if........number运行完后把num的值返回给number,最后number把值赋给n,输出n程序结束。
如果我在主函数内写上leap(year)在执行number函数体中的if语句是是否可以直接写成if(leap==1)?
[/FIELDSET]

回复:
  如果程序有错误,你可以附上代码!
逆风笑
学分:0 LV1
2015-07-23
5L
#include<stdio.h>

int leap(int a)
{
if(a%4==0&&a%100!=0||a%400==0)
return 1;
else
return 0;
}
int number(int y,int m,int d)
{
int sum=0,i,a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int b[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
if(leap==1)
for(i=1;i<m;i++)
sum+=b[i];
else
for(i=1;i<m;i++)
sum+=a[i];
sum+=d;

}
int main()
{
int year,month,day,n;
printf("请输入年月日:");
scanf("%d%d%d",&year,&month,&day);
n=number(year,month,day);
leap(year);
printf("%d",n);
return 0;


}
把year的值在主函数里声明给leap的a也可以通过,也可能这样做有点麻烦,但是对于我这个初学者来说更容易理解一点。
爱学习
学分:0 LV1
TA的每日心情
开心
2020-03-23 20:54:03
2015-07-25
6L
[FIELDSET][LEGEND]引自:5楼[/LEGEND]
#include<stdio.h>

int leap(int a)
{
if(a%4==0&&a%100!=0||a%400==0)
return 1;
else
return 0;
}
int number(int y,int m,int d)
{
int sum=0,i,a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int b[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
if(leap==1)
for(i=1;i<m;i++)
sum+=b[i];
else
for(i=1;i<m;i++)
sum+=a[i];
sum+=d;

}
int main()
{
int year,month,day,n;
printf("请输入年月日:");
scanf("%d%d%d",&year,&month,&day);
n=number(year,month,day);
leap(year);
printf("%d",n);
return 0;


}
把year的值在主函数里声明给leap的a也可以通过,也可能这样做有点麻烦,但是对于我这个初学者来说更容易理解一点。
[/FIELDSET]

回复:这个程序有错误,我之前已经说过了
if(leap==1)这条语句是错误的。leap是什么啊?你也没定义这个变量啊,如果他是函数,函数怎么可以用函数名和1进行比较呢!错误的代码,你的程序逻辑也是不对的,按照你主函数的逻辑是,先使用number函数计算了天数,然后再去判断是不是闰年?你确定这个逻辑正确吗?要明白什么地方执行了什么程序,怎么能先计算天数,再判断是不是闰年呢?肯定是先判断是不是闰年才计算天数啊!原程序代码是对的,你自己参考着改吧,由于时间关系,在这里不再重复说明了。
  
爱学习
学分:0 LV1
TA的每日心情
开心
2020-03-23 20:54:03
2015-07-25
7L
[FIELDSET][LEGEND]引自:2楼[/LEGEND]
程序从int main()开始执行(这句好像是废话),接受键盘输入的年月日储存在year,month,day中,然后执行n=number(year,month,day),n需要赋number的值,然后运行number函数体,number中有个if(leap(year)==1)这一条不仅执行了判断功能还把year的值赋给了leap(int a)的a.leap函数体运行完后把值返回给if........number运行完后把num的值返回给number,最后number把值赋给n,输出n程序结束。
如果我在主函数内写上leap(year)在执行number函数体中的if语句是是否可以直接写成if(leap==1)?
[/FIELDSET]

回复:
  你的代码我改了一下,不知道你自己是不是这个意思。这个程序很简单,自己再研究研究吧!
#include<stdio.h>

int leap(int a)
{
if(a%4==0&&a%100!=0||a%400==0)
return 1;
else
return 0;
}
int number(int leap,int m,int d)
{
int sum=0,i,a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int b[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
if(leap==1)
for(i=1;i<m;i++)
sum+=b[i];
else
for(i=1;i<m;i++)
sum+=a[i];
sum+=d;
return sum;
}
int main()
{
int year,month,day,n;
printf("请输入年月日:");
scanf("%d%d%d",&year,&month,&day);
int flag=leap(year); //flag=1表示是闰年
n=number(flag,month,day); //是否闰年,月,日

printf("%d",n);
return 0;


}
和你自己之前写的,你对照一下。由于工作时间原因,我们一般只对书中错误进行回答,自己改的程序,没有时间为您解答,谅解。自己再参考一下吧!
首页上一页 1 下一页尾页 7 条记录 1/1页
手机同步功能介绍
友情提示:以下图书配套资源能够实现手机同步功能
明日微信公众号
明日之星 明日之星编程特训营
客服热线(每日9:00-17:00)
400 675 1066
mingrisoft@mingrisoft.com
吉林省明日科技有限公司Copyright ©2007-2022,mingrisoft.com, All Rights Reserved长春市北湖科技开发区盛北大街3333号长春北湖科技园项目一期A10号楼四、五层
吉ICP备10002740号-2吉公网安备22010202000132经营性网站备案信息 营业执照