数组+排序+指针+函数+函数指针

这篇博客介绍了数组的基本概念,包括一维和二维数组的定义、初始化和访问,以及字符型数组的操作。详细讲解了一维数组的冒泡排序、选择排序和插入排序算法,并提供了相关练习。此外,还讨论了指针的使用,以及函数和函数指针在数组操作中的应用。
摘要由CSDN通过智能技术生成

day7

数组:

相同类型n个元素的有限集合

1.一维数组

1.一维整形数组
1.定义:
存储类型 数据类型 数组名[元素个数];

		存储类型:
			auto:(默认)
				自动型变量
			register:
				寄存器变量
			extern:
				声明外部变量
			static:
				静态变量
				
		数据类型:
			基本数据类型
				int double short long float char 
			构造数据类型
				struct union enum 
	
		数组名:
			1.可以由字母、数字、下划线构成,不能以数字开头
			2.不能与C语言关键字重名
			3.最好不要与库函数重名
			
		元素个数:
			1.元素个数不能省略
			2.元素个数必须为常量或常量表达式,不能是变量或变量组成的表达式

2.元素访问:

		int a[5];
		
		数组名[表达式]
		
		表达式:
			1.可以是常量
			2.可以是常量表达式
			3.可以是变量
			4.可以是变量表达式
			
		int n = 3;
		a[n+1]
		a[0+0]
		a[1]
		a[2]
		a[3]
		a[4]

3.一维数组的初始化:

		初始化 != 赋值
		1.全部初始化:
			int a[5] = {1, 2, 3, 4, 5};
		
		2.部分初始化:
			int a[5] = {1, 2, 3};
		
		3.默认初始化:
			int a[] = {1, 2, 3, 4, 5};

	    4.数组存储:
		连续:数组空间连续
		有序:数组元素在空间中存储有序
		
		5.数组元素个数:
			sizeof(a) / sizeof(a[0])
		
		注意:
			1.数组定义时,元素个数必须为常量
			2.避免数组的越界访问
			3.数组只能对每个元素单独操作,不能对数组整体操作

练习:
1.从终端输入5个数,放入整形数组中,计算这5个数的 平均值并完成打印
自定义输入

#include <stdio.h>

int main(int argc, const char *argv[])
{
   
//	int a[5] = {3, 1, 2, 5, 4};
//	int a[5] = {1, 2, 3};
	int a[] = {
   1, 2, 3, 4, 5, 6, 7, 8};
	int i = 0;

#if 0
	for (i = 0; i < 5; i++)
	{
   
		a[i] = i+1;
	}
#endif

	for (i = 0; i < 5; i++)
	{
   
		printf("a[%d] = %d\n", i, a[i]);
	}

	printf("sizeof a is %d\n", sizeof(a));
	printf("len of a is %d\n", sizeof(a) / sizeof(a[0]));

	return 0;
}	

从键盘输入

#include <stdio.h>

int main(int argc, const char *argv[])
{
   
	int a[5] = {
   0};
	int i = 0;
	int Num = 0;
	int Sum = 0;
	int Len = 0;

	Len = sizeof(a) / sizeof(a[0]);
	for (i = 0; i < Len; i++)
	{
   
		scanf("%d", &a[i]);
	}

	for (i = 0; i < Len; i++)
	{
   
		Sum += a[i];
	}
	
	printf("平均值:%.2lf\n", (double)Sum / (double)Len);

	return 0;
}

5.整形数组排序:

1.冒泡排序

			时间复杂度:
				O(n^2)
			稳定排序算法
#include <stdio.h>

int main(int argc, const char *argv[])
{
   
	int a[5] = {
   0};
	int i = 0;
	int j = 0;
	int Tmp = 0;
	int Len = sizeof(a) / sizeof(a[0]);

	for (i = 0; i < Len; i++)
	{
   
		scanf("%d", &a[i]);
	}
		
	for (j = 0; j < Len-1; j++)
	{
   
		for (i = 0; i < Len-1-j; i++)
		{
   
			if (a[i] > a[i+1])
			{
   
				Tmp = a[i];
				a[i] = a[i+1];
				a[i+1] = Tmp;
			}
		}
	}

	for (i = 0; i < Len; i++)
	{
   
		printf("%d ", a[i]);
	}
	printf("\n");

	return 0;
}

2.选择排序

			时间复杂度:
				O(n^2)
			不稳定排序算法
#include <stdio.h>

int main(int argc, const char *argv[])
{
   
	int a[5] = {
   0};
	int i = 0;
	int j = 0;
	int Min = 0;
	int Tmp = 0;
	int Len = sizeof(a) / sizeof(a[0]);

	for (i = 0; i < Len; i++)
	{
   
		scanf("%d", &a[i]);
	}

	for (j = 0; j < Len-1; j++)
	{
   
		Min = j;
		for (i = j+1; i < Len; i++)
		{
   
			if (a[i] < a[Min])
			{
   
				Min = i;
			}
		}
		if (Min != j)
		{
   
			Tmp = a[Min];
			a[Min] = a[j];
			a[j] = Tmp;
		}
	}

	for (i = 0; i < Len; i++)
	{
   
		printf("%d ", a[i]);
	}
	printf("\n");

	return 0;
}

3.插入排序

			时间复杂度:
				O(n^2)
			稳定排序算法
#include <stdio.h>

int main(int argc, const char *argv[])
{
   
	int a[5] = {
   0};
	int i = 0;
	int j = 0;
	int Tmp = 0;
	int Len = sizeof(a) / sizeof(a[0]);

	for (i = 0; i < Len; i++)
	{
   
		scanf("%d", &a[i]);
	}
	
	for (j = 1; j < Len; j++)
	{
   
		Tmp = a[j];
	 	for (i = j; i > 0 && Tmp < a[i-1]; i--)
		{
   
			a[i] = a[i-1];
		}
		a[i] = Tmp;
	}

	for (i = 0; i < Len; i++)
	{
   
		printf("%d ", a[i]);
	}
	printf("\n");

	return 0;
}

2.一维字符型数组
字符串的存储
1.定义:
char 数组名[元素个数];

	2.数组的初始化:
		初始化 != 赋值
		1.全部初始化:
			char Str[6] = {"hello"};
			char Str[6] = {'h', 'e', 'l', 'l', 'o', '\0'};
			char Str[6] = "hello";
			
		2.局部初始化:
			char Str[6] = {'h', 'e', 'l'};
			char Str[6] = {"hel"};
			char Str[6] = "hel";
			
			char Str[6] = {0};
		3.默认初始化:
			char Str[] = {'h', 'e', 'l', 'l', 'o', '\0'};
			char Str[] = {"hello"};
			char Str[] = "hello";
			
		初始化 != 赋值
		char Str[6] = {0};
#include <stdio.h>

int main(int argc, const char *argv[])
{
   
	char Str[32] = {
   "hello world"};

	printf("%s\n", Str);
	puts(Str);

	return 0;
}	

2.字符数组的输入和输出:
printf("%s\n", Str);
puts(Str);
gets
scanf("%s", Str);

#include <stdio.h>

int main(int argc, const char *argv[])
{
   
	char Str[32] = {
   0};

//	scanf("%s", Str);
	gets(Str);

	puts(Str);

	return 0;
}

作业:
1.从终端获得5个数,将这5个数完成倒置后输出
1 2 3 4 5
5 4 3 2 1

#include <stdio.h>

int main(int argc, const char *argv[])
{
   
	int i = 0;
	int a[5] = {
   0};
	int tmp;

	for(i = 0; i < 5; i++)
		{
   
			scanf("%d",&a[i]);
		}

	for(i = 0; i < 2; i++)
		{
   
			tmp = a[i];
			a[i] = a[4-i];
			a[4-i] = tmp;
		}
	for(i = 0; i < 5; i++)
		{
   
			printf("%d ",a[i]);
		}
	return 0;
}

2.从终端获得一个n,并对数组完成如下操作:
1 2 3 4 5 6 7 8 9
n:3
7 8 9 1 2 3 4 5 6
n:2
8 9 1 2 3 4 5 6 7

#include <stdio.h>

int main(int argc, const char *argv[])
{
   
	int n = 0;
	int tmp = 0;
	int i = 0, j = 0;
	int a[] = {
   1,2,3,4,5,6,7,8,9};
	int len = sizeof(a) / sizeof(a[0]);
	
	scanf("%d",&n);

	for (i = 0; i < n; i++)
	{
   
		tmp = a[len-1];
		for (j = len-1; j > 0; j--)
		{
   
			a[j] = a[j-1];
		}
		a[0] = tmp;
	}
	
	for (i = 0; i < len; i++)
	{
   
		printf("%d ",a[i]);
	}

	printf("\n");

	return 0;
}	

3.将两个5个数组a,b合并成一个有序排列的数组
int a[5] = {1, 3, 4, 5, 7};
int b[5] = {2, 4, 8, 8, 9};

#include <stdio.h>

int main(int argc, const char *argv[])
{
   
	int i = 0;
	int j = 0;
	int tmp = 0;
	int a[5] = {
   1,3,5,7,9};
	int b[5] = {
   2,4,6,8,10};
	int c[10] = {
   0};
	int k = 0;

	for(i = 0; a[i] != '\0'; i++)
	{
   
		c[i] = a[i];
	}
	for(j = 0; b[j] != '\0'; j++)
	{
   
		c[i+j] = b[j];
	}
	c[i+j] = '\0';


	for(i = 0; i < 10 - 1;i++ )
	{
   
		for(j = 0; j < 10 - 1 - i; j++)
		{
   
			if(c[j] > c[j+1])
			{
   
				tmp = c[j];
				c[j] = c[j+1];
				c[j+1] = tmp;
			}
		}
	}
	for(i = 0; i < 10; i++)
	{
   
		printf("%d ",c[i]);
	}

		return 0;
}	

思考题:
1. 编写程序,求a+aa+aaa+…+aa…a,其中a是一个数字。
例如:3+33+333+3333+33333(此时n为5)。
要求a和n从键盘输入,输出格式为
3+33+333+3333+33333=37035

	   0*10 + 3
	   3*10 + 3
	   33*10 + 3
	   333*10 + 3
#include <stdio.h>

int main(int argc, const char *argv[])
{
   
	int a,i,n,s=0,k=0;
	scanf("%d%d",&a,&n);
	for(i = 0;i < n;i++)
	{
   
		k =k*10+a;
		s+=k;
	}

	printf("%d\n",s);
	return 0;
}

day8

字符型数组:

1.定义:
char 数组名[元素个数];

2.初始化:
1.默认初始化
2.局部初始化
3.全部初始化

3.字符型数组输入输出:
gets
scanf
puts
printf

#include <stdio.h>

int main(int argc, const char *argv[])
{
   
	char Str[32] = {
   0};

	gets(Str);
	
	Str[5] = '\0';
	
	printf("Str = %s\n", Str);

	return 0;
}

4.字符串的赋值
必须使用strcpy完成

strcpy: 字符串的拷贝

strcpy(dst, src);
必须目的空间能够存放下源字符串

#include <stdio.h>
#include <string.h>

int main(int argc, const char *argv[])
{
   
	char Str1[32] = {
   0};
	char Str2[32] = {
   0};
	/*
	Str = "hello world";		//错
	Str[32] = "hello world";	//错
	*/
	strcpy(Str1, "hello world");
	strcpy(Str2, Str1);

	printf("Str1 = %s\n", Str1);
	printf("Str2 = %s\n", Str2);

	return 0;
}

5.字符串的拼接:
strcat: 字符串的拼接
strcat(Str1, Str2);

#include <stdio.h>
#include <string.h>

int main(int argc, const char *argv[])
{
   
	char Str1[32] = {
   "hello"};
	char Str2[32] = {
   "world"};

	strcat(Str1, Str2);
	
	printf("Str1 = %s\n", Str1);
	printf("Str2 = %s\n", Str2);

	return 0;
}	

必须能够存放下拼接后的字符串,否则会内存越界

6.字符串的比较:
strcmp: 字符串比较
返回值:
0 两个字符串相等
> 0 第一个字符串 > 第二个字符串
< 0 第一个字符串 < 第二个字符串
strcmp(Str1, Str2);

#include <stdio.h>
#include <string.h>

int main(int argc, const char *argv[])
{
   
	char Str1[32] = {
   0};
	char Str2[32] = {
   0};
	int Ret = 0;

	printf("请输入两个字符串:\n");
	gets(Str1);
	gets(Str2);

	Ret = strcmp(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值