数组

这个作业属于哪个班级 C语言--网络2011/2012
这个作业的地址 C博客作业04--数组
这个作业的目标 学习数组相关内容
姓名 汪月月

0.展示PTA总分


1.本章学习总结

1.1数组基本美容

数组类型 数组名称[数组大小]
例如:int a[7];

  1. 数组大小必须是常量
  2. 数组下标从0开始(好的程序员一定从零开始),不要越界了,下标范围[0,数组长度-1]
  3. 数组大小可以用宏定义
#include<stdio.h>
#define N 10//宏定义
int main()
{
      int arr[N];//定义数组
      return 0;
}

初始化

static int a[5];//将数组初始化为0
int arr1[3]={1,2,3};
int arr2[]={1,2,3};//将数组前三个元素赋值
int arr3[3]={1,2}//将前两个赋值
int arr5[3][3]={1,2,3,4,5,6};//将二维数组赋值
int arr6[][4]={{1,2},{3,4,5},{6}};//将第1行的前两个,第二行前三个,第三行的第一个赋值
int arr7[3][]={{1,2},{3,4,5},{6}};//错误形式
char s1[3]={'a','k','b'};//分别赋值
char s2[]="abcdef";//字符串直接赋值,注意后面有\0

数组输入输出

#include<stdio.h>
int main()
{
	static int a[5];
	char s[10];
	/*数值型数组输入*/
	for (int i = 0; i < 5; i++)//数组下标从0开始,i不能等于5,会发生数组越界
	{
		scanf("%d", &a[i]);
	}
	/*字符型数组输入*/
	fgets(s, 10, stdin);

	/*数值型数组输出*/
	for (int i = 0; i < 5; i++)
	{
		printf("%d", a[i]);
	}
	/*字符型数组输出*/
	puts(s);
	return 0;
}

数组长度
len=sizeof(a)/sizeof(a[0]);
查找某个元素
就是将数组遍历,直到找到为止
枚举案例
1.查找数字
2.排序
3.找鞍点。。。。

1.2几种数组的排序插入删除移动的方法

1.2.1选择法排序

void SeletSort(int a[],int len)//排序数组,数组长度
{
	int temp;
	for (int i = 0; i < len-1; i++) {
		for(int j=i+1;j<len;j++)
			if (a[i] > a[j])
			{
				temp = a[i];
				a[i] = a[j];
				a[j] = temp;
			}
	}
}

1.2.2冒泡法排序

void BubbleSort(int a[], int len)
{
	int temp;
	for (int i = 0; i < len; i++)
	{
		for (int j = 0; j < len; j++)
		{
			if (a[j] > a[j + 1])
			{
				temp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = temp;
			}
		}
	}
}

1.2.3插入法排序

void InsertNumber(int a[],int n,int num)
{
	int i, j;
	for (i = 0; i < n; i++)
	{
		if (a[i] > num)//找到要插入的位置
		{
			break;
		}
	}
	for (j = n - 1; j >= i; j--)
		a[j + 1] = a[j];//将后面的数据后移一位
	a[i] = num;//把要插入的地方等于该数

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

1.2.4哈希数组

7-8 有重复的数据

#include<stdio.h>
int b[100000];
int a[100000];
int main()
{
	int n,flag = 0,x;
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &a[i]);
		x = a[i];
		b[x]++;//将数组a的值作为数组b的下标,并将其做标记
	}
	for (int i = 1; i < 100000; i++)//判断b数组即可知道是否有重复数据
	{
		if (b[i] > 1)//大于一证明出现了两次及以上
			flag = 1;
	}
	if (flag == 0)
		printf("NO");
	else
		printf("YES");
	return 0;
}

7-3 删除重复字符

#include<stdio.h>
char str[1000];
char hash[256];//利用Ascll表,既能将要删除的字符删去,又能排序

int main()
{
	int i = 0;
	while ((str[i] = getchar()) != '\n')
	{
		hash[str[i]] = -1;//将str数组的值作为hash数组的下标,并将其赋值
		i++;
	}
	
	for (int j = 0; j < 255; j++)//按顺序输出
	{
		if (hash[j] == -1)
			printf("%c", j);
	}
	return 0;
}

1.2.5二分查找

int BinSearch(int* a, int n, int key)//传入数组,数组长度,要查找的数据
{
	int str, end, min;//开头,末尾,中间值
	str = 0;
	end = n - 1;
	while (str <= end)
	{
		min = (str + end) / 2;
		if (key == a[min])//相等
			return min;

		else if (key > a[min])//在min右边
			str = min + 1;

		else//在min左边
			end = min - 1;
	}
	if (key != a[min])return -1;
	else return min;
}

1.2.6进制转换

int a[10000];
void Base(int base,int number)
{
	int ans;
	int k = 0;
	while (number >0)
	{
		ans = number % base;
		a[k++] = ans;
		number /= base;
	}
	for (int i = k-1; i >=0; i--)//如果按八位或则32位输出,则将k-1改为7或31
		printf("%d", a[i]);
}

1.2.7删除数据

/*标记法
对要删除的数据进行标记*/
void DeletNumber(int a[], int n, int num)//传入数组,数组长度,要删除数据
{
	int i,t;
	for (i = 0; i < n; i++)
	{
		if (a[i] == num)
		{
			t = i;//标记该数据下标
			break;
		}
	}
	for (i = 0; i < n; i++)
	{
		if (i != t)//除了该数据都输出
			printf("%d ", a[i]);
	}
}
/*移动法
将后面数字前移,将删除数字覆盖*/
void DeletNumber(int a[], int n, int num)
{
	int i, j;
	for (i = 0; i < n; i++)
	{
		if (a[i] == num)//找到数字所在位置
		{
			for (j = i; j < n; j++)
			{
				a[j] = a[j + 1];//将后面数据前移
			}
			n--;
			j--;
		}
	}
	for (i = 0; i < n; i++)
		printf("%d ", a[i]);
}

1.2.8数组左右移动

//eg.数组左移
void MoveNumber(int a[], int n, int m)//数组,数组长度,移动位数
{
		while (m >= n)//移动位数超过原来数组长度
		{
			m -= n;
		}
		for (int i = m; i < n; i++)//先将左移后的数据输出
		{
			if (i == m)printf("%d", a[i]);
			else printf(" %d", a[i]);
		}
		for (int i = 0; i < m; i++)//再输出移动前的
		{
			printf(" %d", a[i]);
		}
}

以上代码均是自己写出来的,没有交到平台测试,只是自己测试了几个,仅供参考,具体还是看题目。

1.3字符数组的相关内容

1.3.1注意事项

字符数组最后一定要有'\0';
scanf()与printf()遇到'\0'就会停止读入和输出
例如这样读入字符

	while ((str[i]=getchar())!='\n')
		i++;
	
	str[i] = '\0';

所以最好用fgets()读入字符,但最后会多一个回车
所以循环时要这样

	for (i = 1;s[i]&& s[i] != '\n'; i++)

如果直接复制的话,注意数组开大一点

字符串函数

1.strlen()

2.strcat()

3.strcpy()

4.strcmp()

2.PTA实验作业

2.17-1 将数组中的数逆序存放

2.1.1伪代码

变量定义
int n,i
int a[N];
输入数组 
a[N]
数据处理
for i=n-1 to 0//逆序输出即可
	if i==n-1//第一个输出不带空格
		then printf("%d",a[i])
	else
		then printf(" %d",a[i])
end

2.1.2代码截图

2.1.3同学互比

2.27-14 找鞍点

2.2.1伪代码

定义变量
int a[6][6];
int lineMax, colMin,flag;
输入数据
a[6][6],n
数据处理
for i = 0 to n
colMin = i
	for j = 0 to n   行最大
		if a[i][lineMax] <= a[i][j]
			then lineMax = i  找到最大
	end
	for j = 0 to n   列最小
		if a[colMin][lineMax] > a[j][lineMax]
			then colMin = j
			break  存在更小的,则该点不是鞍点
	end
	if i == colMin//结束
		then flag = 0
		break
end
if flag是0
      输出 colMin,lineMax
else
       否则  NONE

2.2.2代码截图

2.2.3与超星视频对比

1.觉得老师的思路清晰,自己一直都是有点乱,一会行和列就弄混了
2.还没有真正掌握伪代码,写的和代码差不多。。。。
3.原本有些乱,看了视频后,就清晰多了,分装函数
4.后来稍作修改

2.37-6 切分表达式

2.3.1伪代码


if s[0]==+||-//表示正数,或负数,不换行
输出s[0]
else if s[i]==(,),/,+,*//运算符,输出后回车
输出s[i]+\n
else if s[i]是0~9,或者.
	if s[i+1]!=0~9||.//后面不是数字
		printf s[i]\n
	else//后面是数字
		printf s[i]
else if s[i]==-
	if s[i-1]==0~9//证明-是运算符,输出后回车
		printf s[i]\n
	else//是负号
		printf s[i]
else//是数字
	if s[i+1]==0~9||.//后面还有数字
		printf s[i]
	else
		printf s[i]\n

2.3.2代码截图

2.3.3与超星视频对比

1.视频中用if语句并联,需要多次判断,个人比较喜欢用多分支,有时候也分情况
2.视频中情况分的很清楚,还是用了函数进行分装,而我的稍微有点乱。。。
3.代码量比我的少
4.后来稍加改正

通过对比,发现自己没有真正学会代码分装成函数,分成函数后,其实更能看得懂,以后一定多用用

posted @ 2020-12-13 18:55  w4  阅读(106)  评论(0编辑  收藏  举报