2019春季第三周作业

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

1)实验代码

#include<stdio.h>
#include<stdlib.h>
int main(void)
{
    FILE * fp;
    int num[8],i,k,j=0,max,n,sum=0,a[30],m;
    char op;
    if((fp=fopen("d:\\Alice.txt","r"))==NULL){
        printf("File open error!\n");
        exit(0);
    }
    for(i=0;i<8;i++){
        fscanf(fp,"%c%d",&op,&num[i]);
        printf("%c%d",op,num[i]);
    }
    fscanf(fp,"%c",&op);
    printf("%c",op);
    for(i=0;i<8;i++){
        sum=num[i];
        for(k=i+1;k<8;k++){
            sum=sum+num[k];
            a[j]=sum;
            j++;
        }        
    }
    max=a[0];
    for(n=0;n<27;n++){
        if(max<=a[n]){
            max=a[n];
        }
    }
    if(fclose(fp)){
        printf("Can not close the file!\n");
        exit(0);
    }
    if((fp=fopen("d:\\Alice.txt","a"))==NULL){
        printf("File open error!\n");
        exit(0);
    }
    j=0;
    printf("\n[");
    fprintf(fp,"\n[");
    for(i=0;i<8;i++){
        sum=num[i];
        for(k=i+1;k<8;k++){
            sum=sum+num[k];
            a[j]=sum;
            j++;
            if(sum==max){
                for(m=i;m<=k;m++){
                    printf("%d,",num[m]);
                    fprintf(fp,"%d,",num[m]);
                }
                break;
            }
        }        
    }
    printf("\b]\n");
    printf("%d",max);
    fprintf(fp,"]\n");
    fprintf(fp,"%d",max);
    if(fclose(fp)){
        printf("Can not close the file!\n");
        exit(0);
    }
    return 0;
 }
 

2)流程图

2)本题遇到的问题及解决办法

问题:没办法把内容输入到文件里

解决办法:我把文件先用只读的方式打开在关闭,之后再打开再写文件

4)运行结果截图

5)评价

这次作业我做了很长时间,不知道为什么写的内容进不去文件,还是自己了解的不多,要多多学习才行

用时5小时

预习作业
预习“7.2 二维数组”,并完成PTA上的第三周作业:判断上三角矩阵
预习可以参看翁恺老师的MOOC视频:https://www.icourse163.org/course/ZJU-9001 ,第八周 数组—》8.2 数组运算

1)实验代码

#include<stdio.h>
int main(void)
{
    int T,n,a[10][10],k,i,j,count;
    scanf("%d",&T);
    for(k=1;k<=T;k++){
        scanf("%d\n",&n);
        count=0;
        for(i=0;i<n;i++){
            for(j=0;j<n;j++){
               scanf("%d",&a[i][j]);
               if(i>j&&a[i][j]==0){
                   count++;
               }
            }
        }
        if(count==n*(n-1)/2){
            printf("YES\n");
        }
        else{
            printf("NO\n");
        }
    }
    return 0;
}

2)流程图

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

问题:就是设定数组是不能直接是a[n][n],否则会出现段错误,还有就是设定的count不能在最上面否则结果会一直累加,应该在第一个循环里设定count=0.

解决办法:和室友一起想办法,最后进行调试,在调试的时候发现错误了。

4)运行结果截图

5)评价

这道题目做起来其实并不难,但是要仔细,定义是在循环里面还是在外面要分清楚,还有就是调试真的有必要。

用时2小时

猜你喜欢

转载自www.cnblogs.com/H-Alice/p/10529681.html