设计目的
在完成C语言基础内容学习的基础上,结合数组、字符串、结构体与链表等内容,继续综合应用相关理论和编程技术,分析、设计并完成一个可应用的小项目。通过本项目,更为系统地建立知识的关联性,通过对问题的分析和实现方法的设计,进一步培养解决复杂工程问题的能力。
main函数
#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
//打印菜单
void menu()
{
printf("*******************************\n");
printf("*******1.add 2.del *******\n");
printf("*******3.census 4.mod ******\n");
printf("*******5.search 6.print ******\n");
printf("********* 0.exit ********\n");
printf("*******************************\n");
}
//枚举
enum Option
{
exit,
add,
del,
search,
mod,
sort,
print,
census
};
int main()
{
int input = 0;
//创建通讯录
Contact con;
//初始化数据表
Init(&con);
do
{
menu();
printf("请选择\n");
scanf("%d", &input);
switch (input)
{
case exit:
printf("退出通讯录\n");
break;
case add:
printf("******************************\n");
printf("****** 《专业类型》 *****\n");
printf("*******1.软件工程 ******\n");
printf("*******2.计算机科学 ******\n");
printf("*******3.数学 ******\n");
printf("*******4.人工智能 ******\n");
printf("******************************\n");
Add(&con);
break;
case del:
Delete(&con);
break;
case search:
Query(&con);
break;
case mod:
Modify(&con);
break;
case census://待完善
break;
case print:
Output(&con);
break;
default:
printf("请重新输入:\n");
break;
}
}
while (input);
return 0;
}
源文件
#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
//通过姓名查找学生
static int FindByName(Contact* pc, char name[])
{
for (int i = 0; i < pc->length; i++)
{
if (strcmp(pc->data[i].name, name) == 0)
{
return i;
}
}
return -1;
}
//初始化数据表
void Init(Contact* pc)
{
pc->length = 0;
memset(pc->data, 0, sizeof(pc->data));
}
//添加学生
void Add(Contact* pc)
{
if (pc->length == NUM)
{
printf("通讯录已满,无法添加!\n");
return;
}
//添加学生
printf("请输入专业\n");
scanf("%s", pc->data[pc->length].spec);
printf("请输入学号\n");
scanf("%s", pc->data[pc->length].Number);
printf("请输入姓名\n");
scanf("%s", pc->data[pc->length].name);
printf("请输入年龄\n");
scanf("%d", &(pc->data[pc->length].age));
printf("请输入性别\n");
scanf("%s", pc->data[pc->length].sex);
printf("请输入入学分数\n");
scanf("%f", &(pc->data[pc->length].score));
pc->length++;
printf("添加成功!\n");
}
//删除学生
void Delete(Contact* pc)
{
char name[20] = { 0 };
if (pc->length == 0)
{
printf("数据表为空!\n");
return;
}
printf("请输入您要删除的学生\n");
scanf("%s", name);
int pos = FindByName(pc, name);
//判断有无
if (pos == -1)
{
printf("没有该学生!\n");
return;
}
//删除学生
int i = 0;
for (i = pos; i < pc->length-1; i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->length--;
printf("删除成功!\n");
}
//查找学生
void Query(Contact* pc)
{
char name[20] = { 0 };
printf("请输入您要查找的学生姓名:\n");
scanf("%s", name);
int pos = FindByName(pc, name);
//判断有无
if (pos == -1)
{
printf("没有该学生人!\n");
return;
}
//打印
else
{
printf("专业:%s 学号:%d 姓名:%s 年龄:%d 性别:%c 入学分数:%.1f", pc->data[pos].spec, pc->data[pos].Number, pc->data[pos].name, pc->data[pos].age, pc->data[pos].score);
}
}
//修改学生人
void Modify(Contact* pc)
{
char name[20] = { 0 };
printf("请输入您要修改的学生姓名:\n");
scanf("%s", name);
int pos = FindByName(pc, name);
//判断有无
if (pos == -1)
{
printf("没有该学生人!\n");
return;
}
//添加学生
else
{
printf("请输入专业\n");
scanf("%s", pc->data[pc->length].spec);
printf("请输入学号\n");
scanf("%s", pc->data[pc->length].Number);
printf("请输入姓名\n");
scanf("%s", pc->data[pc->length].name);
printf("请输入年龄\n");
scanf("%d", &(pc->data[pc->length].age));
printf("请输入性别\n");
scanf("%s", pc->data[pc->length].sex);
printf("请输入入学分数\n");
scanf("%f", &(pc->data[pc->length].score));
}
}
//打印学生
void Output(Contact* pc)
{
for (int i = 0; i < pc->length; i++)
{
printf("专业:%s 学号:%d 姓名:%s 年龄:%d 性别:%c 入学分数:%.1f", pc->data[i].spec, pc->data[i].Number, pc->data[i].name, pc->data[i].age, pc->data[i].score);
}
}
void census(Contact* pc)
{
int i,a=b=c=d=m=w=sum1=sum2=0;
double age,score;
char s1[20]="软件工程",s2[20]="计算机科学",s3[20]="数学",s4[20]="人工智能";
char s5[]="M",s6[]="W";
for(i=0;i<pc->length;i++)
{
if(strcmp(pc->data[i].spec,s1)==0)
{
a++;
}
if(strcmp(pc->data[i].spec,s2)==0)
{
b++;
}
if(strcmp(pc->data[i].spec,s3)==0)
{
c++;
}
if(strcmp(pc->data[i].spec,s4)==0)
{
d++;
}
if(pc->data[i].sex=="M")
{
m++;
}
if(pc->data[i].sex=="W")
{
w++;
}
}
for(i=0;i<pc->length;i++)
{
sum1=sum1+pc->data[i].age;
}
age=(sum*1.0)/pc->length;
for(i=0;i<pc->length;i++)
{
sum2=sum2+pc->data[i].score;
}
score=(sum2*1.0)/pc->length;
printf("\n%s专业人数为:%d,%s专业人数为:%d,%s专业人数为:%d,%s专业人数为:%d",s1,a,s2,b,s3,c,s4,d);
printf("\n男生人数为:%d,女生人数为:%d",m,w);
printf("\n学生平均年龄为:%.2lf,学生平均成绩为:%.2lf",age,score);
}
头文件
#ifndef CONTACT_H_INCLUDED
#define CONTACT_H_INCLUDED
#pragma once
#include<stdio.h>
#include<string.h>
#define NUM 100
//学生信息类型定义
typedef struct STU
{
char spec[20]; //专业
char Number[8]; //学号
char name[20]; //姓名
int age; //年龄
char sex; // M 代表男性 W代表女性
float score // 入学分数
}STU;
//数据表类型定义
typedef struct Contact
{
STU data[NUM];//存放添加的人员信息
int length;//记录当前数据表人员个数
}Contact;
//初始化数据表
void Init(Contact*pc);
//添加以及录入学生信息
void Input(Contact* pc);
//删除学生信息
void Delete(Contact* pc);
//查找学生信息
void Query(Contact* pc);
//修改学生信息
void Modify(Contact* pc);
//打印学生信息
void Output(Contact* pc);
void census(Contact* pc);
#endif // CONTACT_H_INCLUDED