C语言知识笔记(第四段-数组和算法基础)

1、数组

数组 :一组具有相同类型的变量的集合,一种顺序存储、随机访问的顺序表结构

引入数组,来解决需要对相同类型的批量数据进行处理的问题

C语言通过数组下标实现对数组元素的访问

数组名代表数组首元素地址! a <=> &a[0]        or        &a[0][0]

不能使用变量定义数组大小,如:int a[n],n=5;


一维数组占用字节数:数组长度 × sizeof(类型)

二维数组占用字节:第一维长度 ×第二维长度 × sizeof(类型)

二维数组初始化,第一维长度声明可以省略,但第二维不能省

short m[][4]={1,2,3,4,5,6,7,8};        等价于

short m[2][4]={1,2,3,4,5,6,7,8};

short m[][4]={{1,2,3},{4,5},{6}};        等价于

short m[3][4]={{1,2,3,0},{4,5,0,0},{6,0,0,0}}

short m[][4]={1,2,3,4,5,6,7,8,9};

1        2        3        4

5        6        7        8

9        0        0        0 


例:

//键盘上输入某年某月,输出该月的天数
#include<stdio.h>
#define M 12
int main(){
	int days[2][M]={{31,28,31,30,31,30,31,31,30,31,30,31},
                     {31,29,31,30,31,30,31,31,30,31,30,31}};
    int year,month;
    do{
    	printf("input year,month:");
    	scanf("%d%d",&year,&month);
	}while(month<1||month>12);//处理不合法元素
	if(((year%4==0)&&(year%100!=0))||(year%400==0)) //闰年 
	printf("the num of days is %d\n",days[1][month-1]);
	else
	printf("the num of days is %d\n",days[0][month-1]);
	return 0; 
}  

2、向函数传递数组

        若要把一个数组传递给一个函数,那么只要使用不带方括号的数组名作为函数的实参调用函数即可。数组名代表数组第一个元素的地址,实际上是将数组首地址传递给被调函数。因此当被调函数修改形参时,实参也跟着修改!

注意:数组作为函数形参时,数组的长度不可以出现在数组名后面的方括号内,通常用另一个整型的形参指定数组的长度

例:输入学生成绩,并返回最大值

#include<stdio.h>
#define N 40
int ReadScore(int score[]);
int FindMax(int score[],int n);
int main(void){
	int score[N],max,n;
	n=ReadScore(score);
	printf("总共人数:%d",n);
	max=FindMax(score,n);
	printf("最高分为:%d",max);
	return 0;
}
int ReadScore(int score[])
{
	int i=-1;
	do{
		i++;
		printf("输入成绩:");
		scanf("%d",&score[i]);
	}while(score[i]>=0);
	return i;
}
int FindMax(int score[],int n)
{
	int max,i;
	max=score[0];
	for(i=1;i<n;i++){
		if(score[i]>max)
		max=score[i];
	}
	return max;
}

3、排序

交换排序

#include<stdio.h>
#define N 40
int ReadScore(int score[]);
void DataSort(int score[],int n); //排序 
int FindMax(int score[],int n);
void PrintScore(int score[],int n); //打印 
int main(void){
	int score[N],max,n;
	n=ReadScore(score);
	printf("总共人数:%d\n",n);
	DataSort(score,n);
	printf("sorted scores:");
	PrintScore(score,n);
	return 0;
}
int ReadScore(int score[])
{
	int i=-1;
	do{
		i++;
		printf("输入成绩:");
		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("%4d",score[i]);
	}
	printf("\n");
}

输入成绩:99
输入成绩:100
输入成绩:44
输入成绩:87
输入成绩:111
输入成绩:89
输入成绩:-1
总共人数:6
sorted scores: 111 100  99  89  87  44


选择法排序

#include<stdio.h>
#define N 40
int ReadScore(int score[]);
void DataSort(int score[],int n); //排序 
int FindMax(int score[],int n);
void PrintScore(int score[],int n); //打印 
int main(void){
	int score[N],max,n;
	n=ReadScore(score);
	printf("总共人数:%d\n",n);
	DataSort(score,n);
	printf("sorted scores:");
	PrintScore(score,n);
	return 0;
}
int ReadScore(int score[])
{
	int i=-1;
	do{
		i++;
		printf("输入成绩:");
		scanf("%d",&score[i]);
	}while(score[i]>=0);
	return i;
}
void DataSort(int score[],int n){
	int i,j,temp,k;
	for(i=0;i<=n-1;i++){
		k=i;
		for(j=i+1;j<n;j++){
			if(score[j]>score[i]){
				k=j;
			}
		}
		if(k!=i){
			temp=score[k];
			score[k]=score[i];
			score[i]=temp;
		}
	}
}
void PrintScore(int score[],int n)
{
	int i;
	for (i=0;i<n;i++){
		printf("%4d",score[i]);
	}
	printf("\n");
}

4、查找

线性查找(顺序查找)

#include<stdio.h>
#define N 40
int Readscore(int score[],long num[]);
int Linsearch(long num[],long x,int n);
int main(void)
{
	int score[N],n,pos;
	long num[N],x;
	n=Readscore(score,num);
	printf("total students are %d\n",n);
	printf("input the searching ID:");
	scanf("%ld",&x);
	pos=Linsearch(num,x,n);
	if(pos!=-1)
	printf("score=%d\n",score[pos]);
	else
	printf("not found!\n");
	return 0;
}
int Readscore(int score[],long num[])
{
	int i=-1;
	do{
		i++;
		printf("input id and score:");
		scanf("%ld%d",&num[i],&score[i]);
	}while(num[i]>0&&score[i]>=0);
	return i;
}
int Linsearch(long num[],long x,int n)
{
	int i;
	for(i=0;i<n;i++)
	{
		if(num[i]==x)
		return i;
	}
	return -1;
}

input id and score:123 88
input id and score:124 99
input id and score:125 100
input id and score:-1 -1
total students are 3
input the searching ID:123
score=88

折半查找参考教材 p213 ~ p215


5、向函数传递二维数组

#include<stdio.h>
#define N 40
#define Q 3
void Readscore(int score[][Q],long num[],int n);
void Averforstud(int score[][Q],int sumS[],float averS[],int n);
void Averforcourse(int score[][Q],int sumC[],float averC[],int n);
void Print(int score[][Q],long num[],int sumS[],float averS[],int sumC[],float averC[],int n);
int main()
{
	int score[N][Q],sumS[N],sumC[Q],n;
	long num[N];
	float averS[N],averC[Q];
	printf("input total number of students:");
	scanf("%d",&n);
	Readscore(score,num,n);
	Averforstud(score,sumS,averS,n);
	Averforcourse(score,sumC,averC,n);
	Print(score,num,sumS,averS,sumC,averC,n);
	return 0;
}
void Readscore(int score[][Q],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<Q;j++)
		scanf("%d",&score[i][j]);
	}
}
void Averforstud(int score[][Q],int sumS[],float averS[],int n)
{
	int i,j;
	for(i=0;i<n;i++)
	{
		sumS[i]=0;
		for(j=0;j<Q;j++)
		sumS[i]=sumS[i]+score[i][j];
		averS[i]=(float)sumS[i]/Q;
	}
}
void Averforcourse(int score[][Q],int sumC[],float averC[],int n)
{
	int i,j;
	for(j=0;j<Q;j++)
	{
		sumC[j]=0;
		for(i=0;i<n;i++)
		sumC[j]=sumC[j]+score[i][j];
		averC[j]=(float)sumC[j]/n;
	}
}
void Print(int score[][Q],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\n");
	for(i=0;i<n;i++)
	{
		printf("%12d\t",num[i]);
		for(j=0;j<Q;j++)
		printf("%4d\t",score[i][j]);
		printf("%4d\t%5.1f\n",sumS[i],averS[i]);
	}
	printf("sumforcourse\t");
	for(j=0;j<Q;j++)
	printf("%4d\t",sumC[j]);
	printf("\nAverforcourse\t");
	for(j=0;j<Q;j++)
	printf("%4.1f\t",averC[j]);
	printf("\n");
}

input total number of students:4
input student's id and score as:MT  EN  PH
123 11 12 13
124 23 22 21
125 33 34 34
126 55 33 12
student's id     mt      en      ph      sum     aver
         123      11      12      13      36     12.0
         124      23      22      21      66     22.0
         125      33      34      34     101     33.7
         126      55      33      12     100     33.3
sumforcourse     122     101      80
Averforcourse   30.5    25.3    20.0
 

                                                                                                                      

--------------------------------------------------------------下一段  指针

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值