通讯录改版
//.h
#pragma once
#define MAX 100
#define MAXNAME 20
#define MAXSEX 5
#define MAXADDR 30
#define MAXTELE 12
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<assert.h>
#include<windows.h>
typedef struct peoinfo
{
char name[MAXNAME];
int age;
char tele[MAXNAME];
char sex[MAXSEX];
char address[MAXADDR];
}peoinfo;
typedef struct contact
{
peoinfo data[MAX];
int count;
int capacity;
}contact;
//菜单
void menu();
//初始化
void init(contact* pc);
//添加联系人
void add(contact* pc);
//删除联系人
void del(contact* pc);
//展示
void show(contact* pc);
//查找
void search(contact* pc);
//修改联系人
void modify(contact* cp);
//排序
void sort(contact* pc);
//fun.c
#define _CRT_SECURE_NO_WARNINGS 1
#include".h"
void menu()
{
printf("******************************************\n");
printf("******************************************\n");
printf("*****************0.add********************\n");
printf("*****************1.del********************\n");
printf("*****************2.search*****************\n");
printf("*****************3.modify*****************\n");
printf("*****************4.show*******************\n");
printf("*****************5.sort*******************\n");
printf("*****************6.exit*******************\n");
printf("******************************************\n");
printf("******************************************\n");
}
void init(contact* pc)
{
assert(pc);
pc->count = 0;
memset(pc->data, 0, sizeof(pc->data));//sizeof用来表示pc中data域的字节数目
}
void add(contact* pc)
{
assert(pc);
if (pc->count == MAX)
{
printf("通讯录已满!\n");
}
//判断是否满,为什么是MAX而不是MAX-1?因为count时刻指的是最后一位联系人的下一位
printf("开始添加联系人:>\n");
printf("姓名:");
scanf("%s", pc->data[pc->count].name);
printf("年龄:");
scanf("%d", &pc->data[pc->count].age);
printf("电话:");
scanf("%s", pc->data[pc->count].tele);
printf("性别:");
scanf("%s", pc->data[pc->count].sex);
printf("地址:");
scanf("%s", pc->data[pc->count].address);
pc->count++;
printf("添加成功!\n");
}
static int findbyname(contact* pc, char name[])
{
int i = 0;
for (i = 0; i < pc->count; i++)
{
int ret = strcmp(name, pc->data[i].name);
if (ret == 0)
{
return i;
}
}
return -1;
}
void del(contact* pc)
{
assert(pc);
if (pc->count == 0)
{
printf("通讯录为空!\n");
return;
}
//开始删除
char name[100] = { 0 };
printf("请输入要删除的联系人:\n");
scanf("%s", name);
int ret = findbyname(pc, name);
if (ret == -1)
{
printf("通讯录中查无此人\n");
return;
}
for (int i = ret; i < pc->count - 1; i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->count--;
printf("删除成功!\n");
return;
}
void show(contact* pc)
{
int i = 0;
for (i = 0; i < pc->count; i++)
{
printf("%-20s\t%-3s\t%-12s\t%-5s\t%-30s\t\n", "姓名", "年龄", "电话", "性别", "地址");
printf("%-20s\t%-3d\t%-12s\t%-5s\t%-30s\t\n", pc->data[i].name,
pc->data[i].age,
pc->data[i].tele,
pc->data[i].sex,
pc->data[i].address);
}
}
void search(contact* pc)
{
assert(pc);
if (pc->count == 0)
{
printf("通讯录为空!\n");
return;
}
char name[MAXNAME] = { 0 };
printf("请输入要查找的联系人:\n");
scanf("%s", name);
int ret = findbyname(pc, name);
if (ret == -1)
{
printf("通讯录中查无此人\n");
return;
}
else
{
int i = ret;
printf("%-20s\t%-3s\t%-12s\t%-5s\t%-30s\t\n", "姓名", "年龄", "电话", "性别", "地址");
printf("%-20s\t%-3d\t%-12s\t%-5s\t%-30s\n",
pc->data[i].name,
pc->data[i].age,
pc->data[i].tele,
pc->data[i].sex,
pc->data[i].address);
}
return;
}
void modify(contact* pc)
{
assert(pc);
if (pc->count == 0)
{
printf("通讯录为空!\n");
return;
}
char name[MAXNAME] = { 0 };
printf("请输入要修改的联系人:\n");
scanf("%s", name);
int ret = findbyname(pc, name);
if (ret == -1)
{
printf("通讯录中查无此人\n");
return;
}
else
{
printf("确有此人\n");
printf("开始修改联系人:>\n");
printf("姓名:");
scanf("%s", pc->data[pc->count].name);
printf("年龄:");
scanf("%d", &pc->data[pc->count].age);
printf("电话:");
scanf("%s", pc->data[pc->count].tele);
printf("性别:");
scanf("%s", pc->data[pc->count].sex);
printf("地址:");
scanf("%s", pc->data[pc->count].address);
int i = ret;
printf("%-20s\t%-3s\t%-12s\t%-5s\t%-30s\t\n", "姓名", "年龄", "电话", "性别", "地址");
printf("%-20s\t%-3d\t%-12s\t%-5s\t%-30s\n",
pc->data[i].name,
pc->data[i].age,
pc->data[i].tele,
pc->data[i].sex,
pc->data[i].address);
printf("修改成功!\n");
}
}
int cmp_name(const void* e1, const void* e2)
{
return strcmp(((peoinfo*)e1)->name , ((peoinfo*)e2)->name);
}
void sort(contact* pc)
{
assert(pc);
printf("排序中....\n");
qsort(pc->data, pc->count, sizeof(peoinfo), cmp_name);
printf("排序成功!\n");
}
//test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include".h"
int main()
{
contact con;
init(&con);
int input = 0;
do
{
printf("欢迎使用本通讯录\n");
menu();
printf("请开始您的操作\n");
scanf("%d", &input);
switch (input)
{
case 0:
add(&con);
break;
case 1:
del(&con);
break;
case 2:
search(&con);
break;
case 3:
modify(&con);
break;
case 4:
show(&con);
break;
case 5:
sort(&con);
break;
case 6:
printf("退出通讯录\n");
break;
default:
printf("输入错误,请重新输入\n");
break;
};
} while(input!=6);
return 0;
}
11.19更新
改通讯录,用了动态内存管理,更灵活
枚举
联合
判断当前计算机的大小端存储
我的理解:
共用同一块内存,取啥时按照啥的类型来取;
往往大小是最大的那个类型的大小,但也不一定,联合也存在对齐现象。
位段
计算机网络中会用
动态内存管理
#include<stdio.h>
#include<stdlib.h>
int main()
{
//代码1
int num = 0;
scanf("%d", &num);
int arr[num] = {0};
//代码2
int* ptr = NULL;
ptr = (int*)malloc(num*sizeof(int));
if(NULL != ptr)//判断ptr指针是否为空
{
int i = 0;
for(i=0; i<num; i++)
{
*(ptr+i) = 0;
}
}
free(ptr);//释放ptr所指向的动态内存
ptr = NULL;//是否有必要?
return 0;
}