一个难懂的程序代码

一个难懂的程序代码,第1张

在执行

for(str in names)

str=eval(str)

for(num in numbers)

num=eval(num)

这2个for语句前str和num的值分别是30和20.但执行了这2个for语句后str和num分别变成了29和19.具体什么原因我不清楚。等我把for(str in names)搞明白了再补充~

PS:问题出在俩个for…in语句上

for(str in names)这句的意思是枚举names数组。str最后返回的是names数组的最后一项的脚标。比如说names数据还30个元素(暨names[0]到names[29])当执行完这个for…in后,str的值为4。

在回到你的代码中。你代码中物拆的names数组的元素个数为30个,当执行玩这个for…in后,str被赋值为29(暨names数组最戚型后一个元素的脚标)。同理Num的值也变成高蚂猜了19。故二者的和为48而不是50。

int listinsert(struct LIST *L,int i,struct STU e)

中蠢早i是表示插入L中带帆雀stu[]的位置。你再次都传入的是1,这样你第一次的插入就被第二次的插入给覆盖了。(最后面有我改过后的程序,你运行一下。作个对比。)

q=&(L->stu[i-1])

for(p=&L->stu[L->length-1]p>=q--p)

*(p+1)=*p

*q=e

++L->length

首先,它是将第i个stu[]元素放在stu[i-1]的。q=&(L->stu[i-1])表示的是在stu[]中第i个元素,也就是要插入的位置。p=&L->stu[L->length-1]是当前stu[]中最后一个元素。

for(p=&L->stu[L->length-1]p>=q--p)

*(p+1)=*p

p>=q的作用是判断插入位置是不是在最后一个元素之前。

如果是,就依次将第i到最后一个元素,从最后一个开始逐一往后移动一个位置。最后将元素插入第i个元素的位置i-1处。

如果不是,则直接将元素赋值给stu[i],也就是*q。(这里的i<=length,不然会出现小错误的!)

--p作用就是将stu[lengh-1]到stu[i-1]的元素依次往后移。先是length-1到length,再length-2到length-1,如此到i-1到i(p>=q).这样就把i-1的位置给留下来放待插入的元素了!

明白轿消了!希望对你有帮助。

#include"stdio.h"

#include"string.h"

#define ERROR 0

#define OK 1

struct STU{

char name[20]

char stuno[10]

int age

int score

}stu[50]

struct LIST

{

struct STU stu[50]

int length

}L

void printlist(struct LIST L)

{

int i

printf("namestuno age score\n")

for(i=0i<L.lengthi++)

printf("%s %s\t%d\t%d\n", L.stu[i].name, L.stu[i].stuno,

L.stu[i].age, L.stu[i].score)

printf("\n")

}

int listinsert(struct LIST *L,int i,struct STU e)

{

struct STU *p,*q

if (i<1||i>L->length+1) return ERROR

q=&(L->stu[i-1])

for(p=&L->stu[L->length-1]p>=q--p)

*(p+1)=*p

*q=e

++L->length

return OK

}/*ListInsert Before i */

main()

{

struct STU e

L.length=0

strcpy(e.name,"zmofun")

strcpy(e.stuno,"100001")

e.age=80

e.score=1000

listinsert(&L,1,e)

printlist(L)

printf("List length now is %d.\n\n",L.length)

strcpy(e.name,"bobjin")

strcpy(e.stuno,"100002")

e.age=80

e.score=1000

listinsert(&L,2,e)

printlist(L)

printf("List length now is %d.\n\n",L.length)

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12438587.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-23
下一篇2023-05-23

发表评论

登录后才能评论

评论列表(0条)

    保存