#include<bits/stdc++.h>
using namespace std;
typedef struct{
char name[100];
char id[100];
char sex;
int year,mon,day;
double C,M,E;
double sum,ave;
}student;//先弄好结构
void input(student *p){
scanf("%s %s %c",p->id,p->name,&p->sex);
scanf("%d %d %d",&p->year,&p->mon,&p->day);
scanf("%lf %lf %lf",&p->C,&p->M,&p->E);
p->sum=p->C+p->M+p->E;
p->ave=p->sum/3;
}//输入
void output(student *p){
printf("%s %s %c ",p->id,p->name,p->sex);
printf("%d %d %d ",p->year,p->mon,p->day);
printf("%.1f %.1f %.1f ",p->C,p->M,p->E);
printf("%.1f %.1f\n",p->ave,p->sum);
}//输出
void outputArray(student *p,int n)
{
for(int i=0;i<n;i++){
output(&p[i]);
}
}//对应List
int find(student *p,int n,char id[])
{
for(int i=0;i<n;i++){
if(strcmp(p[i].id,id)==0){
return i;
}
}
return -1;
}
int main()
{
char order[100];//字符串长度
student s[100];
char id[100];
student temp;
int i,index,n=0;
i=0;
while(1){
scanf("%s",order);
if(strcmp(order,"Insert")==0){
input(&temp);//开始调用函数
printf("Insert:\n");
index=find(s,i,temp.id);//(注意这里)也可以写成find(&s[0],i,temp.id)
if(index==-1){
s[i]=temp;
output(&s[i]);
i++;
}//需要修改的为题 不存在学号为id的学生无法输出failed
else{
printf("Failed\n");
}
}//上面的代码是查找 下面才是改变
else if(strcmp(order,"Delete")==0){
scanf("%s",id);
index=find(&s[0],i,id);
printf("Delete:\n");
if(index==-1){
printf("Failed\n");
}
else{
printf("Deleted\n");
for(n=index;n<=i-1;n++){
s[n]=s[n+1];
}
i--;
}
}
else if(strcmp(order,"Change")==0){
printf("Change:\n");
input(&temp);
index=find(&s[0],i,temp.id);// get新知识点!!! find(s,5)==find(&s[0],5)// 也就是将第一个指针传过去, 并带上长度
if(index!=-1){
s[index]=temp;
output(&s[index]);
}
else{
printf("Failed\n");
}
}
else if(strcmp(order,"Find")==0){
scanf("%s",id);
printf("Find:\n");
index=find(s,i,id);
if(index==-1){
printf("Failed\n");
}
else{
output(&s[index]);
}
}
//k=index s=s n=i
else if(strcmp(order,"List")==0){
printf("List:\n");
outputArray(s,i);
}//输出所有学生
else if(strcmp(order,"Quit")==0||strcmp(order,"Exit")==0){
printf("Good bye!\n");
break;
}
}
return 0;
}
作者个人认为,一个程序员想要走的多远,就应该有多深的基础,这次我小小的分享一个小知识点,也就是数组传递到函数要怎么传递
很多人都会遇到这样的函数
比如
int s[4];
find(s,5);
其实这就只是把第一个指针传过去,并带上长度,仅此而已;
所以我这里写另一个更浅显易懂的格式
int s[4];
find(&s[0],5)
下面带上一题有点长的例题
2000-删除学生信息
时间限制: 1000 毫秒 内存限制: 32768 K字节
判题规则:严格比较
问题描述
请设计一个简单的学生成绩管理系统,要求系统实现以下功能: 插入一个学生的信息: 插入学生信息: Insert id name sex year month day x y z, 其中的参数分别为学号、姓名、性别、 出生日期(年、月、日)、三门课的成绩,成绩为浮点数。 按输入顺序输出学生信息 List 查找学生信息: Find id 查找学号为id的学生信息。 修改学生信息: Change id newname,newsex,newyear,newmonth,newday,newx,newy,newz 把学号为id的学生信息修改为 newname,newsex,newyear,newmonth,newday,newx,newy,newz(学号保持不变) 删除学生信息: Delete id 删除学号为id的学生信息 退出程序:Quit或者Exit 请注意:姓名的长度不超过20。
输入
输入有多行,每行一条指令,指令格式如下: Insert id name sex year month day x y z 其中的参数分别为学号、姓名、性别、出生日期(年、月、日)三门课的成绩,成绩为浮点数。 List 按输入的顺序输出所有学信息。 Find id 查找学号为 id 的学生信息。 Change id newname,newsex,newyear,newmonth,newday,newx,newy,newz 把学号为id的学生信息修改为 newname,newsex,newyear,newmonth,newday,newx,newy,newz(学号保持不变) Delete id 删除学号为id的学生信息 Quit或者Exit 输出"Good bye!"后结束程序。
输出
输出有多行,对应命令的输出如下: Insert id name sex year month day x y z 插入后在单独的一行中输出"Insert:",如果链表中不存在相同学号的学生信息,在第二行中显示学生信息, 格式: id name sex year month day x y z ave sum,分别为学号、姓名、性别、 出生日期(年、月、日)和三门课(语文、数学、英语)的成绩,平均成绩和总成绩, 数据之间用一个空格分开,成绩保留1位小数。 否则,输出"Failed" List 输出"List:"后,按输入顺序输出所有学生的信息,格式与插入学生信息后输出的格式相同。 Find id 第一行显示”Find:",第二行显示格式如下: 如果找到学号为id的学生,则在单独一行中显示学生信息, 格式如List。否则在单独一行显示"Failed"。 Change id newname,newsex,newyear,newmonth,newday,newx,newy,newz 第一行显示"Change:"。如果链表中不存在学号为id的学生,显示"Failed"。 否则修改该学生信息并在单独一行中显示该生信息,显示格式如List命令。 Delete id 第一行显示"Delete:"。如果链表中不存在学号为id的学生,显示"Failed"。 否则删除该学生信息并在单独一行中显示"Deleted" Quit或者Exit 在单独一行中输出"Good bye!"后结束程序。
输入样列
Insert 0911001 zhangsan F 1992 3 24 87 78 65
Insert 0911003 Lisi F 1992 5 3 77 72 55
Find 0911002
Find 0911003
Insert 0911002 zhaoliu F 1993 8 8 97 90 55
List
Insert 0911001 zhangou M 1992 3 24 98 78 65
Change 0911002 zhaoliu M 1990 9 9 90 91 92
Change 0911005 zhaoliu M 1990 9 9 90 91 92
Delete 0911001
List
Delete 0911006
Insert 0911005 Wangrong F 1990 12 12 68 56 100
Find 0911002
Insert 0911004 Wangwu F 1991 9 2 68 56 95
Quit
输出样例
Insert:
0911001 zhangsan F 1992 3 24 87.0 78.0 65.0 76.7 230.0
Insert:
0911003 Lisi F 1992 5 3 77.0 72.0 55.0 68.0 204.0
Find:
Failed
Find:
0911003 Lisi F 1992 5 3 77.0 72.0 55.0 68.0 204.0
Insert:
0911002 zhaoliu F 1993 8 8 97.0 90.0 55.0 80.7 242.0
List:
0911001 zhangsan F 1992 3 24 87.0 78.0 65.0 76.7 230.0
0911003 Lisi F 1992 5 3 77.0 72.0 55.0 68.0 204.0
0911002 zhaoliu F 1993 8 8 97.0 90.0 55.0 80.7 242.0
Insert:
Failed
Change:
0911002 zhaoliu M 1990 9 9 90.0 91.0 92.0 91.0 273.0
Change:
Failed
Delete:
Deleted
List:
0911003 Lisi F 1992 5 3 77.0 72.0 55.0 68.0 204.0
0911002 zhaoliu M 1990 9 9 90.0 91.0 92.0 91.0 273.0
Delete:
Failed
Insert:
0911005 Wangrong F 1990 12 12 68.0 56.0 100.0 74.7 224.0
Find:
0911002 zhaoliu M 1990 9 9 90.0 91.0 92.0 91.0 273.0
Insert:
0911004 Wangwu F 1991 9 2 68.0 56.0 95.0 73.0 219.0
Good bye!