• 数组


    这个作业属于哪个班级 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";//字符串直接赋值,注意后面有
    

    数组输入输出

    #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()) != '
    ')
    	{
    		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注意事项

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

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

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

    	for (i = 1;s[i]&& s[i] != '
    '; 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]+
    
    else if s[i]是0~9,或者.
    	if s[i+1]!=0~9||.//后面不是数字
    		printf s[i]
    
    	else//后面是数字
    		printf s[i]
    else if s[i]==-
    	if s[i-1]==0~9//证明-是运算符,输出后回车
    		printf s[i]
    
    	else//是负号
    		printf s[i]
    else//是数字
    	if s[i+1]==0~9||.//后面还有数字
    		printf s[i]
    	else
    		printf s[i]
    
    

    2.3.2代码截图

    2.3.3与超星视频对比

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

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

  • 相关阅读:
    Spring攻略学习笔记(3.00)AOP核心概念和术语
    zoj 3494
    第43周星期五
    findBugs学习小结
    第42周星期日
    Cookie知识小结
    第42周星期三
    第42周星期六
    第43周星期四小结
    第43周星期二
  • 原文地址:https://www.cnblogs.com/ww-yy/p/14067514.html
Copyright © 2020-2023  润新知