Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何翻译剪辑中的C语言循环(do…while)?_C_Clips - Fatal编程技术网

如何翻译剪辑中的C语言循环(do…while)?

如何翻译剪辑中的C语言循环(do…while)?,c,clips,C,Clips,假设C语言中的以下代码部分: void function(int n,int x) { int i,j; int max=5; int p[max]; // for example: p[max]={{100,1,100,3,10}}; ... ... for(i=0; i<n; i++) if(i!=x) { j=i; do { j=p[j];

假设C语言中的以下代码部分:

void function(int n,int x)
{
int i,j;
int max=5;
int p[max]; // for example: p[max]={{100,1,100,3,10}};
...
...

for(i=0; i<n; i++)
        if(i!=x)
        {
            j=i;
            do
            {
                j=p[j];     
            }
            while(j!=x);
        }
...
}

问题:这是正确的代码吗?欢迎任何帮助。提前感谢。

好的,通用的哑巴压倒一切的解决方案:定义一个类似这样的宏(伪代码我从来没有掌握lisp语法的窍门)


我认为您甚至可以跳过中间人,直接将循环嵌入递归扩展,但我只是不知道如何强制它进行尾部递归。

Do。。。不直接支持while,但您可以在while主体的末尾放置break语句来实现该功能:

(deffunction function (?n ?x)
    (loop-for-count (?i 1  ?n)
        (if (!= ?i ?x) 
        then
            (bind ?j ?i)
            (while TRUE do
                (do-for-all-facts ((?q q))
                    (and 
                        (= (fact-slot-value ?q line) 1)
                        (= (fact-slot-value ?q column) ?j)
                    )
                    (bind ?j (fact-slot-value ?q value))
                ) 
                (if (!= ?j ?x) then (break))
            )
        )
    )
)

对不起,把?q改为?距离你可以感谢你的关心和帮助,莱利先生。谢谢你的建议,约书亚先生。
(defmacro do-while (@test @body) (
   (body)
   (while (!= ?j ?x) do (body))
))
(deffunction function (?n ?x)
    (loop-for-count (?i 1  ?n)
        (if (!= ?i ?x) 
        then
            (bind ?j ?i)
            (while TRUE do
                (do-for-all-facts ((?q q))
                    (and 
                        (= (fact-slot-value ?q line) 1)
                        (= (fact-slot-value ?q column) ?j)
                    )
                    (bind ?j (fact-slot-value ?q value))
                ) 
                (if (!= ?j ?x) then (break))
            )
        )
    )
)