循环不变,没有返回值,是否可能?并且程序正确

时间:2015-01-21 05:29:43

标签: c for-loop while-loop correctness loop-invariant

所以我正在编写这个程序,将用户输入存储在链表上并将其反转,但我有点迷失。是否有可能为循环类型提出一个循环不变量,它不会返回任何值?例如,位于main内部的循环。

这是一个循环的例子,我用来在main中获取用户输入并将其存储在链表中,当然代码中还有更多内容,但我只展示了相关内容。< / p>

typedef struct node {
char x; // data
struct node* next; // link to next node
} Node;

int main(void){
char c = ' ';
Node* start = NULL; 
Node* temp; 
while(c!='.'){
    c=getchar();
    temp=(Node*)calloc(1, sizeof(Node));
    temp->x = c; 
    temp->next = start; 
    start = temp; 
}

是否可以为此设置循环不变量?程序的正确性又是什么意思?我如何在我的案例中对其进行证明?

谢谢!

2 个答案:

答案 0 :(得分:0)

  

循环不变量是关于它们之间关系的正式陈述   程序中的变量在循环之前保持为真   曾经运行(建立不变量)并且在底部再次成立   循环,每次循环(保持不变)

假设这是你想要的。您显示的代码看起来很好,可以将一个节点添加到链表中,所以关于正确性它应该没问题。

char str[100];
int cnt = 0;
int n;
fgets(str,100,stdin);
if(strlen(str) < 99)
str[strlen(str) -1] = '\0';

n = strlen(str);
/* cnt <= n */
while(str[i] != '.')
{
   /* cnt <= n */
   // Do your stuff
   cnt++;
   /* cnt <= n */
}
/* cnt <= n */

循环不变量

cnt <= n

答案 1 :(得分:0)

  

循环不变量是在循环的每次迭代之前和紧接之后必须为真的条件

int main(void)
{
    char c = ' ';
    Node* start = NULL; 
    Node* temp = NULL; 

    while(c!='.'){
        /* temp = NULL before each iteration*/

        c=getchar();
        temp=(Node*)calloc(1, sizeof(Node));
        temp->x = c; 
        temp->next = start; 
        start = temp;

        temp = NULL;
        /* temp = NULL after each iteration*/
    }

<强> So in this case temp is NULL before and after each iteration of the loop 即可。您可以将此作为证明。

有关详细信息,请参阅http://en.wikipedia.org/wiki/Loop_invariantWhat is a loop invariant?