C语言的一道题,看了3个钟我都不知道错在哪~急死了,哥们帮帮忙~感激!!!

#include<stdio.h>
#define N 15
void main()
{int a[N],top,bott,x,mid,sign=0,i;
for(i=0;i<N;i++)
scanf("%d",&a[i]); /*输入15个数*/
printf("input x:");
scanf("%d",&x); /*输入要找的数*/
top=0; /*分别标记头跟尾*/
bott=N-1;
if(x==a[N-1]||x==a[0]) /*如果x等于头或等于尾的数,找到此数,标记sign=1*/
sign=1;
while(!sign) /*sign不为1时*/
{
mid=(top+bott)/2;
if(a[mid]==x); /*如果中间的数等于x,找到此数,标记sign=1*/
{sign=1;
break;
}
if(bott-top==1) /*当折半到剩下两个数时还没找到,标记sign=0*/
{sign=0;
break;
}
if(x<a[mid]) /*折半处理*/
bott=mid;
else top=mid;
}
if(sign) /*如果sign=1,即找到此数,输出此数,否则输出no find*/
printf("%d",x);
else printf("no find");
}
忘了说题目,这是用折半法找一个数是否存在,存在则输出
最新回答
一枕庭前雪

2024-11-24 04:32:41

void main()
没有VOID的MAIN(),改为int main.
很多人甚至市面上的一些书籍,都使用了void main( ) ,其实这是错误的。C/C++ 中从来没有定义过void main( ) 。C++ 之父 Bjarne Stroustrup 在他的主页上的 FAQ 中明确地写着 The definition void main( ) { /* ... */ } is not and never has been C++, nor has it even been C.( void main( ) 从来就不存在于 C++ 或者 C )。下面我分别说一下 C 和 C++ 标准中对 main 函数的定义。

1. C

在 C89 中,main( ) 是可以接受的。Brian W. Kernighan 和 Dennis M. Ritchie 的经典巨著 The C programming Language 2e(《C 程序设计语言第二版》)用的就是 main( )。不过在最新的 C99 标准中,只有以下两种定义方式是正确的:

int main( void )

int main( int argc, char *argv[] )

(参考资料:ISO/IEC 9899:1999 (E) Programming languages — C 5.1.2.2.1 Program startup)

当然,我们也可以做一点小小的改动。例如:char *argv[] 可以写成 char **argv;argv 和 argc 可以改成别的变量名(如 intval 和 charval),不过一定要符合变量的命名规则。

如果不需要从命令行中获取参数,请用int main(void) ;否则请用int main( int argc, char *argv[] ) 。

main 函数的返回值类型必须是 int ,这样返回值才能传递给程序的调用者(如操作系统)。

如果 main 函数的最后没有写 return 语句的话,C99 规定编译器要自动在生成的目标文件中(如 exe 文件)加入return 0; ,表示程序正常退出。不过,我还是建议你最好在main函数的最后加上return 语句,虽然没有这个必要,但这是一个好的习惯。注意,vc6不会在目标文件中加入return 0; ,大概是因为 vc6 是 98 年的产品,所以才不支持这个特性。现在明白我为什么建议你最好加上 return 语句了吧!不过,gcc3.2(Linux 下的 C 编译器)会在生成的目标文件中加入 return 0; 。

2. C++

C++98 中定义了如下两种 main 函数的定义方式:

int main( )

int main( int argc, char *argv[] )

(参考资料:ISO/IEC 14882(1998-9-01)Programming languages — C++ 3.6 Start and termination)

int main( ) 等同于 C99 中的 int main( void ) ;int main( int argc, char *argv[] ) 的用法也和 C99 中定义的一样。同样,main 函数的返回值类型也必须是int。如果main函数的末尾没写return语句,C++98 规定编译器要自动在生成的目标文件中加入 return 0; 。同样,vc6 也不支持这个特性,但是 g++3.2(Linux 下的 C++ 编译器)支持。

3. 关于 void main

在 C 和 C++ 中,不接收任何参数也不返回任何信息的函数原型为“void foo(void);”。可能正是因为这个,所以很多人都误认为如果不需要程序返回值时可以把main函数定义成void main(void) 。然而这是错误的!main 函数的返回值应该定义为 int 类型,C 和 C++ 标准中都是这样规定的。虽然在一些编译器中,void main 可以通过编译(如 vc6),但并非所有编译器都支持 void main ,因为标准中从来没有定义过 void main 。g++3.2 中如果 main 函数的返回值不是 int 类型,就根本通不过编译。而 gcc3.2 则会发出警告。所以,如果你想你的程序拥有很好的可移植性,请一定要用 int main 。

4. 返回值的作用

main 函数的返回值用于说明程序的退出状态。如果返回 0,则代表程序正常退出;返回其它数字的含义则由系统决定。通常,返回非零代表程序异常退出。下面我们在 winxp 环境下做一个小实验。首先编译下面的程序:

int main( void )

{

return 0;

}

然后打开附件里的“命令提示符”,在命令行里运行刚才编译好的可执行文件,然后输入“echo %ERRORLEVEL%”,回车,就可以看到程序的返回值为 0 。假设刚才编译好的文件是 a.exe ,如果输入“a && dir”,则会列出当前目录下的文件夹和文件。但是如果改成“return -1”,或者别的非 0 值,重新编译后输入“a && dir”,则 dir 不会执行。因为 && 的含义是:如果 && 前面的程序正常退出,则继续执行 && 后面的程序,否则不执行。也就是说,利用程序的返回值,我们可以控制要不要执行下一个程序。这就是 int main 的好处。如果你有兴趣,也可以把 main 函数的返回值类型改成非 int 类型(如 float),重新编译后执行“a && dir”,看看会出现什么情况,想想为什么会出现那样的情况。顺便提一下,如果输入 a || dir 的话,则表示如果 a 异常退出,则执行 dir 。

5. 那么 int main( int argc, char *argv[], char *envp[] ) 呢?

这当然也不是标准 C/C++ 里面定义的东西!char *envp[] 是某些编译器提供的扩展功能,用于获取系统的环境变量。因为不是标准,所以并非所有编译器都支持,故而移植性差,不推荐使用。

====================================================================

如果您觉得我不够权威,那么就让 C++ 之父 Bjarne Stroustrup 来说服您吧!
追问
改了也是运行结果错误,本来是运行得了的,没语法错误,但不知道哪里出错~
吐舌奶包吴市长

2024-11-24 04:21:37

你的犯的错非常简单,简单到令人发指呵呵,几位关于void的讨论令我晕头转向啊,
请看这一句
if(a[mid]==x);
这个分号多么的难以令人发现,导致这个if后面跟了一个空语句,那么后面的
{sign=1;
break;
}
必然是在任何情况下都会执行,所以肯定每次都会输出的呵呵

建议你:
1.最好注明数组要按从小到大的顺序输入,你的这个折半程序明显对应的是升序数列,那样程序界面会更好一些的
2.这个问题你用逐过程一下就能调出来,跟踪每个变量的值尤其是sign,你看他每次到那就直接成1了然后就跳出循环了,这明显就是根本没有执行判断嘛,再仔细一看就很容易发现这个小bug的啊~~

我用的vs2008,成功运行的~
追问
我搞错,程序正确了~~呵呵,我真笨~
ヾ{夨禮了┃

2024-11-24 04:29:36

建议这样修改(原文内容用书名号《》包括):
把第一个if,即《 if(x==a[N-1]||x==a[0]) sign=1; 》放到while循环体里面,紧跟着花括号;

另外上一位回答者说可能是void main的问题,也确实有可能。也可以试一试把void main改成int main,最后加一句return 0;
相逢即是缘分

2024-11-24 03:21:04

if(a[mid]==x); 很简单的低级错误啊 望LZ细心
追问
我搞错,程序正确了~~呵呵,我真笨~