我没有获得C程序的所需输出

时间:2017-08-18 16:50:17

标签: c

我正在做一个c程序,但是如果我使用的话,示例输入没有给出示例输出。我认为我的程序没有调用该函数。我想我已经宣布错了。或者我的逻辑错了。我得到的是输出为零。问题如下。

一个C函数,在非负整数序列中查找整数n的第k次出现,然后调用你的函数 主要。

您的功能应符合以下声明:

int find(int n, int k);

输入

您将获得两行输入:

第一行包含一个非负整数,比如说n和一个正数 整数k,按此顺序。你必须找到n的第k次出现 以下序列。

第二行由一系列非负整数组成, 以-1结束。 -1不是序列的一部分。

输出

如果n在序列中出现k次,则输出第k个索引 在序列中出现n。

如果n在序列中没有出现k次,则输出-1。

(例如,序列中第二次出现整数3 1 1 3 2 3 -1位于序列中的位置4。第一个指数 序列是0。)

输入:

3 2
1 1 2 3 3 -1

输出:

4

代码:

#include<stdio.h>

int check(int a,int n ,int k ){
  int f;
   int value;
   int counter=0;
    counter++;

  if (a==n)
  {
    f++;
  }
  if(f==k)
  {
    value= counter;
  }
 return value;
}

int main(void)
{
  int n , k,a;

  int tempo;

  scanf("%d",&n);
  scanf("%d",&k);
  while(a!=-1)
  {
    scanf("%d",&a);

    tempo=check(a,n,k);

  }
  printf("%d",tempo);
         return 0;
         } 

2 个答案:

答案 0 :(得分:4)

您的check函数存在许多问题:

int check(int a,int n ,int k ){

您的原型与赋值中的原型不匹配 - 您只应该使用2个参数,这两个参数都不是您要检查的值序列。不知何故,无论如何,您应该通过引用全局数组( bad )或通过从函数体内读取输入序列来从函数体内访问该序列(稍差一点,可能是练习 1 的意图。

  int f;           
   int value;      

auto变量未在声明中隐式初始化 - 它们的初始值为 indeterminate 可能0,它可能是陷阱表示,可能是有效的非零整数值)。这会在以后引起问题。

   int counter=0;
    counter++;

我想我知道你要在这里尝试什么,并且它不会像写的那样工作 2 - counter仅在函数的生命周期内存在。每次拨打check时,都会创建counter实例,并将其初始化为0。它不会记住先前调用中存储在其中的值。

  if (a==n)
  {
    f++;

f此时不保证0(或任何其他特定值)。它可以0,或者它可以是任何非零值,甚至是陷阱表示(与有效整数不对应的位模式)值)。

  }
  if(f==k)
  {
    value= counter;
  }
 return value;
}

此时,counter只会是1 - 您在功能输入时将其初始化为0并立即递增,然后您再也不会再触摸它。因此value只会是不确定1

那么,你应该如何从这里开始满足作业的要求?

较不好的选项是从check(或find)函数中读取序列,虽然这仍然很糟糕(同样,I / O应该是一个单独的操作,我们'假设所有输入都来自stdin)。

int find( int n, int k )
{
  int next; // next value in the sequence
  ... // additional items for index, number of matches, etc.

  while ( scanf( "%d", &next ) == 1 && next != -1 )
  {
     // update index, does next match n, is it the k'th match, etc.
  }
  ...
}

scanf对于交互式输入来说是一个糟糕的工具,但此时更简单的方法

<小时/>

  1. 老实说,这并不比保持全局阵列更好。 I / O应尽可能从计算中计算出来,并且如果需要函数*从输入流中读取,则应将该流指定为函数的参数 - 您不应强制您的代码承担所有输入来自stdin
  2. counter需要声明为static才能保持其值,从呼叫到呼叫。

答案 1 :(得分:1)

我的解决方案完全是对John Bode所说的内容的延伸,正如John Bode所说,你使用的参数多于首选参数。你应该只坚持2个参数。因为你有两个参数n(对于搜索元素)和K(第k次出现)你不能将顺序数组传递给该函数,所以你应该开始读取(扫描)find()中的序列。

由于程序明确表示它以-1结束。您可以使用它来终止循环以终止查找功能。 扫描函数只要读取就返回true。即使对于-1,它返回true,因此你应该使用值!= - 1。在循环内部,您可以使用匹配逻辑并查找索引号。

int find(int n, int k){
   int next;
   int match=0;
   int  index=0; //for parsing the sequence
   while( scanf("%d", &next) ==1 && next!=-1){
       if(next == n){
           match++;
           if(match==k)
              return index;
        }
        index++; //move the index
    }
    return -1;
 }
相关问题