我正在做一个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;
}
答案 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
对于交互式输入来说是一个糟糕的工具,但此时更简单的方法
stdin
。
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;
}