• 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的使用,使代码计算避免了许多麻烦。
  • 相关阅读:
    C#环境下的钩子详解
    sql2005,sql2000 跨局域网操作 OPENDATASOURCE
    PowerDesigner中生成SQL SERVER2005字段注释的解决方法 .
    C# Excel2007 导出生成 2003兼容格式
    C# 做外挂,常用API
    服务器×××上的MSDTC不可用解决办法
    手工删除软件U8软件
    关于svn hook
    Hudson & Jenkins 文档一篇[转记]
    KVM 网络相关两个配置
  • 原文地址:https://www.cnblogs.com/sunweiling/p/11874099.html
Copyright © 2020-2023  润新知