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