初学者的简单问题

zjliujun 2005-09-23 03:11:25
一个猜数字的小程序中有产生4个随机数字的函数:
int random()
{
int n= ::rand();
return (abs(n)-abs(n)/10*10);
}

void Generator(int *guessnum)
{
guessnum[0]=random();
while((guessnum[1]=random())==guessnum[0]);
while(((guessnum[2]=random())==guessnum[0])||(guessnum[2]==guessnum[1]));
while(((guessnum[3]=random())==guessnum[0])||(guessnum[3]==guessnum[1])||(guessnum[3]==guessnum[2]));
}

其中abs(n)/10*10 按照运算符先后规则不就是 abs(n)吗?干吗这么麻烦?
另外,while循环语句连循环体都没有,起到什么作用?
...全文
86 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjliujun 2005-09-23
  • 打赏
  • 举报
回复
多谢各位,试了一下,abs(n) - abs(n)/10*10 确实是得到个位数。我老是把以前中小学所学的乘除经验用到这里,忘了/是整除的意思。给分。
ssbelle 2005-09-23
  • 打赏
  • 举报
回复
慢了点成了第四位。。。。。。
ssbelle 2005-09-23
  • 打赏
  • 举报
回复
1.
int n; 注意是int值
abs(n)/10 对n的绝对值 一个整数做除法 把小数省略 即去掉个位数后的n
abs(n)/10*10 去掉个位数后的n乘以10 得到原来的n 将个位数变成0
abs(n) - abs(n)/10*10 得到这个随机产生的数的个位数 即一位数字

2.
guessnum[0]=random(); 将一个随机产生的1位数赋给传入的整数指针的第一位
while((guessnum[1]=random())==guessnum[0]);再将一个随机产生的1位数赋给整数指针的第二位,如果这个数字和第一位相等,那么就从新来过,再产生一个1位数做同样的赋值和比较,直到和第一位不相同再继续下去。
下同。 没有循环体但是条件还是在判断的
快乐鹦鹉 2005-09-23
  • 打赏
  • 举报
回复
while((guessnum[1]=random())==guessnum[0]);
虽然没有循环体。但是你要看到,while语句中的guessnum[1] = random()是赋值语句。所以并非是没有作用。作用就是先给guessnum[1]设置一个随机数,然后判断guessnum[1]和guessnum[0]是否相等。如果相等,那么继续产生随机数,直到得到一个与前一个不同的数为止。
yayafu 2005-09-23
  • 打赏
  • 举报
回复
有循环体啊,while((guessnum[1]=random())==guessnum[0]);的循环体就是guessnum[1]=random(),其他依次是guessnum[2]=random(),guessnum[3]=random()
快乐鹦鹉 2005-09-23
  • 打赏
  • 举报
回复
abs(n)/10*10的作用是过滤个位数。因为这里的/是整除的意思(左右两边都是整数时)。
比如abs(n) = 12;那么abs(n)/10*10的结果是10

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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