zoukankan      html  css  js  c++  java
  • C语言博客作业--数组

    0.展示PTA总分

    1.本章学习总结

    1.1 学习内容总结

    • 顺序查找法:从数组的第一个内容开始查找,直到找到要找值。
      优点:写法简单易懂。
      缺点:查找次数过多,面对大数据花费时间过长。
    • 二分查找法:将数组排序后,从数组中间的数开始查找,当查找的数比中间的数大或者小的时候,取该数应处于的范围,再次取该范围中间的内容进行比较,直到找到正确的值。
    • 数组的插入:先查找要插入的位置,后将该位置之后的元素全向后移动一位之后再将元素替换到该位置
    #include<stdio.h>
    int main()
    {
    	输入要插入的数date;
    	输入要插入的数的位置i;
    	for j = n to j = i + 1;
    	a[j] = a[j - 1];             //将要插入数的位置之后的项的值赋予后面一项//
    	a[i] = date;
    	
    }
    
    • 数组的删除
    #include<stdio.h>
    int main()
    {
    	输入要删除的数据date;
            for i = 0 to i < n;
    	for j = n to j >= i + 1;
    	查找要插入的数的位置i;
            for j = i to j <n-1;
    	a[j] = a[j + 1];             //将要插入数的位置之后的项的值赋予前面一项,使该位置的的值被之后一位位置的值覆盖/
    	
    }
    
    • 数组的排序方法:
      1:选择排序法:依次查找最大的值位置,将他与被查找数组内容的第一个项给位置替换;
    #include<stdio.h>
    int main()
    {
    
    	输入要排序的数组a[n];
    	for i = 0 to i < n;
    	{
    		for j = i to j < n;
    		{
    			int h = 0;
    			if (a[h] > a[j])
    				a[h] = a[j]    //查找i位置之后的最小项//
    		}
    		temp = a[i];
    		a[i] = a[h];
    		a[h] = temp;          //替换最小项与i位置//
    	}
    }
    

    2:冒泡排序法:多次查看数组,当出现前一个项比后一个项大时将该两项替换,是每次循环都能是最大的一个数移动到最末端,直到全部排序。

    #include<stdio.h>
    int main()
    {
    
    	输入要排序的数组a[n];
    	for i = 0 to i < n-1;
    	{
    		for j = 0 to j < n-i-1;
    		{
    			if(a[j]>a[j+1])
    			temp = a[j];
    			a[j] = a[j+1];        
    			a[j+!] = temp;         //当出现前一项比后一项大时,替换两项位置//
    		}      
    	}
    }
    
    • 数据枚举用法
      调查电视节目受欢迎程度
    #include<stdio.h>
    #define N 9
    int main()
    {
    	int n;
    	int a[N];
    	int i, j;
    	for (i = 0; i < N; i++)
    	{
    		a[i] = 0;
    	}
    	scanf("%d", &n);
    	for (i = 1; i <= n; i++)
    	{
    		scanf("%d", &j);
    		if (j<9)
    		{
    			a[j]++;
    		}
    	}
    	for (i = 1; i < N; i++)
    	{
    		printf("%4d%4d
    ", i, a[i]);
    	}
    }
    
    • 哈希数组用法
      有重复的数据I
    #include<stdio.h>
    #define N 100001
    int check(int n);
    int main()
    {
        int n;
        scanf("%d", &n);
        if (check(n) == 1)
        {
            printf("YES");
        }
        else
        {
            printf("NO");
        }
            return 0;
    }
    
    int check(int n)
    {
        int static num[100001];
        int i;
        int x;
        for (i = 1; i <= n; i++)
        {
            scanf("%d", &x);
            if (num[x] == 1)
            {
                return 1;
            }
            else
            {
                num[x]=1;
            }
        }
        return 0;
    }
    

    1.2 本章学习体会

    • 数组多用在储存大数据,当面对多个数据需要保存是不需要写多个变量一一保存,节省代码量,且对数据进行排序,删除等操作也十分简便。
    • 两周代码量:2500

    2.PTA实验作业

    2.1 7-5 有重复的数据I

    2.1.1 伪代码

    #include<stdio.h>
    #define N 100001
    int check(int n);          
    int main()
    {
            输入要输入的数字个数n;
    	if (check(n) == 1)      //判段输入的数是否有重复数据//
    	{
    		printf("YES");
    	}
    	else
    	{
    		printf("NO");
    	}
    	return 0;
    }
    
    int check(int n)
    {
    	int static num[100001];
    	int i;
    	for i=0 to i<=n
    	{
    		输入数字x;
    		if (num[x] == 1) //如果该数字作为下标对应的数组的值为1,则该数字以存在过//
    		{
    			return 1;
    		}
    		else
    		{
    			num[x] = 1;   //如果该数字还未出现过,则将该数字作为下标对应的数组的值赋值为1,表示该数字存在过//
    		}
    	}
    	return 0;
    }
    

    2.1.2 代码截图

    2.1.3 造测试数据

    输入数字个数 输入数字 结果
    5 1 2 3 1 4 YES
    10 10 1 7 5 6 -3 9 7 6 1 13 YES
    5 1 3 5 7 9 NO

    2.1.4 PTA提交列表及说明

    原来是用两层单循环进行数据查重,由于数组的长度设定太小,调整之后分数增加一些,但最后两个测试点依旧是错的。
    最后就仿照超星平台的做法改了代码。

    2.2切分表达式——写个tokenizer吧

    2.2.1 伪代码

    #include<stdio.h>
    #include<string.h>
    #define H 80
    int main()
    {
    	输入字符串a[H]:
    	for i=0 to a[i]!='';
    	{
    		if (a[i] >= '0'&&a[i] <= '9')//当输入为数字时直接输出//
    		{
    			printf("%c", a[i]);
    			if (a[i + 1] == '.')//判断该数是否为小数//
    			{
    				i++;
    				printf("%c", a[i]);
    
    			}
    			while (a[++i] >= '0'&&a[i] <= '9')
    			{
    				printf("%c", a[i]);         //输出全部数字后换行//
    			}
    			i = i - 1;
    			printf("
    ");
    		}
    		if (a[i] == '*' || a[i] == '/' || a[i] == '(' || a[i] == ')'||a[i]=='=')
    		{
    			printf("%c
    ", a[i]);   //当遇到某些符号时直接输出并换行//
    		}
    		if (a[i] == '-' || a[i] == '+')
    		{
    			if (a[i - 1] == '(' || i == 0)
    			{
    				printf("%c", a[i]);        //判断该‘-’号或‘+’号是作为运算符号还是作为数的前标判断正负//
    				while (a[++i] >= '0'&&a[i] <= '9')
    				{
    					printf("%c", a[i]);
    					if (a[i + 1] == '.')       
    					{
    						i++;
    						printf("%c", a[i]);
    
    					}
    				}
    				i = i - 1;
    				printf("
    ");
    			}
    			else
    			{
    				printf("%c
    ", a[i]);
    			}
    		}
    	}
    }
    

    2.2.2 代码截图


    2.2.3造测试数据

    输入 输出
    32*((2-2)+5)/(-15) 32 * ( ( 2 - 2 ) + 5 ) / ( -15 )
    -0.735/2(-0.89) -0.73 * 5 / 2 * ( —-0.89 )

    2.2.4 PTA提交列表及说明


    编程错误是改的时候写错就交了
    一开始答案错误包括没计算小数,当正号是作为数字的符号的情况没判断,当负号再输入开头是没判断,以及符号作为数字符号,且数字为小数的情况,只能输出整数部分又改了几次。

    2.3螺旋方阵

    2.3.1伪代码

    #include<stdio.h>;
    #define M 10
    int main()
    {
    	int flag = 1;//判断该从哪个方向进行赋值//
    	int i=0,j=0;
    	int count ;
    	int N;
    	static int a[M][M];
    	scanf("%d", &N);
    	count = N;
    	a[0][0] = 1;
    	while (flag<=2*N-1)  //根据输入的几节方针判断循环的次数//
    	{
    		if (flag%4==1)   //以4次循环为一次重复当进行一次循环的时候,将数组列下标递增直到n,前后赋值的数都为前一个数的加1//
    		{
    			while (j<count-1)//由于循环的一开始作为头的第一个数已经被赋值则循环次数减1//
    			{
    				j++;
    				a[i][j] = a[i][j - 1] + 1;
    			}
    			flag++;
    		}
    		if (flag%4==2)//第二次循环则行下标递增,赋予的值依旧递增//
    		{
    			while (i<count-1)
    			{
    				i++;
    				a[i][j] = a[i - 1][j] + 1;
    			}
    			flag++;
    		}
    		if (flag%4==3)//当第3次循环时列下标递减,赋予的值递增,最后由于下一次循环头和尾都依旧被赋值,将递减的次数减1//
    		{
    			while (j > N-count)
    			{
    				j--;
    				a[i][j] = a[i][j + 1] + 1;
    			}
    			flag++;
    			count = count - 1;
    		}
    		if (flag%4==0)
    		{
    			while (i > N - count)
    			{
    				i--;
    				a[i][j] = a[i + 1][j] + 1;
    			}
    			flag++;
    		}
    	}
            for i =0 to i<n;
            for j=0 to j< n;
           输出数组;
    }
    

    2.3.2 代码截图



    2.3.3测试数据



    2.3.4 PTA提交列表及说明


    一开始并不会做这题目,只能根据最外圈的数字找规律,后自己写了几个不同大小的螺旋方阵判断了要拐角的次数,又发现自己写的最外圈的代码只要根据拐角次数就可以完成程序,个人认为这题还是蛮难看出代码的。

    3.阅读代码

    该程序的要求是确认该数组是否为山脉数组,该代码是查找整个数组是否存在一个项比他的下一个项的值大,如果存在,则说明这个数组的值存在一个顶点,这个顶点不一定是这个数组最大的一个数,而是他比左右两边的项的值都大,使数组不满足单调递增或单调递减的项,存在这个项这说明该数组是个山脉数组。

  • 相关阅读:
    php面试专题---16、MySQL创建高性能索引考点
    php面试专题---Mysql索引类型、介绍及优点
    php面试专题---Mysql索引原理及SQL优化
    北风设计模式课程---责任链模式 总结
    黑马lavarel教程---2、获取用户输入
    php面试专题---15、MySQL数据库基础考察点
    北风设计模式课程---外观模式、代理模式和中介者模式的区别
    legend3---1、meedu安装
    mysql中utf8和utf8mb4区别
    Struts2基于注解的Action配置
  • 原文地址:https://www.cnblogs.com/Qq15005922929/p/11878756.html
Copyright © 2011-2022 走看看