C语言第九周作业(指针变量,内存访问,取址,空指针)

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;
        }
}

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cachel wood

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值