#define N 30
int Average(int score[], int n)/* Average()函数原型 */
void ReadScore(int score[], long num[],int n)/* ReadScore()函数原型 */
void DataSort(int score[], long num[], int n)
void PrintScore(int score[], long num[], int n)
void DataNum(int score[], long num[], int n)
void PrintNum(int score[], long num[], int n)
void SearchNum(int score[],long num[],int n)
void Statistics(int score[], int n)
void List(int score[], long num[], int n)
int main()
{
int choice,n,score[N], aver=0,i,sum=0
long num[N]
do
{
printf("1: Append record\n")
printf("2: Caculate total and average score of course\n")
printf("3: Sort in descending order by score\n")
printf("4: Sort in ascending order by number\n")
printf("5: Search by number\n")
printf("6: Statistic analysisc\n")
printf("7: List record\n")
printf("0: Exit\n")
scanf("%d",&choice)
switch(choice)
{
case 1:printf("Total students are:")
scanf("%d",&n)
ReadScore (score,num,n)
break
case 2:aver = Average(score, n)
printf("Average score is %d\n",aver)
for (i=0i<ni++)
{
sum += score[i]
}
printf("Caculate total score is %d\n",sum)
break
case 3:DataSort(score,num,n)
printf("Sorted scores :\n")
printf(" number:score: \n")
PrintScore(score,num,n)
break
case 4:DataNum(score,num,n)
printf("Sorted number :\n")
printf(" number:score: \n")
PrintNum(score,num,n)
break
case 5:SearchNum(score,num,n)
break
case 6:Statistics(score, n)
break
case 7:List(score,num,n)
break
case 0:break
}
}while(choice!=0)
return 0
}
/* 1、函数功能:输入n个学生的学号及某门课成绩 */
void ReadScore(int score[], long num[],int n)
{
int i
for(i=0i<ni++)
{
printf("Input student's ID and score:")
scanf("%ld%d",&num[i],&score[i])
}
}
/* 2、函数功能:计算课程的总分和平均分 */
int Average(int score[], int n) /* Average()函数定义 */
{
int i, sum = 0
for (i=0i<ni++)
{
sum += score[i]
}
return sum / n
}
/* 3、函数功能:成绩由高到低排序 */
void DataNum(int score[], long num[], int n)
{
int i,j,k,temp1
long temp2
for(i=0i<n-1i++)
{
k=i
for(j=i+1j<nj++)
{
if (score[j]>score[k])
{
k=j
}
}
if(k!=i)
{
temp1=score[k]score[k]=score[i]score[i]=temp1
temp2=num[k]num[k]=num[i]num[i]=temp2
}
}
}
/* 函数功能:显示排序后学生学号和成绩 */
void PrintNum(int score[], long num[], int n)
{
int i
for(i=0i<ni++)
{
printf(" %10ld%4d\n",num[i],score[i])
}
}
/* 4、函数功能:学号由小到大排序 */
void DataSort(int score[], long num[], int n)
{
int i,j,k,temp1
long temp2
for(i=0i<n-1i++)
{
k=i
for(j=i+1j<nj++)
{
if (num[j]<num[k])
{
k=j
}
}
if(k!=i)
{
temp1=num[k]num[k]=num[i]num[i]=temp1
temp2=score[k]score[k]=score[i]score[i]=temp2
}
}
}
/* 函数功能:显示排序后学生学号和成绩 */
void PrintScore(int score[], long num[], int n)
{
int i
for(i=0i<ni++)
{
printf(" %10ld%4d\n",num[i],score[i])
}
}
/* 5、函数功能:按学号查询学生排名及其成绩*/
void SearchNum(int score[],long num[],int n)
{
long number
int i
printf("Please input the number you want to search:")
scanf("%ld",&number)
for(i=0i<ni++)
{
if(num[i]==number)
{
printf("%ld %d\n",num[i],score[i])
return
}
}
printf("\nNot found!\n")
}
/* 6、函数功能:统计个人类别的人数以及所占的百分比*/
void Statistics(int score[], int n)
{
int i,a=0,b=0,c=0,d=0,e=0
for(i=0i<ni++)
{
if(score[i]>=90)
{
a++
}
else if(score[i]>=80)
{
b++
}
else if(score[i]>=70)
{
c++
}
else if(score[i]>=60)
{
d++
}
else
{
e++
}
}
printf("优秀人数:%d\t占:%.3f%%\n良好人数:%d\t占:%.3f%%\n中等人数:%d\t占:%.3f%%\n及格人数:%d\t占:%.3f%%\n不及格人数:%d\t占:%.3f%%\n",a,(float)100*a/n,b,(float)100*b/n,c,(float)100*c/n,d,(float)100*d/n,e,(float)100*e/n)
}
/* 7、函数功能:输入学生学号、成绩、总分、平均分*/
void List(int score[], long num[], int n)
{
int i, j=0
for(i=0i<ni++)
{
printf("学号:%ld\t考试成绩:%d\n",num[i],score[i])
j+=score[i]
}
printf("课程总分:%d\n平均分:%.3f\n",j,(float)j/n)
}
1实验目的:熟练掌握一维数组,二维数组的定义,初始化和输入输出方法熟练掌握与数组有关的常用算法(如查找,排序等)。2实验内容:设定一个整形数组存放20个元素,用直接赋值的方法在程序中初始化该数组。先对这些无序的数据进行排序,然后采用折半查找,把要寻找的数的位置输出出来。
3算法描述流程图
源程序:#include<stdio.h>
void main()
{int k,s,b,i,j,m,n,a[20]={12,9,16,21,6,11,19,4,8,20,15,2,5,18,14,7,3,10,13,17}
for(s=0s<20s++)
{
for(i=s+1i<20i++)
{
if(a[s]>a[i])
{
j=a[s]
a[s]=a[i]
a[i]=j
}
}
}
scanf("%d",&b)
m=0
n=19
while(m<=n)
{
k=(m+n)/2
if(b==a[k])
{
printf("FOUND\n")
printf("%d\n",k+1)
break
}
else
{
if(b<a[k])
n=k-1
else
m=k+1
}
if(m>n)
printf("NO FOUND")
}
}
5测试数据:3,5, 20,30
6运行结果:FOUND 2FOUND 4FOUND 19 NO FOUND
7出现问题及解决方法:编译时出错,修改源程序,直到没有错误为止
8实验心得:通过折半查找,可以实现对数组数据的处理,并且增加了查找速度
//线性表函数操作#include <stdio.h>
#include <string.h>
#define MaxSize 30
#define Error 0
#define True 1
typedef char ElemType
typedef struct
{
ElemType elem[MaxSize]
int length
}SqList/*顺序表类型定义*/
void InitList(SqList * &L) /*初始化顺序表L*/
{
L = (SqList *)malloc(sizeof(SqList))
L ->length = 0
}
void DestroyList( SqList *L ) /*释放顺序表L*/
{
free(L)
}
int ListEmpty( SqList *L )/*判断顺序表L是否为空表*/
{
return( L ->length == 0)
}
int ListLength( SqList *L ) /*返回顺序表L的元素个数*/
{
return( L ->length)
}
void DispList( SqList *L )/*输出顺序表L*/
{
int i
if( ListEmpty(L))
return
for( i = 0i <L ->lengthi++ )
printf("%c", L ->elem[i])
printf("\n")
}
int GetElem( SqList *L, int i, ElemType &e) /*获取顺序表中的第i个元素*/
{
if( i <1 || i >L ->elem[i])
return Error
e = L ->elem[i - 1]
return True
}
int LocateElem( SqList *L, ElemType e) /*在顺序表中查找元素e*/
{
int i = 0
while( i <L ->length &&L ->elem[i] != e)
i++
if(i >= L ->length)
return Error
else
return i+1
}
int ListInsert( SqList * &L, int i, ElemType e) /*在顺序表L中第i个位置插入元素e*/
{
int j
if( i <1 || i >L ->length + 1)
return 0
i-- /*将顺序表位序转化为elem下标*/
for( j = L ->lengthj >ij--)/*将elem[i]及后面元素后移一个位置*/
L ->elem[j] = L ->elem[j - 1]
L ->elem[i] = e
L ->length++ /*顺序表长度增1*/
return True
}
int ListDelete( SqList * &L, int i, ElemType &e) /*顺序表L中删除第i个元素*/
{
int j
if( i <1 || i >L ->length)
return Error
i-- /*将顺序表位序转化为elem下标*/
e = L ->elem[i]
for(j = ij <L ->length - ij++)
L ->elem[j] = L ->elem[j + 1]
L ->length-- /*顺序表长度减1*/
return True
}
void main()
{
SqList *L
ElemType e
printf("(1)初始化顺序表L\n")
InitList(L)
printf("(2)依次采用尾插法插入a,b,c,d,e元素\n")
ListInsert(L, 1, 'a')
ListInsert(L, 2, 'b')
ListInsert(L, 3, 'c')
ListInsert(L, 4, 'd')
ListInsert(L, 5, 'e')
printf("(3)输出顺序表L:")
DispList(L)
printf("(4)顺序表L长度 = %d\n", ListLength(L))
printf("(5)顺序表L为%s\n", (ListEmpty(L) ?"空" :"非空"))
GetElem(L, 3, e)
printf("(6)顺序表L的第3个元素 = %c\n", e)
printf("(7)元素a的位置 = %d\n", LocateElem(L,'a'))
printf("(8)在第4个元素位置上插入f元素\n")
ListInsert(L, 4, 'f')
printf("(9)输出新的顺序表L:")
DispList(L)
printf("(10)删除L的第3个元素\n")
ListDelete(L, 3, e)
printf("(11)输出新的顺序表L:")
DispList(L)
printf("(12)释放顺序表L\n")
DestroyList(L)
}