0

我的代码似乎有问题。我在下面提供了一些关于我的作业的详细信息,以及我在作业中的尝试。我的教授说我非常接近答案,但我终于得到了我的代码来编译和 BAM!我得到一个无限循环,在我的终端上喷出大量数字。非常感谢您的帮助!:)

以下是我的程序的要求:

编写程序求最长连续子序列的长度(升序)。输出长度、位置以及子序列中的整数。如果有多个相同长度的子序列,则输出找到的第一个。

输入:
输入包含多个数据集。输入的每一行代表一个数据集。数据集中的第一个整数是数据集中剩余的整数个数(在行上)。数据集的末尾标有 -1。

以下是数据文件的示例。

   16 45 89 41 55 59 64 80 70 12 45 70 90 94 99 23 41
   10 1 2 3 4 5 6 7 8 9 10
   16 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4
   -1

输出:

  • 数据集 1 ==>Longest: 6 Positions: 8-13 Sequence: 12 45 70 90 94 99
  • 数据集 2 ==>Longest: 10 Positions: 0-9 Sequence: 1 2 3 4 5 6 7 8 9 10
  • 数据集 3 ==>Longest: 4 Positions: 0-3 Sequence: 1 2 3 4

你的程序必须包含一个主函数,至少两个函数,以及一个数组的用法。请注意,您没有对数组进行排序,但是直方图程序将是一个很好的参考程序。

让我强烈建议您在尝试进入程序之前用铅笔和纸制定一个计划。确保您模仿我在直方图示例中找到的文档。

到目前为止,这是我的代码:

#include<stdio.h>
#include<stdlib.h>
void load(int a[],int n);
void seq(int a[],int n,int *max, int *loc);
void print(int a[],int n);
int main(void)
{
    int a[100];
    int n;
    int max;
    int loc;

    scanf("%d",&n);
    while(n!=-1){
        if(n>100){
            fprintf(stderr,"Number entered is larger than 100\n");
            exit(1);
        }
        load(a,n);
        seq(a,n,&max,&loc);
        print(a,n);
        scanf("%d",&n);
    }
    return 0;
}

void load(int a[],int n)
{
    int i;
    for(i=0;i<n;i++)
    scanf("%d",&a[i]);
}

void seq(int a[],int n,int *max, int *loc)
{
    int i;
    int length=1;
    *max=-1;

    for(i=0;i<n-1;i++){
        if(a[i]<a[i+1]){
            length++;
            if(length>*max){
                *max=length;
                *loc=i-*max+1;
            }
        }else{
            if(length>*max){
                *max=length;
                *loc=i-*max+1;
            }
            length=1;
        }
    }
}

void print(int a[],int n)
{
    int i=0;
    while(i<n){
        printf("%d ",a[i]);
        i++;
    }
    printf("\n");
}
4

2 回答 2

3

我不会提供答案,因为这可能会破坏分配的重点(并且看起来需要付出一些努力)......而是让我描述一些您应该采用的调试方法。

  1. 假设您在一个体面的开发环境中工作(例如,Visual C++ 或 Visual Studio Express 或其他东西),在while {}循环的开始/结束处放置断点,并查看每个阶段的值是否符合您的预期。您可能会发现这些值不是您所期望的,这将说明问题。

  2. 如果您不能以这种方式对其进行调试,则在输出变量状态的重要代码行中将调试消息打印到控制台,并查看它们是否符合您的预期。也许在 10 次迭代后强制while {}循环中断,以避免无限循环并找出问题所在。

如果您没有合适的开发工作室,请下载适用于 Windows 的 Visual Studio 2013 Express。尝试在没有适当工具的情况下调试代码是没有意义的,并且不会教给您任何问题解决或编程技能。

于 2013-11-12T00:17:22.800 回答
0

终于完成了!!!!!感谢您的帮助!!!:) :)

/* Name: 
 * Class: CSC-1710
 * Date: 11/11/2013
 * File: 
 *
 * This program takes a set of numbers that are no larger than 100
 * elements in size and then finds a sequence within the set of numbers
 * that are in increasing order and displays the longest sequence,
 * the location of the sequence and when it ends.
 */
#include<stdio.h>
#include<stdlib.h>

/* PreCondition:
 *    Input array will be empty.
 * PostCondition:
 *    Array will be loaded with a maximum of 100 ints.
 * The function loads integers from a file.
 */

void load(int a[],int n);

/* PreCondition:
 *    Array is loaded with n integers.
 * PostCondition:
 *    Array is filtered through sequence function.
 * The sequence function takes an array and scans for
 * the longest sequence and finds the max and the location.
 */

void seq(int a[],int n,int *max, int *loc);

/* PreCondition:
 *    Array's max and location of sequence have been found.
 * PostCondition:
 *    Array is printed out with max and location and sequence.
 * The function prints the max, location of the beginning of the max,
 * and the ending of the max sequence,
 * and then uses a for loop to output the sequence that is the longest.
 */

void print(int a[],int n,int max,int loc,int cnt);

int main(void)
{
int a[100];
int n;
int max;
int loc;
int cnt=0;

scanf("%d",&n);
while(n!=-1){
   if(n>100){
      fprintf(stderr,"Number entered is larger than 100\n");
      exit(1);
   }
   load(a,n);
   seq(a,n,&max,&loc);
   cnt++;
   print(a,n,max,loc,cnt);
   scanf("%d",&n);
}
return 0;
}

void load(int a[],int n)
{
int i;
for(i=0;i<n;i++)
   scanf("%d",&a[i]);
}

void seq(int a[],int n,int *max, int *loc)
{
int i;
int length=1;
*max=-1;

for(i=0;i<n-1;i++){
   if(a[i]<a[i+1]){
      length++;
   }else{
      if(length>*max){
         *max=length;
         *loc=i-*max+1;
      }
   length=1;
   }
}
if(length>*max){
   *max=length;
   *loc=i-*max+1;
}
}

void print(int a[],int n,int max,int loc,int cnt)
{
int b=max+loc;
int i;
printf("Data Set %d ==>",cnt);
printf(" Longest: %d ",max);
printf("Positions: %d-%d ",loc,loc+max-1);
printf("Sequence: ");
for(i=loc;i<b;i++){
printf("%d ",a[i]);
}
printf("\n");
}
于 2013-11-12T19:21:41.537 回答