一个简单计算机c语言程序的分析

来源:百度知道 编辑:UC知道 时间:2024/05/30 03:44:55
这是一个程序的一部分,目的是对数组a中的数进行筛选,选出既是偶数又大于其前面的连着的5个数,最后把这些数从大到小存入数组b中,正确的程序应该是这样的:

#include <stdio.h>
#define MAX 200
int a[MAX], b[MAX], cnt = 0;
void jsVal()
{
int i, j, flag = 0;
for (i=5; i<MAX; i++)
{
for (j=i-5; j<i; j++)
if (a[i] > a[j])
{
flag = 1;
}
else
{
flag = 0;
break;
}
if (flag==1 && a[i]%2==0)
{
b[cnt] = a[i];
cnt++;
}
}
for (i=0; i<cnt-1; i++)
for (j=i+1; j<cnt; j++)
if (b[i] < b[j])
{
flag = b[i];
b[i] = b[j];
b[j] = flag;
}
}

而我写的程序是
#include <stdio.h>
#define MAX 200
int a[MAX], b[MAX], cnt = 0;
void jsVal()
{
int i, j, flag = 0;
for (i=5; i<MAX; i++)
{
for (j=i; j>i-5; j--)**************第一处不同

if (a[i] > a[j] && a[i

第一个不同,导致将自身包含到了循环中,改成for (j=i-1; j>=i-5; j--)试试

第二个不同,导致只要数组中的数为偶数,并且其前面5个数中只要有一个数小于该数,则记录该数。这和其前面5个数都小于该数完全不同,当然会导致重复统计。
原代码中的flag正是为了记录前面5个数都小于该数,如果有一个数大等于该数,flag就为0,那么就不记录这个数。这才是正确的做法