c博客作业-数组

0.



1.本章学习总结

1.1学习内容总结

1.1.1一维数组

  • 1.一般定义形式:类型名 数组名 [数组长度];类型名指定数组中每个元素的类型,数组名是数组变量的名称,是一个合法的标识符,数组长度是一个整型常量表达式,设定数组的大小;

  • 2.数组是一些具有相同类型数据的集合;数组名是一个地址常量,存放数组内存空间的首地址;数组元素的引用要指定下标,它的合理取值范围是[0,数组长度-1],下标不能越界。

  • 3.数组定义时需要初始化,静态数组不全部赋值,未赋值的元素自动为0,动态数组值随机;

1.1.2二维数组

  • 1.一般定义形式:类型名 数组名 [行长度] [列长度];音乐二维数组要指定两个下标,即行下标和列下标;

  • 2.二维数组初始化的方法有两种:a.分行赋初值;b.顺序赋初值;其中分行赋初值的方法直观清晰,不易出错,是二维数组初始化最常用的方法;
    二维数组初始化时,如果对全部元素赋了初值,或分行赋初值时,在初值表中列出了全部行,就可以省略行长度。

  • 3.一般使用二维数组编程时会需要二重循环;

1.1.3一维字符数组

  • 1.一维字符数组用于存放字符型数据,它的定义初始化和引用与其他类型的一维数组一致;

  • 2.字符串就是用一对双引号括起来的字符序列,它有一个结束标志'';
    将字符串存入字符数组时,由于它有一个结束符'',数组长度至少是字符串的有效长度+1,第一个''后的其他数组元素与该字符串无关;

  • 3.字符串输入:a.scanf:scanf("%s",str);输入参数:字符数组名,不加地址符,遇回车或空格输入结束,并自动将输入的一串字符和''送入数组中;b.fgets函数:fgets(buf,10,stdin);stdin表示标准输入流;fgets函数读取文件当中的n-1个字符到s中,从标准输入流中读取字符串,输入的字符个数超出了字符数组的大小不会导致溢出的问题;gets函数:用于从缓冲区中读取字符串,直到出现换行符或读到文件尾为止,由于gets不检查字符串string的大小,必须遇到换行符或文件结尾才会结束输入,因此容易造成缓存溢出的安全性问题,导致程序崩溃。

  • 4.字符串输出:a.循环输出;b.printf("%s",str),printf("%s","hello");c.puts(str),puts("hello");

1.1.4数组中如何查找数据

  • a.已知需要查找的数据:通过循环,历遍数组,与数组元素比较,直到找到所需要的数据
  • b.已知需要查找数据的地址,直接读取地址找出数据;
  • c.二分查找法

1.1.5数组中如何插入数据

   读取需要插入的数据x;
   if (x < a[0])
	{
		for (k = N - 1 to  0; k--)
			挪动数组a[k + 1] = a[k];
                end for
		a[0] = x;
	}
          end if

	else if (x > a[N - 1])
		a[N] = x;
       end if
	else
		for (i = 0; i < N - 1; i++)
		{
			if (a[i]<x && a[i + 1]>x)
			{
				for (k = N - 1;to i; k--)
					挪动数组a[k + 1] = a[k];
                         end for
				a[i + 1] = x;
				break;
			}
                          end if
		}
     end for

     }```

###1.1.6数组中如何删除数据
	定义循环变量 i, j,m;
	定义需要删除的位置的元素x;
	for (m= 0 to k)
	{
		
		scanf("%d", &x);
		
		for (j = x-1 to n-1)
		{
			a[j] = a[j + 1];
		}
         end for
		n = n - 1;
		
	
	}
         end for
若删除数据但不知道位置,方法相似

- 题目例子:PTA一维数组7-6
###1.1.7数组中目前学到排序方法
- a.冒泡法:通过相邻两个数不断交换,将数据往前或者后移动,经历n轮后达到排序的目的
- b.选择法:经过n-1轮循环,依次从下一个数据历遍数组来进行移动,达到排序的目的,需要两层循环
###1.1.8数组做枚举用法
- 寻找重复数据:在数组中寻找重复数据时,有时简单直接的方法就是直接历遍数组,一个个去看元素是否重复出现,将数据一个个列举,方法一个个举出,列出所有可能性,就是枚举,一个个拿出数据,一个个比较就是数组中的枚举

###1.1.9哈希数组用法
- 重复数据的判断,通过对哈希数组初始化全部赋零,再对需要判断的数组历遍,若出现过则赋1,当再次遇到时哈希数组值已经赋1则确定重复
- 哈希数组是偏向辅助的数组,在代码中作为一个辅助的存在来实现代码功能要求

##1.2本章学习体会
- 数组的学习对c语言很有用,在大数据型的代码中作用很大,但是多个数组的同时使用,让人觉得眼花缭乱,会出现分不清或者思路突然不清晰的情况,但是数组的学习确实大大缩减了代码量,非常好用。
| 周 | 代码量  | 
| ----- | --------- | 
| 十一周 | 380~400 |             
| 十二周 | 410~430    |       
|代码总量|790~~830|

#2.PTA实验作业
##2.1数组元素的删除
###2.1.1伪代码
    ``` 定义数组 a[M],M为最大范围
	定义数组的实际范围 n;
        定义需要删除的次数k;
	定义循环变量 i;
	调用具体范围n;
	
	for (i 0 to n)
	{
		调用数组所有元素a[i]

	}
        end for
	调用 k;

	删除函数Delete(a, n, k);

	
	for (i to n-k)
	{
		判断第几次输出,以控制空格;
                 输出数组
		
	}
       end for

	return 0;

       }
       删除函数
       {
	定义循环变量 i, j,m;
	int x;
	for (m to k)
	{
		
		调用需要删除的位置x
		
		for (j  x-1 to n-1)
		{
			将元素后挪
		}
        end for
		n = n - 1;
		
	
	}
        }```

###2.1.2代码截图
![](https://img2018.cnblogs.com/blog/1778794/201911/1778794-20191117132701265-657760966.png)


![](https://img2018.cnblogs.com/blog/1778794/201911/1778794-20191117132721707-1881492807.png)

###2.1.3造测试数据
| 输入数据 | 输出数据   | 说明 | 
| ----- | --------- | ----------- | 
| 10    |           |             |
|1 2 3 4 5 6 7 8 9 10|       |    |
| 4 ;3 2 4 6 |          1 4 5 7 8 10 |       正常数据     |                   
| 3           |              |     |
|3 4 5         |             |     |
|4 ;1 2 3 4       |           |   删除超出数组上限    |
| 3     |      |     |
|1 2 3|   |     |
|0     |1 2 3|不删除数据|   
    

###2.1.4 PTA提交说明及说明
![](https://img2018.cnblogs.com/blog/1778794/201911/1778794-20191117133843117-105967208.png)

提交列表说明
   - 格式错误:输出时数组之间需要空格,我的没有空格;

   - 格式错误:输出时,最后一个数据最后没有空格,我的最后一个数据仍然有空格;

   - 答案正确:通过确定是第几次输出,如果是第一次就不要空格,不然就在前面带空格,以保证最后一个数据没有空格;

##2.2 7-3上三角矩阵

###2.2.1伪代码

     ```定义二维数组a[M][M];
        定义循环变量,需要判断的矩阵个数;
	定义一个初始化为零的矩阵

	for (k = 0 to T)
	{
		调用第i to n个矩阵
		for (i = 0to n)
		{
			for (j = 0 to n)
			{
				调用二维数组
			}
                  end for
		}
                end for
		for (i = 0 to n)
		{
			for (j = 0 to n)
			{
				if (在下三角中出现0以外的数)

					count++;
                                end if
			}
			end for
		}

                end for
		if (count == 0)
		{
			对第k个矩阵赋1
		}
		else
		{
			对第k个矩阵赋0
		}
		初始化count ;
	}
        end for
	for(k=0 to T)
	{
		if (b[k] == 1)
		{
			printf("YES
");
		}
                end if
		else
		{
			printf("NO
");
		}
                end else
	}
        end for```

###2.2.2代码截图
![](https://img2018.cnblogs.com/blog/1778794/201911/1778794-20191117213444772-1652846597.png)

![](https://img2018.cnblogs.com/blog/1778794/201911/1778794-20191117213500936-433985649.png)



![](https://img2018.cnblogs.com/blog/1778794/201911/1778794-20191117213513808-1916478256.png)

###2.2.3造测试数据
| 输入数据 | 输出数据   | 说明 | 
| ----- | --------- | ----------- | 
| 1 2 3 4 5 6|      |          |
|0 2 3 4 5 6     |         |
|0 0 3 4 5 6 |              |
|0 0 0 0 0 0    |          |
|0 1 0 0 1 0     |         |
|1 2 3 4 5 6|NO |        正常数据     |         
| 1 2 3  |        |           |
| 0 4 5     |          |          |
| 0 0 6     |      |           |
| 1 0      |         |       |
|-8 24  |  YES;NO     | 正常数据  |  

###2.2.4PTA提交列表及说明
![](https://img2018.cnblogs.com/blog/1778794/201911/1778794-20191117214227155-1674015171.png)

提交列表说明

- 答案错误:一开始我的代码是根据题目测试数据写的,但是改变后就不对了,当n最大我的代码就出错了

- 答案错误:改数据后,没有考虑n最小,最大的情况,所以还是错误

- 答案正确:我因为修改一直不对,就直接重新写了一个代码,这个代码比之前的好很多

##2.3字符串转换成十进制整数
###2.3.1伪代码

	定义字符串数组 str[M],十六进制储存 hexad[M];
	长整型数据 number;
	循环变量 i,j, k=0;
	定义两个判断以控制输出数的正负的两个开关
         flag = 1;
	 point = 0;

	i = 0;
	while (读取字符串)
	{
		通过i自增控制循环
	}
	str[i] = '';

	
	for (i 0 to '')
	{
		if (出现'-',且开关为零)
		{
			flag = -1;
			
		}
                end if
			if (str[i] 为十六进制数)
			{

				改变point值,使后面才出现符号的情况无效

				储存十六进制数到hexad函数

				k++;
			}
                        end if
	}
        end for
	hexad[k] = '';

	

	number = 0;

	for (hexad!='')
	{
		if (数组元素是数字)
		{
			
				number = number * 16 + hexad[i] - '0';
			

		}
                end if
		else if (数组元素是大写字母)
		{
				number = number * 16 + hexad[i] - 'A'+10;
		}
                 end if

		else if (数组元素是小写字母)
		{
				
				number = number * 16 + hexad[i] - 'a'+10;
		}
		end if
	}
       end for

       通过flag控制number正负
	number = flag * number;
	printf("%ld
", number);
	return 0;
###2.3.2代码截图
![](https://img2018.cnblogs.com/blog/1778794/201911/1778794-20191117223238415-1190884629.png)



	
	

![](https://img2018.cnblogs.com/blog/1778794/201911/1778794-20191117223251149-1027426337.png)

![](https://img2018.cnblogs.com/blog/1778794/201911/1778794-20191117223303477-1189377511.png)

###2.3.3造测试数据
| 输入数据 | 输出数据   | 说明 | 
| ----- | --------- | ----------- | 
| +-P-xf4+-1!#|   -3905   |  正常数据,十六进制数前有负号        |
| f4+-1!#|   3905    |正常数据,十六进制数后才出现负号|
| hjkk#|  0|  无十六进制数|

###2.3.4PTA提交列表及说明
![](https://img2018.cnblogs.com/blog/1778794/201911/1778794-20191117224056997-1976823497.png)


提交列表说明

- 部分正确:考虑了测试数据,但是造其他测试数据时值正确,正负却不对

- 部分正确:用flag,point后,题目所给数据直接为正

- 答案正确:控制负号出现的同时point为正,并将flag取负,之后不再在意flag,point改变值,若没出现负号,point也改变值,保证flag不能取负

#3.阅读代码
![](https://img2018.cnblogs.com/blog/1778794/201911/1778794-20191123095847470-980957361.png)


![](https://img2018.cnblogs.com/blog/1778794/201911/1778794-20191123095904048-496454282.png)

![](https://img2018.cnblogs.com/blog/1778794/201911/1778794-20191123095919716-2065559283.png)

![](https://img2018.cnblogs.com/blog/1778794/201911/1778794-20191123095933818-1182431251.png)

- 题目大意:该题目意思是确定一张数字为2n的票前n位和与后n位和是否相等若相等则为幸运票,若不相等则计算还需要多少张才买到幸运票

- 代码理解:该代码为c++类,具体是通过数组存放票上的数字,再通过循环将前n为和放到sum[0]后n位放到sum[1],通过比较二者来确定幸运票,以及确定距离幸运票的张数

- 该代码亮点在于对sun[0]sum[1]的大小判断通过temp来计算差距,以及代码尾carry的使用,使代码计算避免了许多麻烦。
原文地址:https://www.cnblogs.com/sunweiling/p/11874099.html