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

    0.展示PTA总分

    一维数组

    二维数组

    字符数组

    1.本章学习总结

    •数组中如何查找数据,有哪些做法

    顺序查找

    重头到尾遍历数组,直到找到需要的数据。
    优点:操作简单。
    缺点:效率低,当数组很大时十分耗时。

    二分法查找

    每次查找都可以缩短一半的查找范围,效率高。
    缺点:只适用于有序排列的数组。

    •数组中如何插入数据,怎么做,可以写个伪代码或动态图展示方法

    首先找到该数要插入的位置,再将这个位置后的所有数的位置向后移一位,最后将这个数插入。

    •数组中如何删除数据,这个有多种做法,请一一展示。

    1.覆盖

    找到要删除的数据的位置,从它开始,将后面的数据向前覆盖,实现数组数据的删除。

    2.新数组存放

    定义一个新数组,将不删除的数据放入新数组。

    •数组中目前学到排序方法,主要思路?

    1.选择排序法

    思路:将数组中每个元素与第一个元素比较,如果这个元素小于第一个元素, 则交换这两个元素。循环查找,每次找出最小元素,放于第 1 个位置,经过 n-1 轮比较完成排序

    2.冒泡排序

    思路:比较相邻的元素,将小(大)的放到前面。

    •数组做枚举用法,有哪些案例?

    不懂。

    •哈希数组用法,目前学过哪些案例,举例展示。

    7-5 有重复的数据I (10 分)

    #include<stdio.h>
    #define N 100001
    int check(int n);
    int main()
    {
    	int a[N];
    	int n;
    	int m;
    	int i;
    	int flag = 0;
    
    	scanf("%d", &n);
    	if (check(n) == 1)
    	{
    		printf("YES");
    	}
    	else
    	{
    		printf("NO");
    	}
    		return 0;
    }
    
    int check(int n)
    {
    	int static hash[100001];
    	int i;
    	int x;
    	for (i = 1; i <= n; i++)
    	{
    		scanf("%d", &x);
    		if (hash[x] == 1)
    		{
    			return 1;
    		}
    		else
    		{
    			hash[x]=1;
    		}
    	}
    	return 0;
    }
    

    7-11 求整数序列中出现次数最多的数 (15 分)

    #include <stdio.h>
    int main()
    {
    	int n, a[1000], b[1000] = { 0 };
    	int i, j, max = 0, k;
    	scanf("%d", &n);
    	for (i = 0; i < n; i++)
    		scanf("%d", &a[i]);
    	for (i = 0; i < n; i++)
    		for (j = 0; j < n; j++) {
    			if (a[i] == a[j])
    				b[i] = b[i] + 1;
    		}
    	for (i = 0; i < n; i++) {
    		if (max < b[i]) {
    			max = b[i];
    			k = i;
    		}
    	}
    	printf("%d %d
    ", a[k], max);
    	return 0;
    }
    

    1.2 本章学习体会

    对于一维数组和二维数组的学习有些明白,但是对于字符数组实在是懵。还有对于一些题目,虽然做出来了,但是代码非常多,应该能找到更简洁的方法去写。

    代码量:483行

    2.PTA实验作业

    2.1 7-4 删除重复字符

    2.1.1 伪代码

    #include<stdio.h>
    #define N 201
    int main()
    {
    	char s[N];
    	static char h[N];
    	int i=0;
    	int k;
    	//输入字符串
    	for (i = 0; s[i] != ''; i++)
    	{
    		k = (int)s[i];//强制类型转换
    		h[k] = s[i];//将字符储存在对应ASCII码值得数组内
    	}
    	输出字符串
    	return 0;
    }
    

    2.1.2 代码截图

    #include<stdio.h>
    #define N 201
    int main()
    {
    	char s[N];
    	static char h[N];
    	int i=0;
    	int k;
    	while ((s[i] = getchar()) != '
    ')
    	{
    		i++;
    	}
    	s[i] = '';
    
    	for (i = 0; s[i] != ''; i++)
    	{
    		k = (int)s[i];
    		h[k] = s[i];
    	}
    	for (i = 0; i < 200; i++)
    	{
    		if (h[i] != 0)
    		{
    			printf("%c", h[i]);
    		}
    	}
    	return 0;
    }
    

    2.1.3 造测试数据

    输入数据 输出数据 说明
    全空格 一个空格 全空格
    ==--ccbbaa;;'' '-;=abc 有其他字符

    2.1.4 PTA提交列表及说明

    部分正确:只考虑了字母和数字的情况,没有考虑其他字符的输入与重复。也没有考虑全空格的情况。

    2.2 7-7 jmu-c-大数加法

    2.2.1 数据处理

    char a[N];//大数a
    char b[N];//大数b
    int n=1,m=1,i,j,k;//循环变量
    int x, y;
    int z;
    a[0] = '0';//考虑进位
    b[0] = '0';;//考虑进位
    

    2.2.2 代码截图

    #include<stdio.h>
    #include<string.h>
    #define M 1002
    #define N 1003
    int main()
    {
    	char a[N];
    	int n=1,m=1,i,j,k;
    	int x, y;
    	int z;
    	char b[N];
    	a[0] = '0';
    	b[0] = '0';
    	while ((a[n] = getchar()) != '
    ')
    	{
    		n++;
    	}
    	a[n] = '';
    	while ((b[m] = getchar()) != '
    ')
    	{
    		m++;
    	}
    	b[m] = '';
    	j = n-1;
    	i = m - 1;
    	if (n>=m)
    	{
    		for (i; i >= 0; i--)
    		{
    			x = a[j] - '0';
    			y = b[i] - '0';
    			if (x + y > 9)
    			{
    				a[j] = (x + y - 10) + '0';
    				for (k = j;; k--)
    				{
    					a[k - 1] = a[k - 1] + 1;
    					if (a[k - 1] - '9' > 0)
    					{
    						a[k - 1] = '0';
    						continue;
    					}
    					else break;
    				}
    			}
    			else a[j] = (x + y) + '0';
    			j--;
    		}
    		if (a[0] != '0')
    		{
    			printf("%s", a);
    		}
    		else
    		{
    			for (i = 1; i < n; i++)
    			{
    				printf("%c", a[i]);
    			}
    		}
    	}
    	else
    	{
    		for (j; j >= 0; j--)
    		{
    			x = a[j] - '0';
    			y = b[i] - '0';
    			if (x + y > 9)
    			{
    				b[i] = (x + y - 10) + '0';
    				for (k = i;; k--)
    				{
    					b[k - 1] = b[k - 1] + 1;
    					if (b[k - 1] - '9' > 0)
    					{
    						b[k - 1] = '0';
    						continue;
    					}
    					else break;
    				}
    			}
    			else b[i] = (x + y) + '0';
    			i--;
    		}
    		if (b[0] != '0')
    		{
    			printf("%s", b);
    		}
    		else
    		{
    			for (i = 1; i < m; i++)
    			{
    				printf("%c", b[i]);
    			}
    		}
    	}
    	
    	return 0;
    }
    

    2.2.3 造测试数据

    输入数据 输出数据 说明
    99、1 100 检验是否进位
    1、99 100 a的位数小于b

    2.2.4 PTA提交列表及说明

    答案错误:没有考虑a的位数比b来得少。

    2.3 7-5 有重复的数据I

    2.3.1 数据处理

    int static hash[100001];//定义一个哈希数组来表示数据是否出现过
    

    2.3.2 代码截图

    #include<stdio.h>
    #define N 100001
    int check(int n);
    int main()
    {
    	int a[N];
    	int n;
    	int m;
    	int i;
    	int flag = 0;
    
    	scanf("%d", &n);
    	if (check(n) == 0)
    	{
    		printf("YES");
    	}
    	else
    	{
    		printf("NO");
    	}
    		return 0;
    }
    
    int check(int n)
    {
    	int static hash[100001];
    	int i;
    	int x;
    	for (i = 1; i <= n; i++)
    	{
    		scanf("%d", &x);
    		if (hash[x] == 1)
    		{
    			return 1;
    		}
    		else
    		{
    			hash[x]=1;
    		}
    	}
    	return 0;
    }
    

    2.3.3 造测试数据

    输入数据 输出数据 说明
    1 2 3 4 5 1 YES 最后一个有重复

    2.3.4 PTA提交列表及说明

    部分正确:使用逐一查找的方法来判断是否有重复数据,浪费了时间,还导致了段错误。改用以空间换时间的方法来重写代码。

    3.阅读代码

    7-7 螺旋方阵

    #include<stdio.h>
    int main(void)
    {
    	int n;
    	int a[10][10];
    	scanf("%d", &n);
    	int x = 0, y = 0;//坐标,爱的螺旋转圈圈
    	int k = 1;//循环数1~n*n
    	int bound0 = n - 1, bound1 = n - 1, bound2 = 0, bound3 = 1;//右下左上个方向的墙壁会向中间缩拢
    	int direction = 0;//0向右,1向下,2向左,3向上
    	while (k <= n * n)
    	{
    		if (direction == 0)
    		{
    			a[x][y++] = k++;
    			if (y == bound0)
    			{
    				//向右走,遇到墙壁就向下
    				direction = 1;
    				bound0--;
    			}
    		}
    		else if (direction == 1)
    		{
    			a[x++][y] = k++;
    			if (x == bound1)
    			{
    				//向下走,遇到墙壁就向左 
    				direction = 2;
    				bound1--;
    			}
    		}
    		else if (direction == 2)
    		{
    			a[x][y--] = k++;
    			if (y == bound2)
    			{
    				//向左走,遇到墙壁就向上
    				direction = 3;
    				bound2++;
    			}
    		}
    		else if (direction == 3)
    		{
    			a[x--][y] = k++;
    			if (x == bound3)
    			{
    				//向上走,遇到墙壁就向右
    				direction = 0;
    				bound3++;
    			}
    		}
    	}
    	for (int i = 0; i < n; i++)
    	{
    		for (int j = 0; j < n; j++)
    		{
    			printf(" %2d", a[i][j]);
    		}
    		printf("
    ");
    	}
    }
    

    功能:打印n阶螺旋方阵

    这个螺旋方针题目的解法令我眼前一亮,它用生动形象的注释,将一个复杂的问题形象化、简单化,我想,自己写代码是否也能像这样子灵动。同时它也让我知道了代码并不一定是枯燥的
    ,它只要加上一点注释,就可以变得很优美。

  • 相关阅读:
    架构 框架 设计模式 --备用
    机器视觉项目开发之---织物疵点检测机器视觉系统 软件测试平台
    多媒体开发之--- live555 vs2010/vs2013下编译,使用,测试
    多媒体开发之--- h264 图像、帧、片、NALU
    多媒体开发之---H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流
    多媒体开发之---h264格式slice_header
    图像处理之基础---傅立叶c实现
    图像处理之基础---小波提取特征
    图像处理之基础---图像的特征简介
    嵌入式开发之工具---log file
  • 原文地址:https://www.cnblogs.com/chenlr/p/11876927.html
Copyright © 2011-2022 走看看