【作业】现代程序设计
题目及题目要求
设计思路
仅实现返回一维数组最大子数组和。
通过观察演算可发现,若前几位之和大于零,则子数组的和就有可能继续增大。
当所有数字小于零时,最大子数组和为最大负数,因此当和小于零时,该数也需参与各子数组和的排序。
代码
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