[英]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
是用于交互式输入的较差的工具,但目前是较简单的方法。
stdin
。 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.