C语言数组的排序查找插入删除本题目的任务是编写完成整数数组和结构体数组的排序、查找、插入、删除操作的

一、设计要求

1、数据定义

整型数组部分,设计一个10个元素的整型数组。键盘输入数组中的10个元素,并输出数组的原数据(原数组的数据和排列顺序)。以便与处理后的结果相比较。

结构体数组部分,设计一个结构体

struct student

{

char name[20];

int age;

double score;

};

定义一个该结构体的数组:struct student stu[10];

键盘输入数组中的10个元素,并输出数组的原数据(原数组的数据和排列顺序)。以便与处理后的结果相比较。要求输出为表格形式。

2、设计一个两级菜单,完成上述程序结构的控制与调用

3、编写排序函数(分别编写函数)

函数功能是对整型数组或结构体数组中的数据进行排序处理,并输出操作结果。

整型数组,要求使用冒泡排序法进行处理,从大到小排序,输入一组整数并输出,对这组整数进行排序,输出排序后的结果。

结构体数组,要求使用冒泡排序法进行处理,按照成绩或年龄从大到小排序,输入一组数据并以表格输出,对这组数据进行排序处理,以表格形式输出排序后的结果。

4、编写查询函数(分别编写函数)

函数功能是对整型数组或结构体数组中的数据进行查询处理,并输出操作结果。

整型数组,要求使用折半法进行处理,从键盘输入一组整数并输出,先调用排序函数将数据从大到小排序,再输入一个要查找的整数,调用查找函数进行查找操作,输出查找的结果。没找到输出相应的信息。

结构体数组,要求使用折半法进行处理,从键盘输入一组数据并以表格形式输出,先调用排序函数将数据按照年龄值从大到小排序,再输入一个要查找的年龄数,调用查找函数进行查找操作,输出查找的结果以表格形式输出。没找到输出相应的信息。

折半查找法:数据已按一定规律排列好,先检索序列1/2处的数据,判断其是否为所需数据。如果不是所需数据,则判断要查找的数据位于中间数的哪一边,下一次就在这个新的范围内查找……,每次将查找范围缩小一半,直至找到这个数或得出找不到的结论为止。

定义数组并进行初始化

排序处理

输入要查找的元素

top=0,bot=n-1

bot=mid-1

top=mid+1

输出信息

x<a[mid]

x>a[mid]

x==a[mid]

mid=(top+bot)/2

while(top<=bot)

5、编写插入函数

函数功能是在已经排好序的数组中插入一个数据或一条记录(结构体),使插入后的数据仍然是有序的。

整型数据,要求输入一组整数并输出;调用排序函数进行排序,输出排序结果;输入一个要插入的整数,实施插入操作,保证数据插入到正确的位置上,输出插入后的数据序列。

结构体数据,要求输入一组记录并以表格形式输出;调用排序函数按照年龄进行排序,以表格形式输出排序结果;输入要插入的一条记录,实施插入操作,保证数据插入到正确的位置上,以表格形式输出插入后的数据序列。

6、编写删除函数

函数功能是给定一个数据或一条记录(结构体),在数组先进行查找,如果找到将该数据删除,并输出结果;如果找不到,输出相应的信息。

整型数据,要求输入一组整数并输出;输入一个要删除的整数,进行查找,找到则实施删除操作,否则输出没找到的信息。

结构体数据,要求输入一组记录并以表格形式输出;输入要删除的一条记录,进行查找,按照姓名或年龄或成绩查找均可,找到则实施删除操作,否则输出没找到的信息。

*fp;
char a[10];
char ch;
int i,j,k;
system("cls");
printf("请输入要删除的学生姓名:");
scanf("%s",a);
system("cls");
fp=fopen("F:\\x.txt","r");
for(i=0;i<count;i++)//找到删除人所在的位置
{
fscanf(fp,"%s %d %d %d %d\n",s[i].name,&s[i].no,&s[i].score1,&s[i].score2,&s[i].score3);
if(!strcmp(s[i].name ,a))
{
printf("\t\t姓名 %s 学号 %d 成绩1 %d 成绩2 %d 成绩3 %d\n",s[i].name ,s[i].no ,s[i].score1 ,s[i].score2 ,s[i].score3 );
printf(" \t\t\t该同学的信息已成功删除!\n");
printf("\n");
break;
}
}
fclose(fp);
if(i==count)
{
printf("\t\t很抱歉,没有您所要查找的同学记录!\n");
printf("\n");
}
else
{
for(j=i;j<count-1;j++)
{
for(k=0;k<10;k++)
{
s[j].name[k]=s[j+1].name[k];
}
s[j].no=s[j+1].no;
s[j].score1=s[j+1].score1;s[j].score2=s[j+1].score2;s[j].score3=s[j+1].score3;
}
fp=fopen("F:\\x.txt","w");
fclose(fp);
fp=fopen("F:\\x.txt","a");
for(j=0;j<2;j++)
{
fprintf(fp,"%s %d %d %d %d\n",s[j].name,s[j].no,s[j].score1,s[j].score2,s[j].score3);
}
fclose(fp);
}
count=count-1;
}

这是我以前做的时候的代码,基本思想已经有了,将学籍信息从文件载入到结构体中,就是找到要删除的同学所在的位置,然后从该同学后面将其他人的信息依次向前挪一个,实现对该同学信息的覆盖。最后再将修改后的信息在重新存到文件中。

将文件中的内容读到结构体中时一开始就做了。设置了一个全局变量count,用于记录动态变化的学生的人数,每次操作完成后将count的值写到另一个文件夹中。每次程序开始执行时也要读入count 的值。
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-04-24
#include "stdafx.h"
#include "stdlib.h"
#include"string.h"
struct student
{char no[10];
char name[6];
int score1[6],score2[6],score3[6];
}s[5];
int main(int argc, char* argv[])
{
FILE *fp;
char a[10];
char ch;
int i,j,k,count;
printf("input informations of stuent:\n ");
for(i=0;i<5;i++)
scanf(fp,"%s %s %d %d %d\n",&s[i].name,&s[i].no,&s[i].score1,&s[i].score2,&s[i].score3);
printf("请输入要删除的学生姓名:\n");
scanf("%s",a);
fp=fopen("F:\\x.txt","r");
for(i=0;i<count;i++)//找到删除人所在的位置
{
if(!strcmp(s[i].name ,a))
{
printf("\t\t%s姓名 %s 学号 %d 成绩1 %d 成绩2 %d 成绩3 %d\n",s[i].name ,s[i].no ,s[i].score1 ,s[i].score2 ,s[i].score3 );
printf(" \t\t\t该同学的信息已成功删除!\n");
printf("\n");
}
}
fclose(fp);
if(i==count)
{
printf("\t\t很抱歉,没有您所要查找的同学记录!\n");
printf("\n");
}
else
{
for(j=i;j<count-1;j++)
{
for(k=0;k<10;k++)
{
s[j].name[k]=s[j+1].name[k];
}
s[j]=s[j+1];
}
fp=fopen("F:\\x.txt","w");
fclose(fp);
fp=fopen("F:\\x.txt","a");
for(j=0;j<2;j++)
{
printf("%s %s %d %d %d\n",s[j].name,s[j].no,s[j].score1,s[j].score2,s[j].score3);
}
fclose(fp);
}
count=count-1;
return 0;
}
用的Vc++运行的哦,你可看看啊本回答被提问者采纳
相似回答