繁体   English   中英

我没有得到C程序的期望输出

[英]I am not getting desired output for a C program

我正在执行ac程序,但如果使用,示例输入将不提供示例输出。 我认为我的程序没有调用该函数。 我想我已经错误地声明了。 否则我的逻辑是错误的。 我得到的是输出为零。 问题在下面给出。

编写一个C函数,以查找非负整数序列中第n个整数n的第k个出现,然后从main调用函数。

您的功能应根据以下声明:

int find(int n, int k);

输入项

您将获得两行输入:

第一行按此顺序包含一个非负整数(例如n)和一个正整数k。 您必须在以下序列中找到n的第k个出现。

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

输出量

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

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

(例如,整数1在序列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;
         } 

您的check功能有很多问题:

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

您的原型与作业中的原型不匹配-您只能采用2个参数,这两个参数都不是您要检查的值序列。 无论如何,应该通过引用全局数组( bad )或通过从函数体内读取输入序列(稍差一些,并且可能是通过练习的目的1 )。

  int f;           
   int value;      

auto变量未在声明中隐式初始化-它们的初始值不确定 (它可以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 ,以保持每次调用之间的值。

我的解决方案完全是对John Bode所说的内容的扩展,正如John Bode所说的,您使用的参数比首选的更多。 您应该只坚持两个参数。 并且由于您有两个参数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;
 }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM