c语言结构体问题

strucr std
{
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函数,判断学号是否重复。
题主看明白这三个函数就可以了。

温馨提示:答案为网友推荐,仅供参考