
c语言结构体问题
strucrstd{intid;charname[];};stduser[100];intmain(){如何在100到500的id中间找到一个id并修改修改后的id不能和...
strucr std
{
int id;
char name[];
};
std user[100];
int main()
{
如何在100到500的id中间找到一个id并修改
修改后的id不能和整个user[100]里所有的id
重复 重复提示重新录入按0取消
} 展开
{
int id;
char name[];
};
std user[100];
int main()
{
如何在100到500的id中间找到一个id并修改
修改后的id不能和整个user[100]里所有的id
重复 重复提示重新录入按0取消
} 展开
展开全部
我这里有一份完整的学生信息管理系统代码,我摘录出题主需要的查找、修改部分部分吧~
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define status int
#define NAME 30 /*各类名称字数上限*/
#define STU 100 /*学生人数上限*/
#define SUB 10 /*课程数上限*/
typedef struct record {
float score; /*成绩分数*/
char level; /*成绩分数段*/
} record;
typedef struct student {
int id; /*学号*/
int no; /*学号*/
char name[NAME]; /*姓名*/
record scores[SUB]; /*各门课成绩分数*/
float totalScore; /*总分*/
float averageScore; /*平均分*/
char totalLevel; /*总分数段*/
int ranking; /*名次*/
} student;
char subject[SUB][NAME]; /*课程名称*/
/**********************以下为函数声明**********************/
status inputTestStuInfo (student stu[], int *stuNum, int *subNum); /*测试数据*/
int noRepeated (student stu[], int stuNum, int no); /*学号判重*/
status printInputStuInfoheader (int subNum); /*输出录入学生信息之表头*/
status inputStuInfo (student stu[], int *stuNum, int subNum, int stuIndex, int ismod); /*录入单个学生信息*/
status printStuInfoheader (int subNum, int inclRanking); /*输出学生信息之表头*/
status printStuInfo (student stu[], int stuIndex, int subNum, int inclRanking); /*输出单个学生信息*/
int compareStuInfo (student stu[], int stuNum, int rsIndex[], int inclNo, int no, int inclName, char name[]); /*按学号、姓名查找学生信息,返回结果个数*/
status modifyStuInfoByIndex (student stu[], int *stuNum, int subNum, int stuIndex); /*修改指定位置的学生信息*/
status modStuInfo (student stu[], int *stuNum, int subNum); /*修改学生信息*/
int getCommand (void); /*输入命令编号*/
status printMenuText (void); /*打印菜单文本*/
status runMeun (student stu[], int *stuNum, int subNum); /*运行菜单*/
status pressAnykeyToContinue (void); /*按任意键继续*/
/**********************以上为函数声明**********************/
int main (void) {
int stuNum; /*学生人数*/
int subNum; /*课程数*/
student stu[STU+1]; /*学生结构体数组,最后留一位buffer*/
inputTestStuInfo (stu, &stuNum, &subNum);
runMeun (stu, &stuNum, subNum); /*运行菜单*/
return 0;
}
/*测试数据*/
status inputTestStuInfo (student stu[], int *stuNum, int *subNum) {
status testStatus;
int i;
*subNum = 2;
memcpy (subject[0], "语文" ,4);
memcpy (subject[1], "数学" ,4);
*stuNum = 7;
stu[0].id=1;
stu[0].no=1001;
strcpy (stu[0].name,"Zhao");
stu[0].scores[0].score=65.5;
stu[0].scores[1].score=77;
stu[1].id=2;
stu[1].no=1002;
strcpy (stu[1].name,"Qian");
stu[1].scores[0].score=88;
stu[1].scores[1].score=76;
stu[2].id=3;
stu[2].no=1003;
strcpy (stu[2].name,"Sun");
stu[2].scores[0].score=72;
stu[2].scores[1].score=69;
stu[3].id=4;
stu[3].no=1004;
strcpy (stu[3].name,"Li");
stu[3].scores[0].score=98.5;
stu[3].scores[1].score=80;
stu[4].id=5;
stu[4].no=1005;
strcpy (stu[4].name,"Zhou");
stu[4].scores[0].score=56.5;
stu[4].scores[1].score=60.5;
stu[5].id=6;
stu[5].no=1006;
strcpy (stu[5].name,"Wu");
stu[5].scores[0].score=71;
stu[5].scores[1].score=58;
/*与stu[5]姓名相同*/
stu[6].id=7;
stu[6].no=1007;
strcpy (stu[6].name,"Wu");
stu[6].scores[0].score=45;
stu[6].scores[1].score=51;
return 1;
}
/*学号判重*/
/*重复返回1;不重复返回0*/
int noRepeated (student stu[], int stuNum, int no) {
int i;
for (i=0; i<stuNum; i++)
if (no == stu[i].no)
return 1;
return 0;
}
/*输出录入学生信息之表头*/
status printInputStuInfoheader (int subNum) {
int i;
puts ("--------------------------------------------------------------------------");
printf ("\t\t学号\t姓名\t");
for (i=0; i<subNum; i++)
printf ("%s\t",subject[i]);
putchar ('\n');
puts ("--------------------------------------------------------------------------");
return 1;
}
/*录入单个学生信息*/
/*参数说明:*/
/*int ismod:是否修改信息。是:1;否:0*/
/*返回值说明*/
/*0:本次未录入;-1:学号重复;-2成绩错误;1:录入成功*/
status inputStuInfo (student stu[], int *stuNum, int subNum, int stuIndex, int ismod) {
int i,temp;
fflush (stdin); /*清除缓冲区*/
scanf ("%d",&temp);
if (temp==-1) /*录入-1以结束*/
return 0; /*本次未录入*/
/*非修改,即新增学生信息*/
if (ismod == 0) {
if (noRepeated (stu, *stuNum, temp)==1) /*学号重复*/
return -1;
}
/*修改学生信息*/
if (ismod == 1) {
if (temp!=stu[stuIndex].no && noRepeated (stu, *stuNum, temp)==1) /*学号不等于原学号,且学号重复*/
return -1;
}
stu[stuIndex].id = (*stuNum)+1; /*分配id*/
stu[stuIndex].no = temp; /*学号*/
scanf ("%s",&stu[stuIndex].name); /*姓名*/
for (i=0; i<subNum; i++) {
scanf ("%f",&stu[stuIndex].scores[i].score);
} /*各门课成绩分数*/
for (i=0; i<subNum; i++)
if (stu[stuIndex].scores[i].score>100 || stu[stuIndex].scores[i].score<0)
return -2; /*成绩错误*/
if (ismod!=1)
*stuNum+=1;
return 1; /*本次录入成功*/
}
/*输出学生信息之表头*/
status printStuInfoheader (int subNum, int inclRanking) {
int i;
puts ("--------------------------------------------------------------------------");
printf ("%-4s%2c","id",32);
if (inclRanking)
printf ("%-4s%2c","名次",32);
printf ("%-4s%2c","学号",32);
printf ("%-10s%2c","姓名",32);
for (i=0; i<subNum; i++) {
printf ("%-6s%2c",subject[i],32);
//printf ("%-6s%2c","分数段",32);
}
printf ("%-6s%2c","总分",32);
printf ("%-6s%2c","平均分",32);
printf ("%-8s%2c","总分数段",32);
putchar ('\n');
puts ("--------------------------------------------------------------------------");
}
/*输出单个学生信息*/
status printStuInfo (student stu[], int stuIndex, int subNum, int inclRanking) {
int i;
printf ("%-4d%2c",stu[stuIndex].id,32); /*id*/
if (inclRanking) { /*输出包含名次信息*/
if (stu[stuIndex].ranking == 0)
printf ("%-4s%2c","--",32);
else
printf ("%-4d%2c",stu[stuIndex].ranking,32); /*名次*/
}
printf ("%-4d%2c",stu[stuIndex].no,32); /*学号*/
printf ("%-10s%2c",stu[stuIndex].name,32); /*姓名*/
for (i=0; i<subNum; i++) { /*各门课成绩分数、分数段*/
printf ("%-6.2f%2c",stu[stuIndex].scores[i].score,32);
//printf ("%-6c%2c",stu[stuIndex].scores[i].level.32);
}
printf ("%-6.2f%2c",stu[stuIndex].totalScore,32); /*总分*/
printf ("%-6.2f%2c",stu[stuIndex].averageScore,32); /*平均分*/
printf ("%-8c%2c",stu[stuIndex].totalLevel,32); /*总分数段*/
putchar ('\n');
return 1;
}
/*按学号、姓名查找学生信息,返回结果个数*/
/*参数说明:*/
/*int rsIndex[]:存储符合查找条件的元素在student stu[]中的下标*/
/*int inclNo,int inclName:是否按学号、姓名查找*/
/*返回值说明:*/
/*正常返回符合条件的元素个数;参数错误或不支持的查找方式返回-1*/
int compareStuInfo (student stu[], int stuNum, int rsIndex[], int inclNo, int no, int inclName, char name[]) {
int noIndex[STU],nameIndex[STU];
int noCount,nameCount,rsCount;
int para; /*查找方法参数*/
int i;
memset (noIndex, -1, STU);
memset (nameIndex, -1, STU);
memset (rsIndex, -1, STU);
noCount = nameCount = rsCount = 0;
para = inclNo*10+inclName;
for (i=0; i<stuNum; i++) {
if (stu[i].no==no) {
noIndex[i]=i;
noCount++;
}
if (strcmp (stu[i].name,name)==0) {
nameIndex[i]=i;
nameCount++;
}
}
/*只按学号查找*/
if (para==10) {
for (i=0; i<stuNum; i++)
rsIndex[i] = noIndex[i];
return noCount;
}
/*只按姓名查找*/
else if (para==1) {
for (i=0; i<stuNum; i++)
rsIndex[i] = nameIndex[i];
return nameCount;
}
/*同时按学号、姓名查找*/
else if (para==11) {
for (i=0; i<stuNum; i++)
if (noIndex[i]==nameIndex[i] && noIndex[i]!=-1 && nameIndex[i]!=-1) {
rsIndex[i] = i;
rsCount++;
}
return rsCount;
}
else
return -1;
}
/*修改指定位置的学生信息*/
status modifyStuInfoByIndex (student stu[], int *stuNum, int subNum, int stuIndex) {
int i;
status inputStatus;
if (stuIndex > (*stuNum)-1) /*位置不合理*/
return -1;
inputStatus = inputStuInfo (stu, stuNum, subNum, stuIndex, 1); /*修改学生信息*/
return inputStatus;
}
/*修改学生信息*/
status modStuInfo (student stu[], int *stuNum, int subNum) {
int modNo,rsCount,rsIndex[STU];
int i,key;
status modStatus;
system ("cls");
puts ("==========================================================================");
puts ("修改指定学生信息");
puts ("==========================================================================");
putchar ('\n');
puts ("请输入欲修改学生信息的学号(可通过查找功能获取) ↓↓");
printf ("\t学号:");
scanf ("%d",&modNo);
putchar ('\n');
rsCount = compareStuInfo (stu, *stuNum, rsIndex, 1, modNo, 0, "");
if (rsCount) {
printf ("请确认是否修改以下%d名学生信息?\n",rsCount);
putchar ('\n');
printStuInfoheader (subNum, 1); /*输出信息之表头(包含名次信息)*/
for (i=0; i<*stuNum; i++)
if (rsIndex[i]!=-1)
printStuInfo (stu, rsIndex[i], subNum, 1); /*输出学生信息(包含名次信息)*/
puts ("--------------------------------------------------------------------------");
putchar ('\n');
do {
printf ("确认修改?(y/n):");
fflush (stdin);
key=getchar ();
putchar ('\n');
switch (key) {
case 'y':
case 'Y':
printInputStuInfoheader (subNum); /*录入信息之表头*/
printf ("重新输入信息\t");
for (i=0; i<*stuNum; i++) {
if (rsIndex[i]!=-1)
modStatus = modifyStuInfoByIndex (stu, stuNum, subNum, rsIndex[i]);
}
puts ("--------------------------------------------------------------------------");
putchar ('\n');
if (modStatus == 1)
puts ("修改成功!即将返回主菜单。");
else if (modStatus < 0) {
printf ("修改失败:");
if (modStatus == -1)
printf ("学号重复!");
if (modStatus == -2)
printf ("成绩错误!");
puts ("即将返回主菜单。");
}
break;
case 'n':
case 'N':
puts ("已取消修改操作!即将返回主菜单。");
break;
default:
puts ("输入错误,请重新输入!");
break;
}
} while (key!='y'&&key!='Y'&&key!='n'&&key!='N');
}
else
puts ("无符合条件的学生!即将返回主菜单。");
pressAnykeyToContinue ();
return 1;
}
/*输入命令编号*/
int getCommand (void) {
int key; /*命令编号*/
printf("请输入命令编号以开启操作:");
scanf ("%d",&key);
return key;
}
/*打印菜单文本*/
status printMenuText (void) {
puts ("==========================================================================");
puts ("学生信息管理");
puts ("--------------------------------------------------------------------------");
printf ("%4c\t功能详情\n",'#');
puts ("--------------------------------------------------------------------------");
printf ("%4d\t修改指定学生信息\n",5);
printf ("%4d\t退出\n",0);
puts ("==========================================================================");
putchar ('\n');
return 1;
}
/*运行菜单*/
status runMeun (student stu[], int *stuNum, int subNum) {
int key;
do {
system ("cls"); /*清屏*/
printMenuText (); /*打印菜单文本*/
key = getCommand (); /*输入命令编号*/
putchar ('\n');
system ("cls");
switch (key) {
case 5: modStuInfo (stu, stuNum, subNum); break;
case 0:
printMenuText ();
puts ("程序结束!");
pressAnykeyToContinue ();
break;
default:
printMenuText ();
puts ("命令编号错误,请重新输入!");
pressAnykeyToContinue ();
break;
}
} while (key!=0);
return 1;
}
/*按任意键继续*/
status pressAnykeyToContinue (void) {
putchar ('\n');
puts ("按任意键继续...");
fflush (stdin);
getch ();
return 1;
}
运行结果
主界面
按学号查找
确定修改-学号重复
确定修改-修改成功
追问
写的太难了
追答
核心三个函数:compare函数,按学号查找学生信息,返回位置;modifyStuInfoByIndex函数,修改指定位置学生信息;noRepeated函数,判断学号是否重复。
题主看明白这三个函数就可以了。

2023-08-15 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件...
点击进入详情页
本回答由光点科技提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |