【作业】现代程序设计

题目及题目要求

现代程序设计 作业 2

设计思路

仅实现返回一维数组最大子数组和。

通过观察演算可发现,若前几位之和大于零,则子数组的和就有可能继续增大。

当所有数字小于零时,最大子数组和为最大负数,因此当和小于零时,该数也需参与各子数组和的排序。

代码

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 //qsort依赖比较函数头
 5 int cmpfunc (const void * a, const void * b);
 6 
 7 int main(int argc,char *argv[])
 8 {
 9    long row, col, res;
10    char temp;
11    FILE *fp = fopen(argv[argc-1],"r+");
12 
13    //判断文件是否正常打开,若未正常打开,文件指针为空指针
14    if(fp == NULL)
15    {
16        printf("Please type correct file name or arguments!\n");
17        getchar();
18        exit(1);
19    }
20 
21    fscanf(fp,"%ld%c%ld%c", &row, &temp,&col,&temp);
22 
23    //使用VLA(变长数组)特性,需编译器支持C99
24    int num[col],sum[col];
25 
26    for(int i=0;i<col;i++)
27    {
28         fscanf(fp,"%d%c", num+i, &temp);
29    }
30 
31    //仅实现一维数组
32    if(row!=1)
33    {
34        printf("\nThis edition don't support text whose the number of rows is more than 1!\n");
35        exit(1);
36    }
37 
38    //使用长整形变量,判断输入数字是否在int32位范围内
39    if(col>0x7fffffff || col<-0x7fffffff)
40    {
41        printf("The range of number should  in int32!");
42        exit(1);
43    }
44 
45    //前1个数的和为第1个数
46    sum[0] = num[0];
47 
48    for(int i=1; i<col; i++)      
49    {
50         if(sum[i-1] > 0)  //若前几位之和大于零,则子数组的和就有可能继续增大
51         {
52             sum[i] = sum[i-1] + num[i];
53         }
54         else             //用于处理数字都为负的情况
55         {
56             sum[i] = num[i];
57         }
58    }
59 
60    qsort(sum, col, sizeof(int), cmpfunc);//对和数组排序
61 
62    printf("%d",sum[0]);
63    return 0;
64 }
65 
66 int cmpfunc (const void * a, const void * b)
67 {
68    return ( *(int*)b - *(int*)a );
69 }

测试实验

在有限个输入错误测试中,并未产生程序崩溃。在运行程序参数错误时,亦有相应的错误提示信息。

想必有未测试出来的错误输入使得程序崩溃,还请各位看官参与测试。

附:

    可执行文件下载地址  programing.exe

原文地址:https://www.cnblogs.com/harson/p/10502619.html