求出1000内的所有水仙花数,水仙花数值的是一个三位数,其各位数字立方和等于其本身。例如371=3^3+7^3+1^3 这个问题用C语言比较容易实现,但是用VI还没有弄明白,不用公式节点的话该怎么做呢?
问题很清楚,首先我们看看C语言是如何处理的,然后再讨论如何在LABVIEW中实现。
main()
{
int i,j,k,n;    /*定义整型变量i,j,k,n*/
printf("'water flower'number is:"); 
for(n=100;n<1000;n++) /*循环语句,每次循环N都自加1*/
  {
  i=n/100;              /*求出N这个3位数的百位*/
  j=(n-i*100)/10;       /*求出N这个3位数的十位*/
  k=n%10;               /*%是求余运算符,比如7%4值为3,求出个位数*/
  if(i*i*i+j*j*j+k*k*k==n)     /*百位数,十位数,个位数的立方和*/
    printf("%d\n",n);          /*以十进制整数形式输出*/
  }
}
二、利用公式节点
虽然网友要求不能使用公式节点,但是我还是要推荐公式节点。对于存在C语言代码的程序,转化为公式节点是很自然,也是很方便的,尤其是在计算量较大和比较复杂的情况,使用公式节点更为合理。
虽然公式节点的语法、函数与C语言非常类似,但是在细节上存在很大区别,如果照抄C语言代码,可能会导致错误结果,水仙花问题就是这样。
看看求取水仙花数的公式节点。
Picture
与C语言代码相比较,最为明显的区别在于使用了floor函数,这是个非常重要的区别,务必要引起重视。
  i=floor(n/100);
  j=floor((n-i*100)/10);
  k=n%10;
  if(floor(i**3+j**3+k**3)==n)
在C语言中,对于i=n/100;由于n和100都是整型数,所以执行除法的结果还是整型数,而不是双精度数。比如5/3,计算结果为1,因此利用这个特点,i=n/100可以直接求得百位数。
在公式节点和LABVIEW中,则是完全不同的,由于LABVIEW的基本运算函数和位、逻辑、关系运算函数具有多态型,因此体现了完全不同的特点。

Picture
从上面的程序框图中,可以发现在进行除法运算时,LABVIEW自动把整型数转换为双精度数,然后在进行除法运算,公式节点的除法运算也是如此。在公式节点中,由于定义的是I32,所以计算结果1.666自动四舍五入,转换为整型数为2,这样的结果显然不是我们希望的。
floor(x)将x转换为较小的整数,因此1.66转换为1,这正是我们需要的结果。
公式节点运算结果如下:
Picture
三、利用基本运算函数
LABVIEW与其它编程语言不同,没有专门的运算符的概念。数值函数选板中的函数相当于常规编程语言的基本运算符。
Picture
上面程序框图使用了复合运算函数,这个函数非常好用,我曾经专门介绍过它的特殊用法。
上面的程序框图虽然比较复杂,但是由于使用的都是最基本的运算函数,它的运行效率比使用公式节点要高,毕竟它是最基本的。
三、利用字符串分解十进制数位数
下面的方法包含了更多的技巧,更符合LABVIEW的编程习惯。虽然程序框图非常简单,但是运行效率可能会低一些。
Picture
上面的程序框图中,包括几个重要的技巧。
1、利用数值转换成字符串,则每个字符代表一个位。
2、字符串转换成U8数组,U8数组中存储的是数的ASCII码。
3、ASCII码-0X30,U8数组中的字符转换成真正的数字。
4、利用表达式节点直接进行数组运算。
对于使用BUILD ARRAY函数,一般是不推荐的,但是对于数量不大的数组,先分配,后替代的方法增加了编程的复杂性,没有必要。
 
 
 





Leave a Reply.