我有一个无限循环,无法找出原因?

时间:2013-11-12 00:08:24

标签: c infinite-loop

我的代码似乎有问题。我已经在下面列出了有关我的作业的一些细节以及我在作业中的尝试。我的教授说我非常接近答案,但我终于得到了我的代码来编译和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
  •   
     

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

     

我强烈建议您先用铅笔和纸制作一个计划   你试图进入该计划。确保模仿我找到的文档   在直方图示例中。

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

#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");
}

2 个答案:

答案 0 :(得分:3)

我不打算提供答案,因为这可能会破坏作业的重点(看起来有些努力)......而是让我描述一些你应该采取的调试方法。

1)假设您正在一个体面的开发环境(例如Visual C ++或Visual Studio Express或其他东西)工作,请在while {}循环的开头/结尾放置断点,看看这些值是否与您相同期待每个阶段。您可能会发现这些值不是您所期望的,这将说明问题。

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

如果您没有配备合适的开发工作室,请下载Visual Studio 2013 Express for Windows。尝试在没有适当工具的情况下调试代码是毫无意义的,并且不会教你解决问题或编程技巧。

答案 1 :(得分: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");
}