数组和算法基础

1.一维数组的定义与初始化
1.数组(Array)是一组具有相同类型的变量的集合,它是一种顺序存储、随机访问的顺序表结构。
int score[SIZE];
int 代表该数组的基类型,即数组中元素1类型。下表代表数组的维数。
需要注意的是,数组的下标都是从 0 开始的。
2.二维数组的定义与初始化

#include<stdio.h>
int AVE(int score[],int n);
int Read(int score[],int n);
#define N 40
int main()
{
    int score[N],aver,n;
    printf("Please input n:");
    scanf("%d",&n);
    Read(score,n);
    aver = AVE(score,n);
    printf("Average score is %d\n",aver);
}
int AVE(int score[],int n)
{
    int i,sum=0;
    for(i=0;i<n;i++)
    {
        sum += score[i];
        printf("sum = %d\n",sum);
    }
    return sum/n;
}
int Read(int score[],int n)
{
    int i;
    for(i=0;i<n;i++)
    {
        printf("Input score:");
        scanf("%d",&score[i]);
    }
}

把一个数组传递给一个函数,那么只要使用不带方括号的数组名作为函数实参调用函数即可。
由于数组名代表数组的第一个元素地址,因此用数组名作函数参数实际上是将数组的首地址传给被调函数。
3.排序和查找
排序就是把一系列无序的数据按照特定的顺序重新排列为有序的数据。
1.交换法排序

//选择法排序//
#include<stdio.h>
#define N 40
int ReadScore(int score[]);
void DataSort(int score[],int n);
void PrintScore(int socre[],int n);
int main()
{
    int score[N],n;
    n = ReadScore(score);
    printf("Total students are %d\n",n);
    DataSort(score,n);
    PrintScore(score,n);
    return 0;
}
int ReadScore(int score[])
{
    int i=-1;
    do{
        i++;
        printf("Input score:");
        scanf("%d",&score[i]);
    }while(score[i]>=0);
    return i;
}
void DataSort(int score[],int n)
//排序
{
    int i,j,temp;
    for(i = 0;i < n-1;i++)
    {
        for(j = i+1;j < n;j++)
        {
            if(score[j]>score[i])
            {
                temp = score[j];
                score[j] = score[i];
                score[i] = temp;
            }
        }
    }
}
void PrintScore(int score[],int n)
{
    int i;
    for(i=0;i<n;i++)
    {
        printf("%d",score[i]);
    }
    printf("\n");
}

2.选择法排序(Selection Sort)
首数和余下所有数先比较,然后再与符合条件的交换一次,最多交换n-1次。(记录下标法)

#include<stdio.h>
#define N 40
int ReadScore(int score[],long num[]);
void DataSort(int score[],long num[],int n);
void PrintScore(int socre[],long num[],int n);
int main()
{
    int score[N],n;
    long num[N];
    n = ReadScore(score,num);
    printf("Total students are %d\n",n);
    DataSort(score,num,n);
    printf("Sorted scores:\n");
    PrintScore(score,num,n);
    return 0;
}
int ReadScore(int score[],long num[])
{
    int i=-1;
    do{
        i++;
        printf("Input students's ID and scores:");
        scanf("%ld%d",&num[i],&score[i]);
    }while(score[i]>=0&&num[i]>=0);
    return i;
}
void DataSort(int score[],long num[],int n)
//排序
{
   int i,j,k,temp1;
   long temp2;
   for(i = 0;i < n-1;i++)
   {
       k = i;
       for(j = i+1;j < n;j++)
       {
           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 PrintScore(int score[],long num[],int n)
{
    int i;
    for(i=0;i<n;i++)
    {
        printf("%ld %d\n",num[i],score[i]);
    }
    printf("\n");
}

4.查找
1.线性查找

#include<stdio.h>
#define N 40
int Read(int score[],long num[]);
int Line(long num[],long x,int n);
int main(void)
{
    int score[N],n,pos;
    long num[N],x;
    n = Read(score,num);
    printf("Total Students are %d\n",n);
    printf("Input the searching ID:");
    scanf("%ld",&x);
    pos = Line(num,x,n);
    if(pos != -1)
        printf("score = %d\n",score[pos]);
    else
        printf("Not found!");
    return 0;
}
int Read(int score[],long num[])
{
    int i = -1;
    do{
        i++;
        printf("Input student's ID and score:");
        scanf("%ld%d",&num[i],&score[i]);
    }while(num[i] > 0 && score[i] > 0);
    return i;
}
int Line(long num[],long x,int n)
{
    int i;
    for( i = 0;i < n;i++)
    {
        if(num[i] == x)
        {
            return i;
        }
    }
    return -1;
}

2.折半查找

#include<stdio.h>
#define N 40
int Read(int score[],long num[]);
int Line(long num[],long x,int n);
int main(void)
{
    int score[N],n,pos;
    long num[N],x;
    n = Read(score,num);
    printf("Total Students are %d\n",n);
    printf("Input the searching ID:");
    scanf("%ld",&x);
    pos = Line(num,x,n);
    if(pos != -1)
        printf("score = %d\n",score[pos]);
    else
        printf("Not found!");
    return 0;
}
int Read(int score[],long num[])
{
    int i = -1;
    do{
        i++;
        printf("Input student's ID and score:");
        scanf("%ld%d",&num[i],&score[i]);
    }while(num[i] > 0 && score[i] > 0);
    return i;
}
int Line(long num[],long x,int n)
{
   int low = 0,high = n-1;
   int mid;
   int pos = -1;
   while(low < high)
   {
       mid = (high + low)/2;
       if(x > num[mid])
       {
           low = mid + 1;
       }
       else if(x < num[mid])
       {
           high = mid -1;
       }
       else
      return mid;
   }
      return -1;
}
/*标志变量法
int Line(long num[],long x,int n)
{
   int low = 0,high = n-1;
   int mid;
   int find = 0;
   int pos = -1;
   while(low < high)
   {
       mid = (high + low)/2;
       if(x > num[mid])
       {
           low = mid + 1;
       }
       else if(x < num[mid])
       {
           high = mid -1;
       }
       else
      {
      pos = mid;
      find = 1;
      }
      return -1;
}
*/


5.向函数传递二维数组

#include<stdio.h>
#define STUD_N 40
#define COURSE_N 3
void Read(int score[][COURSE_N],long num[],int n);
void AverS(int score[][COURSE_N],int sum[],float aver[],int n);
void AverC(int score[][COURSE_N],int sum[],float aver[],int n);
void Print(int score[][COURSE_N],long num[],int sumS[],float averS[],int sumC[],float averC[],int n);
int main()
{
    int score[STUD_N][COURSE_N],sumS[STUD_N],sumC[COURSE_N],n;
    long num[STUD_N];
    float averS[STUD_N],averC[COURSE_N];
    printf("input the total number of the students(n <= 40):");
    scanf("%d",&n);
    Read(score,num,n);
    AverS(score,sumS,averS,n);
    AverC(score,sumC,averC,n);
    Print(score,num,sumS,averS,sumC,averC,n);
}
void Read(int score[][COURSE_N],long num[],int n)
{
    int i,j;
    printf("Input student's ID and score as: MT EN PH:\n");
    for(i = 0; i < n;i++)
    {
        scanf("%ld",&num[i]);
        for(j = 0; j <COURSE_N;j++)
        {
            scanf("%d",&score[i][j]);
        }
    }
}
void AverS(int score[][COURSE_N],int sum[],float aver[],int n)
{
    int i,j;
    for(i = 0;i < n;i++)
    {
        sum[i] = 0;
        for(j  = 0;j < COURSE_N;j++)
        {
            sum[i] = sum[i] + score[i][j];
        }
        aver[i] = (float)sum[i]/COURSE_N;
    }
}
void AverC(int score[][COURSE_N],int sum[],float aver[],int n)
{
    int i,j;
    for(j = 0;j < COURSE_N;j++)
    {
        sum[j] = 0;
        for(i = 0;i < n;i++)
        {
            sum[j] = sum[j] + score[i][j];
        }
        aver[j] = (float)sum[j]/n;
    }
}
void Print(int score[][COURSE_N],long num[],int sumS[],float averS[],int sumC[],float averC[],int n)
{
    int i,j;
    printf("Student's ID\t MT\t EN\t PH\t SUM\t AVER\t\n");
    for(i = 0;i < n;i++)
    {
        printf("%12ld\t",num[i]);
        for(j = 0;j < COURSE_N;j++)
        {
            printf("%4d\t",score[i][j]);
        }
        printf("%4d\t% 5.1f\n",sumS[i],averS[i]);
    }
    printf("Sumofcourse\t");
    for(j = 0; j < COURSE_N;j++)
    {
        printf("%4d\t",sumC[j]);
    }
    printf("\nAverofCourse\t");
    for( j = 0;j < COURSE_N;j++)
    {
        printf("%4.1f\t",averC[j]);
    }
    printf("\n");
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值