小白问一道数组题,自己做的总是出问题

qq_41587942 2018-06-20 02:54:48
输入10个数到数组t中,再输入x,如果有与x相等的数组元素,输出该数组元素的下标;否则,输出-1。
书上的练习题,我为了方便改成了4,我换了几次代码,如果和X不相等的话输出-1没问题,但是相等的话,能输出下标的同时还会输出-1。有次改成相等的时候不输出-1了,但是输入不等的X却又出问题了。求大神改一下,并告诉下原因。
#include<stdio.h>
int main(void)
{
int i;
double t[4],x;
for ( i = 0; i < 4; i++)
scanf("%lf",&t[i]);
scanf("%lf",&x);
for(i=0;i<4;i++)
if(t[i]==x)
printf("%d\n",i);
if(i>3)
printf("-1\n");
return 0;
}
...全文
758 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
Votangroom 2018-07-02
  • 打赏
  • 举报
回复
代码改这样输出 i给你看看

#include<stdio.h>

int main(void)

{

int i;

double t[4],x;

printf("the numb list:\n");

for ( i = 0; i < 4; i++)

scanf("%lf",&t[i]);

printf("input x:");

scanf("%lf",&x);

for(i=0;i<4;i++)

if(t[i]==x)

printf("%d\n",i);

if(i>3)

printf("-1\n");

printf("the 'i':%d\n",i);

return 0;

}


运行结果
Votangroom 2018-07-02
  • 打赏
  • 举报
回复
你每次输出一下i看看是几你就知道你错在哪里了。不管是有相等还是没相等
olinadotey 2018-06-25
  • 打赏
  • 举报
回复
找到之后print然后break跳出循环,否则i一定大于3
weixin_42526650 2018-06-23
  • 打赏
  • 举报
回复
i =4
zhouqunhai 2018-06-23
  • 打赏
  • 举报
回复
i=4.导致找到后没有跳出,一直循环
八位比特 2018-06-23
  • 打赏
  • 举报
回复
我能不能求你写for循环的时候带上大括号?哪怕只有一句话
matthew_leung 2018-06-22
  • 打赏
  • 举报
回复
[quote=引用 楼主 qq_41587942 的回复:]
输入10个数到数组t中,再输入x,如果有与x相等的数组元素,输出该数组元素的下标;否则,输出-1。
书上的练习题,我为了方便改成了4,我换了几次代码,如果和X不相等的话输出-1没问题,但是相等的话,能输出下标的同时还会输出-1。有次改成相等的时候不输出-1了,但是输入不等的X却又出问题了。求大神改一下,并告诉下原因。
#include<stdio.h>
int main(void)
{
int i;
double t[4],x;
for ( i = 0; i < 4; i++)
scanf("%lf",&t[i]);
scanf("%lf",&x);
for(i=0;i<4;i++)
if(t[i]==x)
printf("%d\n",i);
if(i>3)
printf("-1\n");
return 0;
}
你的代码在循环判断的时候不会到i==4的时候还进入循环的
我对你的代码进行了简单的修改,希望你能采纳
#include<stdio.h>
int main(void)
{
int i, tag = 0;
double t[4],x;
for(i = 0; i < 4; i++) {
scanf("%lf", &t[i]);
}
scanf("%lf", &x);
for(i = 0; i < 4; i++) {
if(t[i] == x) {
printf("%d\n", i);
tag = 1;
}
}
if(! tag) {
printf("-1\n");
}

return 0;
}
lxw_2009 2018-06-22
  • 打赏
  • 举报
回复
引用 14 楼 cfjtaishan 的回复:
[quote=引用 10 楼 lxw_2009 的回复:]
[quote=引用 1 楼 cfjtaishan 的回复:]
#include<stdio.h>
#include <math.h>

int main(void)
{
int i;
double t[4],x;

for ( i = 0; i < 4; i++)
scanf("%lf",&t[i]);
scanf("%lf",&x);
for(i=0;i<4;i++)
if(fabs(t[i] - x) < 1e-16) {
printf("%d\n",i);
break;
}
if(i>3)
printf("-1\n");

return 0;
}

参考一下吧

两个问题:
1)当找到和x相等的元素时,没有break出循环,而是继续循环,所以i也会向后自增,直到i = 4时才退出循环;自然if (i > 3)也会执行了。
2)double双精度比较两个值是否相等不能按照整型数比较大小的方式,直接去比较。需要用如上的方式比较相等;[/quote

请问一下,为什么是fabs(t[i] - x<le-16这个范围,我不太明白,它的取值范围是10的-16次幂。能解释为什么是这个思路吗?谢谢

因为double的精度是1e-16(有效精度)[/quote]

哦,了解了,谢谢
自信男孩 2018-06-21
  • 打赏
  • 举报
回复
引用 10 楼 lxw_2009 的回复:
[quote=引用 1 楼 cfjtaishan 的回复:]
#include<stdio.h>
#include <math.h>

int main(void)
{
int i;
double t[4],x;

for ( i = 0; i < 4; i++)
scanf("%lf",&t[i]);
scanf("%lf",&x);
for(i=0;i<4;i++)
if(fabs(t[i] - x) < 1e-16) {
printf("%d\n",i);
break;
}
if(i>3)
printf("-1\n");

return 0;
}

参考一下吧

两个问题:
1)当找到和x相等的元素时,没有break出循环,而是继续循环,所以i也会向后自增,直到i = 4时才退出循环;自然if (i > 3)也会执行了。
2)double双精度比较两个值是否相等不能按照整型数比较大小的方式,直接去比较。需要用如上的方式比较相等;[/quote

请问一下,为什么是fabs(t[i] - x<le-16这个范围,我不太明白,它的取值范围是10的-16次幂。能解释为什么是这个思路吗?谢谢

因为double的精度是1e-16(有效精度)
donjin9 2018-06-21
  • 打赏
  • 举报
回复
主要是浮点数在截断的时候可能会损失精度。一般建议相减来比较。
不过如果是扩展或者确定截断不会损失精度,用==也是没问题的。
qq_41587942 2018-06-21
  • 打赏
  • 举报
回复
@自信男孩
我想用普通的方式做一下,这章在我的书里是函数之前的章节。
qq_41587942 2018-06-21
  • 打赏
  • 举报
回复
@赵4老师
我每次单步调试都会给我报错,然后就关掉了
lxw_2009 2018-06-20
  • 打赏
  • 举报
回复
[quote=引用 1 楼 cfjtaishan 的回复:]
#include<stdio.h>
#include <math.h>

int main(void)
{
int i;
double t[4],x;

for ( i = 0; i < 4; i++)
scanf("%lf",&t[i]);
scanf("%lf",&x);
for(i=0;i<4;i++)
if(fabs(t[i] - x) < 1e-16) {
printf("%d\n",i);
break;
}
if(i>3)
printf("-1\n");

return 0;
}

参考一下吧

两个问题:
1)当找到和x相等的元素时,没有break出循环,而是继续循环,所以i也会向后自增,直到i = 4时才退出循环;自然if (i > 3)也会执行了。
2)double双精度比较两个值是否相等不能按照整型数比较大小的方式,直接去比较。需要用如上的方式比较相等;[/quote

请问一下,为什么是fabs(t[i] - x<le-16这个范围,我不太明白,它的取值范围是10的-16次幂。能解释为什么是这个思路吗?谢谢
自信男孩 2018-06-20
  • 打赏
  • 举报
回复
https://www.cnblogs.com/xiehongfeng100/p/4851201.html
即使都是手动输入的,也建议使用求两个值相差的绝对值小于1e-6来判定相等
自信男孩 2018-06-20
  • 打赏
  • 举报
回复
https://www.cnblogs.com/xiehongfeng100/p/4851201.html
即使都是手动输入的,也建议使用求两个值相差的绝对值小于1e-6来判定相等
自信男孩 2018-06-20
  • 打赏
  • 举报
回复
https://www.cnblogs.com/xiehongfeng100/p/4851201.html
即使都是手动输入的,也建议使用求两个值相差的绝对值小于1e-6来判定相等
赵4老师 2018-06-20
  • 打赏
  • 举报
回复
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
paschen 2018-06-20
  • 打赏
  • 举报
回复
另外纠正下1楼,可以直接用==比较的,毕竟两个边的变量都是你自己输入的
paschen 2018-06-20
  • 打赏
  • 举报
回复
无论是否找到,你的循环总完执行4次,所以你每次执行完循环,i总是为4,所以总是会输出-1 修改方法,如果找到,输出后break出循环
千寻港生惠香 2018-06-20
  • 打赏
  • 举报
回复
break下
加载更多回复(2)
leetcode 1004 description 致力于每天刷一道 算法导航 算法进阶小白 关于算法,不言而喻,是至关重要的。 关于自己学习算法的方法论,最重要的是建立算法知识脑图,如下图: 建立一套完整、属于自己的体系。其次就是采用追溯法,对于自己不知道的知识通过各种比较权威的文章进行学习。最后就是不断练习、不断coding、不断回顾。 练习的渠道个人选择的是**,**对于不同的类型的目进行归类之外,还可以互相学习,有一些知识点归纳的小册也是自己学习的选项。 最后,也是最重要的 坚持 坚持 坚持 !!! 推荐算法有关书籍 ******** 本站已刷目 {% tabs %} {% tab title="数组" %} :monkey_face: :monkey_face: :monkey_face: :monkey_face: :monkey_face: :monkey_face: :monkey_face: :monkey_face: :monkey_face: :monkey_face: :monkey_face: :monkey_face: :monkey_face: :monkey_face: :monkey_face: :monkey_face: :monkey_face: :monkey_face: :monkey_face: :monkey_face: :monkey_face: :monkey_face: :monkey_face: :monkey_face: :monkey_face: :monkey_face: :monkey_face: :monkey_face: :see-no-evil_monkey: :see-no-evil_monkey: :see-no-evil_monkey: :monkey_face: :monkey_face: {% endtab %} {% tab title="链表" %} {% endtab %} {% tab title="栈、队列" %} {% endtab %} {% tab title="二叉树" %} :palm_tree: :palm_tree: :palm_tree: :palm_tree: :palm_tree: :palm_tree: :palm_tree:

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧