10.1请定义一个名为time_struct的结构体,它包含三个整数成员:hour,minute,second.开发一个程序,用于给每个成员赋值,并按如下格式显示时间:
16:40:51
程序如下:
voidmain()
{structtime_struct
{inthour,minute,second;
}time;
printf("input the time:\n");
scanf("%d:%d:%d",&time.hour,&time.minute,&time.second);
}
运行结果:
10.2修改以上程序,使用一个函数来给成员输入值,另一个函数显示时间。
程序如下:
voidmain()
{
structtime_struct
{inthour,minute,second;
}time;
printf("input the time:\n");
scanf("%d:%d:%d",&time.hour,&time.minute,&time.second);
printf("%d:%d:%d",time.hour,time.minute,time.second);
}
运行结果:
10.4定义一个名为date的结构体,它包含3个整数成员:day,month,year.开发一个交互式模块化程序,完成以下认为:
l用一个函数把日期读入结构体成员。
l用另一个函数来验证所输入日期的合法性。
l用第三个函数按如下格式显示日期:
April 29,2002
输入数据应为3个整数,如29,4和2002,分别对应日,月和年。例如,以下是不合法的数据:
31,4,2002——4月只有30天
29,2,2002——2002年不是闰年
程序如下:
structdate
{
intday;
intmonth;
intyear;
};
voidinput_date(structdate*da,intd,intm,inty)
{
da->day=d;
da->month=m;
da->year=y;
}
intis_right_date(intd,intm,inty)
{
if(d<1||m<1||y<1)
{
printf("Date should be positive integer\n");
return0;
}
if(m>12)
{
printf("A year is only 12 months\n");
return0;
}
if(!(y%4==0&&y%100!=0||y%400==0))
{
if((m==2)&&d>28)
{
printf("PingNian February only 28 days\n");
return0;
}
}
if(y%4==0&&y%100!=0||y%400==0)
{
if((m==2)&&d>29)
{
printf("A leap year only 29 days in February\n");
return0;
}
}
if((m==1||m==3||m==5||m==7||m==8||m==10||m==12)&&(d>31))
{
printf("dayue can't more than 31 days\n");
return0;
}
if((m==4||m==6||m==9||m==11)&&(d>30))
{
printf("XiaoYue can't more than 30 days\n");
return0;
}
}
voidprint_date(structdate*da)
{
char*str[12]={"January","February","March","April","May","June","July","August","September","October","November","December"};
printf("%s,%d,%d\n",str[da->month-1],da->day,da->year);
}
intmain()
{
structdate da;
intd,m,y,tmp;
printf("input day month year:\n");
scanf("%d %d %d",&d,&m,&y);
input_date(&da,d,m,y);
tmp=is_right_date(d,m,y);
if(tmp==0)
return0;
print_date(&da);
}
运行结果:
10.8使用编程练习10.4中定义的date结构体来储存两个日期。开发一个函数,它以这两个日期为输入,并如下进行比较:
如果date1早于date2,返回1.
如果date1更晚,则返回0。
程序如下:
structdate
{
intday;
intmonth;
intyear;
};
voidmain()
{
inty1,y2,m1,m2,d1,d2,date1,date2;
structdate riqi[2];
printf("input date1 year month day :");
scanf("%d %d %d",&riqi[0].year,&riqi[0].month,&riqi[0].day);
printf("input date2 year month day :");
scanf("%d %d %d",&riqi[1].year,&riqi[1].month,&riqi[1].day);
y1=riqi[0].year;y2=riqi[1].year;
m1=riqi[0].month;m2=riqi[1].month;
d1=riqi[0].day;d2=riqi[1].day;
date1=y1*10000+m1*100+d1;
date2=y2*10000+m2*100+d2;
if(date1>date2)
printf("0");
else
printf("1");
}
运行结果:
10.9请定义一个表示向量(即一个整数系列)的结构体,并编写一个模块化的程序来完成以下任务:
l创建一个向量。
l修改给定元素的值。
l乘以一个比例值。
l按如下形式显示向量。
(10,20,30,...)
程序如下:
#include
structvect
{
intv1;
intv2;
intv3;
};
voidb(structvect*p,intm)
{
p->v1=10;
p->v2=m;
p->v3=30;
}
voida(structvect*v,intn)
{
v->v1=(v->v1)*n;
v->v2=(v->v2)*n;
v->v3=(v->v3)*n;
}
main()
{
intm,n;
structvect myvector;
printf("input three numbers:\n");
scanf("%d %d %d",&myvector.v1,&myvector.v2,&myvector.v3);
printf("(%d,%d,%d,...)\n",myvector.v1,myvector.v2,myvector.v3);
printf("input n:");
scanf("%d",&n);
a(&myvector,n);
printf("(%d,%d,%d,...)\n",myvector.v1,myvector.v2,myvector.v3);
printf("input m:");
scanf("%d",&m);
b(&myvector,m);
printf("(%d,%d,%d,...)\n",myvector.v1,myvector.v2,myvector.v3);
}
运行结果:
10.10给编程练习10.9的程序加一个函数,接收两个向量为输入参数,并返回这两个向量的和。
程序如下:
#include
structvect
{
intv1;
intv2;
intv3;
};
voidb(structvect*p,intm)
{
p->v1=10;
p->v2=m;
p->v3=30;
}
voida(structvect*v,intn)
{
v->v1=(v->v1)*n;
v->v2=(v->v2)*n;
v->v3=(v->v3)*n;
}
main()
{
intm,n,c[3];
structvect myvector,other;
printf("input three numbers:\n");
scanf("%d %d %d",&myvector.v1,&myvector.v2,&myvector.v3);
printf("(%d,%d,%d,...)\n",myvector.v1,myvector.v2,myvector.v3);
printf("input three numbers:\n");
scanf("%d %d %d",&other.v1,&other.v2,&other.v3);
printf("(%d,%d,%d,...)\n",other.v1,other.v2,other.v3);
c[0]=myvector.v1+other.v1;
c[1]=myvector.v2+other.v2;
c[2]=myvector.v3+other.v3;
printf("(%d,%d,%d,...)\n",c[0],c[1],c[2]);
printf("input n:");
scanf("%d",&n);
a(&myvector,n);
printf("(%d,%d,%d,...)\n",c[0],c[1],c[2]);
printf("input m:");
scanf("%d",&m);
b(&myvector,m);
printf("(%d,%d,%d,...)\n",myvector.v1,myvector.v2,myvector.v3);
}
运行结果:
10.14定义一个名为cricket的结构体,用于描述以下信息:
l球员名
l球队名
l击球率
利用cricket声明一个含有5个元素的数组player,编写一个程序来读取所有5个球员的信息,然后按球队名排列,显示其球员和击球率。
程序如下:
structcricket
{
charmember_name[10];
charteam_name[10];
floathit_rate;
};
main()
{
inti;
structcricket player[5];
printf("input member_name team_name hit_rate\n");
for(i=0;i<5;i++)
{
scanf("%s %s %f",player[i].member_name,player[i].team_name,&player[i].hit_rate);
}
printf("team_name member_name hit_rate\n");
for(i=0;i<5;i++)
{
printf("%s %s %f\n",player[i].team_name,player[i].member_name,player[i].hit_rate);
}
}