C语言解题思路 [四]

1.电子时钟

/*时间转换(电子钟)
基准时间:1970 年 1 月 1 日
1. 将秒单位的时间转为标准时间
2. 将标准时间转为秒单位
3. 实现电子钟功能*/
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <windows.h>
typedef struct
{
    int year; //年
    int month; //月
    int day; //日期
    int hours; //时
    int minutes; //分
    int sec; //秒
    int week; //星期
}Time;

Time StdTime;
int month_r[12] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int month_p[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int Get_Sec(int year, int month, int day, int hours, int minutes, int sec);
void GetStdTime(int sec_cnt);
void GetWeek(int sec_cnt);
int main(int argc, char*argv[])
{
    //时间赋值
//    /** 测试代码
//    int sec_cnt=Get_Sec(2017,5,6,17,28,40);
//    printf("秒单位:%d\n",sec_cnt);
//    GetStdTime(sec_cnt);
//    printf("%d 年 %d 月 %d 日 %d 时 %d 分 %d 秒
//    \n",StdTime.year,StdTime.month,StdTime.day,StdTime.hours,StdTime.minutes,StdTime.sec);
//
    int sec_cnt;
    while (1)
    {
        sec_cnt = time(NULL); //获取计算机上的总秒数
        sec_cnt += 8 * 60 * 60;
        GetStdTime(sec_cnt);
        GetWeek(sec_cnt);
        printf("%d 年%d 月%d 日%d 时%d 分%d 秒 星期:%d\n", StdTime.year, StdTime.month, StdTime.day,
        StdTime.hours, StdTime.minutes, StdTime.sec, StdTime.week);
        Sleep(1000); //卡一秒钟
    }
    return 0;
}
//判断平年和闰年
int GetYear(int year)
{
    if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
    {
        return 1; //闰年
    }
    return 0;
}

//将标准时间转为秒单位 1970.1.1
int Get_Sec(int year, int month, int day, int hours, int minutes, int sec)
{
    StdTime.year = year;
    StdTime.month = month;
    StdTime.day = day;
    StdTime.hours = hours;
    StdTime.minutes = minutes;
    StdTime.sec = sec;
    unsigned int sec_cnt = 0; //存放总秒数
    //1. 已经经过的总年份秒数
    int i;
    for (i = 1970; i<StdTime.year; i++)
    {
        if (GetYear(i)){
            sec_cnt += 366 * 86400; //(24*60*60)=86400 一天的总秒数
        }
        else{
            sec_cnt += 365 * 86400;
        }
    }
    //2. 经过的月份
    for (i = 0; i<StdTime.month - 1; i++)
    {
        if (GetYear(StdTime.year)){
            sec_cnt += month_r[i] * 86400;
        }
        else{
            sec_cnt += month_p[i] * 86400;
        }
    }
    //3. 经过天数
    sec_cnt += (StdTime.day - 1) * 86400;
    //4. 经过的小时
    sec_cnt += StdTime.hours * 60 * 60;
    //5. 经过分钟
    sec_cnt += StdTime.minutes * 60;
    //6. 经过秒
    sec_cnt += StdTime.sec;
    return sec_cnt;
}

//将秒单位时间转为标准时间
void GetStdTime(int sec_cnt)
{
//    /*1. 得到年份
//    闰年一年的秒数: 31622400
//    平年一年的秒数: 31536000
//
    StdTime.year = 1970;
    while (sec_cnt >= 31536000)
    {
        if (GetYear(StdTime.year)){
            sec_cnt -= 31622400;
        }
        else{
            sec_cnt -= 31536000;
        }
        StdTime.year++;
    }
    //2. 得到月份
    StdTime.month = 1;
    int i;
    for (i = 0; i<12; i++){
        if (GetYear(StdTime.year))
        {
            if (sec_cnt >= month_r[i] * 86400){
                sec_cnt -= month_r[i] * 86400;
            }
            else break;
        }
        else{
            if (sec_cnt >= month_p[i] * 86400){
                sec_cnt -= month_p[i] * 86400;
            }
            else break;
        }
        StdTime.month++; //累加月份
    }
    //3. 得到天数
    StdTime.day = 1;
    while (sec_cnt >= 86400)
    {
        sec_cnt -= 86400;
        StdTime.day++;
    }
    ///4. 得到小时
    StdTime.hours = 0;
    while (sec_cnt >= 60 * 60)
    {
        sec_cnt -= 3600;
        StdTime.hours++;
    }
    //5. 得到分钟
    StdTime.minutes = 0;
    while (sec_cnt >= 60)
    {
        sec_cnt -= 60;
        StdTime.minutes++;
    }
    //6. 得到秒
    StdTime.sec = sec_cnt;
}
//获取星期
void GetWeek(int sec_cnt)
{
    int i = (sec_cnt / 86400) % 7;
    switch (i)
    {
        case 0:
            StdTime.week = 4;
            break;
        case 1:
            StdTime.week = 5;
            break;
        case 2:
            StdTime.week = 6;
            break;
        case 3:
            StdTime.week = 7;
            break;
        case 4:
            StdTime.week = 1;
            break;
        case 5:
            StdTime.week = 2;
            break;
        case 6:
            StdTime.week = 3;
            break;
    }
}

2.单向链表(简易学生管理系统)

/**单向链表版(简易的学生管理系统)
1. 创建链表
2. 删除链表节点
3. 插入链表节点
4. 链表节点排序
*/
#include <stdio.h>
#include <stdlib.h>
typedef struct stu
{
    int data;
    struct stu *next;
}STU;
STU *Head = NULL; //单向链表头
/*函数声明*/
void ShowMenu(void);
STU *AddrListNode(STU *head);
void PintListNode(STU *head);
STU *DeleteListNode(STU *head);
STU *InsListNode(STU *head);
STU *SortListNode(STU *head);
int main(int argc, char *argv[])
{
    int num;
    while (1)
    {
        ShowMenu();
        scanf("%d", &num);
        switch (num)
        {
            case 1:
            Head = AddrListNode(Head);
            break;
            case 2:
            PintListNode(Head);
            break;
            case 3:
            Head = DeleteListNode(Head);
            break;
            case 4:
            Head = InsListNode(Head);
            break;
            case 5:
            Head = SortListNode(Head);
            break;
        }
    }
    return 0;
}
/*1. 打印菜单*/
void ShowMenu(void)
{
    printf("*********************************************\n");
    printf("1. 添加节点\n");
    printf("2. 遍历节点\n");
    printf("3. 删除节点\n");
    printf("4. 插入节点\n");
    printf("5. 节点排序\n");
    printf("*********************************************\n\n");
    printf("请选择:");
}
/*2. 添加节点*/
STU *AddrListNode(STU *head)
{
    STU *new, *end;
    /*1. 判断是否有链表头*/
    if (head == NULL)
    {
        head = (STU *)malloc(sizeof(STU));
        head->next = NULL;
    }
    /*2. 找到链表最后一个节点*/
    end = head;
    while (end->next != NULL)
    {
        end = end->next;
    }
    /*3. 添加节点*/
    int i;
    for (i = 0; i<5; i++)
    {
        new = (STU *)malloc(sizeof(STU));
        printf("输入数据:");
        scanf("%d", &new->data);
        end->next = new;
        end = new;
        end->next = NULL;
    }
    return head;
}
/*3. 遍历链表节点*/
void PintListNode(STU *head)
{
    while (head->next != NULL)
    {
        head = head->next;
        printf("%d\n", head->data);
    }
}
/*4. 删除节点*/
STU *DeleteListNode(STU *head)
{
    int data;
    printf("输入删除的数据:");
    scanf("%d", &data);
    /*查找数据,并删除节点*/
    STU *p, *tmp;
    p = head;
    while (p->next != NULL)
    {
        tmp = p; //相当于上一个节点地址
        p = p->next;
        if (p->data == data)
        {
            tmp->next = p->next; //删除了中间的节点
            break;
        }
    }
    free(p); //释放删除的空间
    return head;
}
/*5. 插入节点*/
STU *InsListNode(STU *head)
{
    printf("输入插入的节点位置:");
    int addr;
    scanf("%d", &addr);
    STU *p, *new;
    p = head;
    int cnt = 0;
    while (p->next != NULL)
    {
        cnt++;
        if (cnt == (addr + 1))break;
        p = p->next;
    }
    printf("输入插入数据:");
    new = (STU *)malloc(sizeof(STU));
    scanf("%d", &new->data);
    new->next = p->next;
    p->next = new;
    return head;
}
/*6. 排序节点*/
STU *SortListNode(STU *head)
{
    /*冒泡排序: 交换相邻两个空间中的数据*/
    /*1. 计算总节点个数*/
    int cnt = 0;
    STU *p, *tmp;
    p = head;
    while (p->next != NULL)
    {
        p = p->next;
        cnt++;
    }
    /*2. 冒泡排序*/
    int i, j, data;
    p = head;
    for (i = 0; i<cnt - 1; i++)
    {
        tmp = p->next;
        for (j = 0; j<cnt - i - 1; j++)
        {
            if (tmp->data > tmp->next->data)//排序方式可在此修改 > or <
            {
                data = tmp->data;
                tmp->data = tmp->next->data;
                tmp->next->data = data;
            }
            tmp = tmp->next;
        }
    }
    return head;
}

猜你喜欢

转载自blog.csdn.net/weixin_41586634/article/details/89493152