• 2019年春季学期第三周作业


    一:本周完成的作业

    基础作业

    本周没上课,但是请大家不要忘记学习。
    本周请大家完成上周挑战作业的第一部分:给定一个整数数组(包含正负数),找到一个具有最大和的子数组,返回其最大的子数组的和。
    例如:[1, -2, 3, 10, -4, 7, 2, -5]的最大子数组为[3, 10, -4, 7, 2]
    输入:
    请建立以自己英文名字命名的txt文件,并输入数组元素数值,元素值之间用逗号分隔。
    输出
    在不删除原有文件内容的情况下,将最大子数组以及子数组的和写入文件。

    1)实验代码

    #include<stdlib.h>
    #include<stdio.h>
    /*主函数*/
     int main()
     {
         FILE *fp;
         int length;//定义数组列数length
         int line;//定义数组行数line 
         int n;//定义变化后的数组的长度
         
         /*
         打开文件 
         */ 
         if((fp=fopen("E:\LiuweiB.txt","a+"))==NULL)
         {
            printf("File open error!");
            exit(0);
         }
        
        fscanf(fp,"%d,
    %d,
    ",&line,&length);
        printf("%d
    %d
    ",line,length); 
         n=2*length;
         /*将数组复制一边,两数组首尾连接成一个环形*/
         int a[line][n];//初始化数组
         
         for(int i=0;i<length;i++)
         {    
            fscanf(fp,"%d,",&a[line][i]);
            printf("%d,",a[line][i]);
         }
         int max=a[line][0];
         int s=0;//定义求和后的元素
          for(int i=0;i<length;i++)
          {
             s=0;
             for(int j=i;j<length+i;j++)
             {
                 s=s+a[line][j];
                 if(s>max)
                 {
                     max=s;
                 }
             }
             a[line][length+i]=a[line][i];  //每次将已经计算过的数放到最后
          }
          printf("MAX=%d",max);
          fprintf(fp,",MAX=%d",max);
        
         //关闭文件
         if(fclose(fp)){
            printf("Can not close the file!");
            exit(0);
         } 
     
         return 0;
     }
    
    

    2)设计思路

    将数组复制一边,首尾连接成一个环形,从下标为0的数开始,逐个往后加,每加一个都要和最大值比较,若比最大值大,就将此时的值给最大值,当加到6个数时,停止累加,清空累加值;此时从下标为1的数开始逐个往后加,同上次方法一样,当加到6个数时,清空累加值;此时从下标为2的数开始逐个往后加……;直到下标为i-1的数累加完毕,此时该数组中所有子数组的值都已经遍历到了,得到的最大值就是最大的子数组的和。

    3)本题调试过程碰到问题及解决办法

    在参考别人的程序的时候,发现别人程序中有些代码没有学,比如<<的用法和意思
    上网查知;
    1.右移运算符:
    C语言中两个大于号>>是右移位操作,就是把一个数的二进制形式的最右几位丢弃,最前面补原来最高位的数字(原来是0就补0;原来是1就补1)
    右移运算的两个操作数应为整数类型。第一个操作数是要进行移位操作的数,第二个操作数指定第一个操作数移动的位数。如果第二个操作数等于0则不发生任何移位。运用举例:
    问:计算表达式14 >> 2的值。
    答:表达式14 >> 2的值为3,因为14(即二进制的00001110)向右移两位等于3(即二进制的00000011)
    2.输入操作数:
    在C++里面我们把>>当作输入操作符,它是stream这个类里一个重要的运算符。
    在C++中,有一个stream这个类,所有的I/O都以这个“流”类为基础的,包括我们要认识的文件I/O,stream这个类有两个重要的运算符:
    析取器(>>)
    从流中输入数据。比如说系统有一个默认的标准输入流(cin),一般情况下就是指的键盘,所以,cin>>x;就表示从标准输入流中读取一个指定类型(即变量x的类型)的数据。从左操作数指定的输入流读入数据到右操作数:cin >> i 把标准输入流中的下一个值读入到i中。
    和其他的函数没有什么区别。C/C++追求的就是简洁,当大量的输入需要处理的时候,我们用函数就要这样,scanf("%d%d%d",&a,&b,&c);(假设为短整型)
    .....但是用操作符的话就可以这样,cin>>a>>b>>c
    3.转换运算符:
    字符是可使用多种不同字符方案或代码页来表示的抽象实体。例如,Unicode UTF-16 编码将字符表示为 16 位整数序列,而 Unicode UTF-8 编码则将相同的字符表示为 8 位字节序列。公共语言运行库使用 Unicode UTF-16(Unicode 转换格式,16 位编码形式)表示字符。
    举例:$array[0] = ($str >> 16 & 0xff);
    表示把字符串$str转换为Unicode 16位的编码,然后存储到数组中。常见的UTF-8编码方式就是把例子中的16改成了8,表示Unicode编码,16位字符。

    4)运行结果截图





    7-1 判断上三角矩阵 (15 分)

    上三角矩阵指主对角线以下的元素都为0的矩阵;主对角线为从矩阵的左上角至右下角的连线。
    本题要求编写程序,判断一个给定的方阵是否上三角矩阵。
    输入格式:
    输入第一行给出一个正整数T,为待测矩阵的个数。接下来给出T个矩阵的信息:每个矩阵信息的第一行给出一个不超过10的正整数n。随后n行,每行给出n个整数,其间以空格分隔。
    输出格式:
    每个矩阵的判断结果占一行。如果输入的矩阵是上三角矩阵,输出“YES”,否则输出“NO”。
    输入样例:

    2
    3
    1 2 3
    0 4 5
    0 0 6
    2
    1 0
    -8 2
    

    输出样例:

    YES
    NO
    

    1)运行代码

    #include<stdio.h>
    int main()
    {
    	int t,n;
    	int str[10][10];
    	int f[10];//判断是否为上三角形矩阵 
    	
    	//输入需要判断的矩阵个数 
    	scanf("%d",&t);
    	f[t];
    	
    	for(int k=0;k<t;k++){
    		f[k]=1;
    		
    		//输入矩阵信息 
    		scanf("%d",&n);
    		for(int i=0;i<n;i++){
    			for(int j=0;j<n;j++){
    				scanf("%d",&str[i][j]);
    			}
    		}
    		
    		//判断
    		for(int i=0;i<n;i++){
    			for(int j=0;j<i;j++){
    				if(str[i][j]!=0){
    					f[k]=0;//储存判断结果 
    				}
    			}
    		}
    	}
    	
    	//输出
    	for(int k=0;k<t;k++){
    		if(f[k]){
    			printf("YES
    ");
    		}else{
    			printf("NO
    ");
    		}
    	} 
    	return 0;
    }
    
    

    2)设计思路

    3)本题调试过程碰到问题及解决办法


    问题:题目看错啦,我以为n在循环外面只输入一次,每个矩形是连续输入的,中间不输入n,所以就用三维矩阵的方法去做。
    解决办法:隔了一天,再看仔细题目,发现自己想复杂了,再重新做,没有碰到问题。

    4)运行结果截图

    二:学习进度条

    三:学习感悟

    感悟:对多维数组有一点的理解,能够熟练的运用二维数组解决问题。
    通过这次的作业,我发现自己的知识积累太少了,写稍微难一点的题目就有点捉襟见肘,不过这次作业对我来说有虽然难度,但通过上网查资料,不仅弄懂了别人的程序,而且用自己的方法写出了自己程序,也了解得到了很多没有学到的知识,感觉收获很多。
    比如#include "iostream"与#include的区别:前者先在当前目录找iostream文件,找不到再去系统头文件路径找,后者反之。因此,做为一个良好的习惯,在包含系统头文件时尽量用<>,而在包含自己的工程中的头文件时用
    比如void rewind(FILE *stream); 的功 能: 将文件内部的位置指针重新指向一个流(数据流/文件)的开头。

  • 相关阅读:
    谷歌浏览器解决跨域
    vue 解决跨域问题
    nth-of-type & nth-child 的区别
    uniapp 小程序 获取位置信息
    笔记本使用命令创建wifi
    express每次修改后重新启动
    express 一个js文件中写多个路由 然后使用
    小程序分享到朋友圈
    小程序分享给朋友
    小程序客服功能实现
  • 原文地址:https://www.cnblogs.com/liu2687479342/p/10530564.html
Copyright © 2020-2023  润新知