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\n", 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]!='\0';
	{
		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("\n");
		}
		if (a[i] == '*' || a[i] == '/' || a[i] == '(' || a[i] == ')'||a[i]=='=')
		{
			printf("%c\n", 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("\n");
			}
			else
			{
				printf("%c\n", 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.阅读代码

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

posted @ 2019-11-17 22:22  临海文卫  阅读(205)  评论(1编辑  收藏  举报