该门课程成绩我的为优秀,仅供参考。
目录
课程设计要求
- 求指数n<30的所有梅森素数并输出
- 选美比赛排名
- 学生籍贯管理系统
所有代码:
#include<cstdio>
#include<cstring>
#include<math.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
# define M 30
//梅森素数
// 判断一个数是否为素数
int isPrime(int n) {
if (n <= 1) return 0;
int i;
for (i = 2; i <= sqrt(n); i++) {
if (n % i == 0) {
return 0;
}
}
return 1;
}
// 求指数n<30的所有梅森素数并输出
void findMersennePrimes() {
int n, i, t = 2, count = 0;
printf("指数n<30的所有梅森素数:\n");
for (n = 2; n < 30; n++) {
t = pow(2, n) - 1; // 求t=2的n次方-1
if (isPrime(t)) { // 判断t是否为素数
printf("%-10d ", t); // 输出结果
count++;
if (count % 5 == 0) { // 每行输出5个梅森素数
printf("\n");
}
}
}
printf("\n");
printf("您已经完成了指数n<30的所有梅森素数的求取,祝您工作顺利!");
}
//选美比赛
void xuanmei()
{
int j,n,i;
int a[10001],book[10000],b[10001],c[10000];//定义存储选手序号、选手得分、选手名次的数组
printf("请输入选手数量:");
scanf("%d",&n);//输入选手数量
printf("请依次输入选手序号(用空格隔开):");
for(i=0;i<n;i++)//输入选手序号
{
scanf("%d",&c[i]);
}
printf("请依次输入选手得分(用空格隔开):");
for(i=0;i<n;i++)//输入选手得分
{
scanf("%d",&a[i]);
}
for(i=0;i<n;i++)//排序
{
int count=1;
memset(book,0,sizeof(book));
for(j=0;j<n;j++)
{
if(a[j]>a[i]&&book[a[j]]==0)
{
book[a[j]]=1;
count++;
}
}
b[i]=count;
}
printf("各位选手的名次如下:");
for(i=0;i<n;i++)//输出选手名次
{
if(i==0)
printf("%d",b[i]);
else
printf(" %d",b[i]);
}
printf("\n");
printf("您已经完成了选美比赛成员的排名工作,祝您工作顺利!");
}
//学生籍贯管理系统
//定义一个学生结构体
typedef struct student//定义储存学生信息的结构体
{
char no[12]; //学号
char name[40]; //姓名
char tele[20]; //电话号码
int D[18]; //身份证号码
char jg[60]; //籍贯
char addr[80]; //通讯地址
struct student* next; //指向下一节点的指针
}STU;//后面可用STU定义变量或数组存放学生信息
//函数声明放在这里
STU* LIstInit(STU* L);//创建表头,初始化链表
STU* ListCreate(STU* L, int n);//创建链表,将新生成的节点插入到链表的表头
void ListInsert(STU* L);//插入学生的相关信息的函数
void ListDelete(STU* L, char n[40]);//删除某个学生的信息的函数
void LIstSearch(STU* L, char n[]);//查找学生的相关信息的函数
void input(STU* p, int i);//录入某个学生的信息的函数
void output(STU* L);//输出学生信息的函数
void menu1();//主菜单函数
void menu2();//学生籍贯管理系统菜单函数
//创建表头,初始化链表
STU* LIstInit(STU* L)
{
STU* head = NULL;
head = (STU*)malloc(sizeof(STU));
head->next = NULL;
L = head;
return L;
}
//创建链表,将新生成的节点插入到链表的表头
STU* ListCreate(STU* L, int n)
{
int i;
for (i = 0; i < n; i++)
{
STU* p;
//将新生成的节点插入到链表中
p = NULL;
p = (STU*)malloc(sizeof(STU));
input(p, i);
p->next = L->next;
L->next = p;
}
return L;
}
//对链表进行节点的插入操作
void ListInsert(STU* L)//插入学生的相关信息的函数
{
STU* s = NULL;
//生成一个新节点s
s = (STU*)malloc(sizeof(STU));
printf("请输入您要插入的学生的学号:");
scanf("%s", &s->no);
printf("请输入您要插入的学生的姓名:");
scanf("%s", &s->name);
printf("请输入您要插入的学生的电话号码:");
scanf("%s", &s->tele);
printf("请输入您要插入的学生的身份证号码:");
scanf("%s", &s->D);
printf("请输入您要插入的学生的籍贯:");
scanf("%s", &s->jg);
printf("请输入您要插入的学生的通讯地址:");
scanf("%s", &s->addr);
s->next = L->next;
L->next = s;
printf("插入成功!");
}
//对链表的进行节点的删除操作
void ListDelete(STU* L, char n[])//删除某个学生的信息的函数
{
STU* p = L->next, * pre = L; //定义p指针指向头节点的指向,定义pre指向头节点,pre始终指向p的前驱节点
if (p == NULL)
printf("数据为空,无法删除!");
else
{
while (strcmp(p->name, n) != 0)
{
pre = p;
p = pre->next;
if (p == NULL)
{
printf("没有找到相关信息,无法删除\n");//判断文件是否存在,是否删除成功
return;
}
}
pre->next = p->next;
free(p);
printf("删除成功");
}
}
void LIstSearch(STU* L, char n[])//查找某个学生的信息的函数
{
STU* p = L->next;
if (p == NULL)
printf("数据为空,无法查找!");
else
{
while (strcmp(p->name, n) != 0)
{
p = p->next;
if (p == NULL)
{
printf("没有找到相关信息\n");//判断文件是否存在,是否查找成功
return;
}
}
printf("该学生的籍贯为:\n");
printf("\t%s\n", p->jg);
}
}
void ListModify(STU* L, char na[])//修改某个学生的信息的函数
{
char JG[60];
STU* p = L->next;
while (p != NULL)
{
if (strcmp(p->name, na) == 0)
{
printf("请选择您修改后的学生籍贯:\n");
scanf("%s", &JG);
strcpy(p->jg, JG);
break;
}
p = p->next;
}
}
void input(STU* p, int i)//录入学生信息的函数
{
printf("请输入第%d名学生的学号:", i + 1);
scanf("%s", &p->no);
printf("请输入第%d名学生的姓名:", i + 1);
scanf("%s", &p->name);
printf("请输入第%d名学生的电话号码:", i + 1);
scanf("%s", &p->tele);
printf("请输入第%d名学生的身份证号码:", i + 1);
scanf("%s", &p->D);
printf("请输入第%d名学生的籍贯:", i + 1);
scanf("%s", &p->jg);
printf("请输入第%d名学生的通讯地址:", i + 1);
scanf("%s", &p->addr);
}
void output(STU* L)//输出函数
{
STU* p = L->next;
while (p != NULL)
{
printf("%s\t", p->no);
printf("%s\t", p->name);
printf("\t%s", p->tele);
printf("\t\t%s", p->D);
printf("\t%s", p->jg);
printf("\t%s", p->addr);
printf("\n");
p = p->next;
}
}
void PrintFile(STU* L)//保存学生信息的函数
{
STU* p = L->next;
FILE* fp;
fp = fopen("student.txt", "w");
fprintf(fp, "学号\t\t姓名\t\t电话号码\t\t身份证号码\t\t籍贯\t\t通讯地址\n");
while (p != NULL)
{
fprintf(fp, "%s\t", p->no);
fprintf(fp, "%s\t", p->name);
fprintf(fp, "\t%s", p->tele);
fprintf(fp, "\t%s", p->D);
fprintf(fp, "\t%s", p->jg);
fprintf(fp, "\t\t%s", p->addr);
fprintf(fp, "\n");
p = p->next;
}
printf("保存成功,请到当前目录下的student.txt文件中查看");
fclose(fp);
}
void menu1()//菜单函数
{
printf("\n\n");
printf("\t\t\t*******************C语言课程设计***********************\n");
printf("\t\t\t* 作者:魏永雷 班级:数据科学221 学号:3220706134 *\n");
printf("\t\t\t* *\n");
printf("\t\t\t* <1>. 求指数n<30的梅森素数 *\n");
printf("\t\t\t* <2>. 选美比赛排名 *\n");
printf("\t\t\t* <3>. 学生籍贯管理系统 *\n");
printf("\t\t\t* <0>. 退出系统 *\n");
printf("\t\t\t* 欢迎使用本系统! *\n");
printf("\t\t\t*******************************************************\n");
printf("\t\t\t输入选项,按回车进入选项: \n");
}
void menu2()//菜单函数
{
printf("\n\n");
printf("\t\t\t*******************学生籍贯管理系统********************\n");
printf("\t\t\t* 作者:魏永雷 班级:数据科学221 学号:3220706134 *\n");
printf("\t\t\t* *\n");
printf("\t\t\t* <1>. 录入学生的相关信息 *\n");
printf("\t\t\t* <2>. 查看全部学生的相关信息 *\n");
printf("\t\t\t* <3>. 查找某个学生的籍贯 *\n");
printf("\t\t\t* <4>. 修改某个学生的籍贯 *\n");
printf("\t\t\t* <5>. 删除某个学生的相关信息 *\n");
printf("\t\t\t* <6>. 插入某个学生的相关信息 *\n");
printf("\t\t\t* <7>. 保存学生信息 *\n");
printf("\t\t\t* <0>. 退出管理系统 *\n");
printf("\t\t\t* 欢迎使用本系统! *\n");
printf("\t\t\t*******************************************************\n");
printf("\t\t\t输入选项,按回车进入选项: \n");
}
int main()
{
int item, n; //item用于接收菜单输入的命令,n用于接收输入的学生人数
char nam[30];
STU* L = NULL;
L = LIstInit(L);
do
{
menu1();
printf("请输入相应的数字,进行相应的操作:\n");
scanf("%d", &item);
switch (item)//switch语句编写菜单选项
{
case 1:
findMersennePrimes(); // 求指数n<30的所有梅森素数并输出
break;
case 2:
xuanmei();
break;
case 3:
do
{
menu2();
printf("请输入相应的数字,进行相应的操作:\n");
scanf("%d", &item);
switch (item)//switch语句编写菜单选项
{
case 1:
printf("请输入您要录入的学生人数:");
scanf("%d", &n);
L = ListCreate(L, n);
break;
case 2:
printf("全部学生信息如下:\n");
printf("学号\t\t姓名\t\t电话号码\t\t身份证号码\t\t籍贯\t\t通讯地址\n");
output(L);
break;
case 3:
printf("请输入您要查找的学生姓名:");
scanf("%s", nam);
LIstSearch(L, nam);
break;
case 4:
printf("请输入您要修改的学生姓名:");
scanf("%s", nam);
ListModify(L, nam);
break;
case 5:
printf("请输入您要删除的学生的姓名:");
scanf("%s", nam);
ListDelete(L, nam);
break;
case 6:
ListInsert(L);
break;
case 7:
PrintFile(L);
break;
case 0:
printf("您已经完成了学生籍贯管理系统的工作,祝您工作顺利!");
printf("即将退出学生籍贯管理系统.....");
printf("下班啦,嘿嘿嘿!");
exit(0);
default:
printf("输入格式错误,请重新输入");
break;
}
printf("\n\n\n\n");
} while (item);
case 0:
printf("即将退出本系统.....");
exit(0);
default:
printf("输入格式错误,请重新输入");
break;
}
printf("\n\n\n\n");
} while (item);
return 0;
}
下面对代码中每个函数进行简要解释:
isPrime函数:用于判断一个数是否为素数,返回值为1表示是素数,返回0表示不是素数。
findMersennePrimes函数:该函数用于计算2的n次方-1(n<30)得到的梅森素数,并输出结果。在此过程中,调用了isPrime函数进行素数判断。
xuanmei函数:该函数用于进行选美比赛的排名,输入选手数量、选手序号、以及每个选手的得分,根据得分进行排名并输出。
结构体定义:定义了一个学生结构体,包含学生的各种信息,如学号、姓名、电话、身份证、籍贯、通讯地址,同时还包含一个指向下一节点的指针。
LIstInit函数:用于创建表头并初始化链表。
ListCreate函数:用于创建链表,并将生成的新节点插入到链表的表头。
input函数:录入某个学生的信息,包括学号、姓名、电话、身份证、籍贯、通讯地址。
output函数:输出所有学生的信息,按照学号、姓名、电话、身份证、籍贯、通讯地址的顺序进行输出。
ListInsert函数:用于插入一个新的学生节点,包括录入学生的各个信息
系统预览:
加油