1.
3.
(a)
#include <stdio.h>
int secs(int,int,int);
int main(){
int h,m,s;
printf("enter a time:");
scanf("%d:%d:%d",&h,&m,&s);
printf("the seconds are %d",secs(h,m,s));
}
int secs(int h,int m,int s){
int total;
total = h*3600+m*60+s;
return total;
}
(b)
#include <stdio.h>
int total;
int secs(int,int,int,int *);
int main(){
int h,m,s;
int totsec;
int *p=&totsec;
printf("enter a time:");
scanf("%d:%d:%d",&h,&m,&s);
printf("the seconds are %d",secs(h,m,s,p));
}
int secs(int h,int m,int s,int *p){
*p= h*3600+m*60+s;
return *p;
}
4.
#include <stdio.h>
void time(int,int*,int*,int*);
int main(){
int second;
printf("enter seconds:");
scanf("%d",&second);
int hours,min,sec;
int *h,*m,*s;
h=&hours,m=&min;s=&sec;
time(second,h,m,s);
printf("the time is %02d:%02d:%d",hours,min,sec);
return 0;
}
void time(int second,int *h,int *m,int *s){
*h = second/3600;
*m = (second - *h * 3600)/60;
*s = second - (*m *60 + *h *3600);
}
6.
#include <stdio.h>
void date(int,int*,int*,int*);
int main(){
int riqi,year,month,day;
int *y=&year,*m=&month,*d=&day;
printf("enter a date:");
scanf("%d",&riqi);
date(riqi,y,m,d);
printf("the date is %04d/%02d/%02d\n",year,month,day);
printf("the date is %04d/%02d/%02d\n",*y,*m,*d);
}
void date(int riqi,int *y,int *m,int *d){
*y = riqi/10000;
riqi %=10000;
*d = riqi%100;
*m = riqi/100;
}
2.
1.
(a)(g)
2.
(e) (f) (i) 合法,(c)报错(error),因为对左值进行了操作,其他的是warning。
3.
#include <stdio.h>
void larger_of(double*,double*);
int main(){
double i,j;
printf("enter two numbers:");
scanf("%lf %lf",&i,&j);
double *a,*b;
a=&i,b=&j;
printf("%p %p\n",a,b);
larger_of(a,b);
printf("%lf %lf",i,j);
return 0;
}
void larger_of(double *a,double *b){
if(*a>*b){
*b=*a;
}else{
*a=*b;
}
}
4.
5.
void split_time(long total_sec,int *hr, int *min, int *sec){
*hr = total_sec/3600.0;
*min = total_sec/60.0;
*sec = total_sec;
}
7.
最原始的方法显然是不断的使用if语句,这里使用switch不太合适。但是如果学过简单的数组知识之后,可以尝试用数组来解决这个问题,会简化很多。
#include <stdio.h>
void split_date(int,int,int*,int*);
int i;
int main(){
int year,day_of_year;
int mon,da;
int *month=&mon;
int *day=&da;
printf("enter two numbers:");
scanf("%d %d",&year,&day_of_year);
printf("the month is %d,the day is %d\n",mon,da);
split_date(day_of_year,year,month,day);
printf("the month is %d,the day is %d\n",mon,da);
return 0;
}
void split_date(int day_of_year,int year,int *month,int *day){
if ((year%4==0&&year%100!=0)||(year%400==0)){
int a[12]={31,60,91,121,152,182,213,244,274,305,335,366};
for(i=0;i<12;i++){
if((day_of_year>a[i])&&(day_of_year<=a[i+1])){
*month = (i+2);
*day = (day_of_year - a[i]);
//printf("%d %d\n",*month,*day);
break;
}
}
if(i==12){
*month = 1;
*day = day_of_year;
}
}else{
int a[12]={31,59,90,120,151,181,212,243,273,304,334,365};
for(i=0;i<12;i++){
if((day_of_year>a[i])&&(day_of_year<=a[i+1])){
*month = (i+2);
*day = (day_of_year - a[i]);
//printf("%d %d\n",*month,*day);
break;
}
}
if(i==12){
*month = 1;
*day = day_of_year;
}
}
}
进行了一部分小的改进,去掉了重复的for循环。代码里有重复的块是代码不良的表现。
#include <stdio.h>
void split_date(int,int,int*,int*);
int i;
int main(){
int year,day_of_year;
int mon,da;
int *month=&mon;
int *day=&da;
printf("enter two numbers:");
scanf("%d %d",&year,&day_of_year);
printf("the month is %d,the day is %d\n",mon,da);
split_date(day_of_year,year,month,day);
printf("the month is %d,the day is %d\n",mon,da);
return 0;
}
void split_date(int day_of_year,int year,int *month,int *day){
int a[12]={31,59,90,120,151,181,212,243,273,304,334,365};
if ((year%4==0&&year%100!=0)||(year%400==0)){
//int a[12]={31,60,91,121,152,182,213,244,274,305,335,366};
for(int i=1;i<12;i++){
a[i] +=1;
printf("%d\n",a[i]);}
}
for(i=0;i<12;i++){
if((day_of_year>a[i])&&(day_of_year<=a[i+1])){
*month = (i+2);
*day = (day_of_year - a[i]);
//printf("%d %d\n",*month,*day);
break;
}
}
if(i==12){
*month = 1;
*day = day_of_year;
}
}