第一篇:0-1背包问题c语言程序
0-1背包问题
问题描述
给定n种物品和一背包,物品i的重量是wi,其价值是pi,背包的容量是M,如何选择装入背包中的物品总价值最大? 问题分析
记c[i][m] 表示前i个物品,在背包容量大小为m的情况下,最大的装载量。如果不放第i件物品,那么问题就转化为“前i-1件物品放入容量为m的背包中”,价值为c[i-1][m];如果放第i件物品,那么问题就转化为“前i-1件物品放入剩下的容量为m-w[i]的背包中”,此时能获得的最大价值就是c[i-1][m-w[i]]再加上通过放入第i件物品获得的价值p[i]。因为背包最大容量M未知。所以,我们的程序要从1到M一个一个的试。比如,开始任选N件物品的一个。看对应M的背包,能不能放进去,如果能放进去,并且还有多的空间,则多出来的空间里能放N-1物品中的最大价值。从以上最大价值的构造过程中可以看出: c(n,m)=max{c(n-1,m), c(n-1,m-w[n])+p(n)其中c[i-1][m] 表示第i件物品不装入背包中,而c[i-1][m-w[i]] + p[i] 表示第i件物品装入背包中。伪代码:
1.最优值max(x1*p1+x2*p2+„„xn*pn)int knapsack(int m,int n,int *w,int *p){
bool a;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(w[i]<=j)
{
a=p[i]+c[i-1][j-w[i]]>c[i-1][j];
c[i][j]=a?p[i]+c[i-1][j-w[i]]:c[i-1][j];
//前者表示放i物品,后者表示不放i物品
}
else //i号物品重量大于剩余容量,不能再放i号物品
c[i][j]=c[i-1][j];
}
return(c[n][m]);//最后的值即为最优值,返回主函数 }
2.求最优n元0-1向量(x1,x2,x3„„,xn)int getbest(int m,int n,int *w,int *p){
if(n==0)return 0;//递归,每次递归n减1,n为0时退出
if(w[n]>m)
{
x[n]=0;
getbest(m,n-1,w,p);
}
else
{
//如果c[n][m]由p[n]+c[n-1][m-w[n]]而来,则x[n]=1;
//如果c[n][m]由c[n-1][m]]而来,则x[n]=0;
x[n]=c[n-1][m]<=p[n]+c[n-1][m-w[n]];
if(x[n])
getbest(m-w[n],n-1,w,p);
else
getbest(m,n-1,w,p);
} }
程序:
#include
bool a;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(w[i]<=j)
{
a=p[i]+c[i-1][j-w[i]]>c[i-1][j];
c[i][j]=a?p[i]+c[i-1][j-w[i]]:c[i-1][j];
//前者表示放i物品,后者表示不放i物品
}
else //i号物品重量大于剩余容量,不能再放i号物品
c[i][j]=c[i-1][j];
}
return(c[n][m]);//最后的值即为最优值,返回主函数 }
//求最优n元0-1向量(x1,x2,x3……,xn)int getbest(int m,int n,int *w,int *p){
if(n==0)return 0;//递归,每次递归n减1,n为0时退出
if(w[n]>m)
{
x[n]=0;
getbest(m,n-1,w,p);
}
else
{
//如果c[n][m]由p[n]+c[n-1][m-w[n]]而来,则x[n]=1;
//如果c[n][m]由c[n-1][m]]而来,则x[n]=0;
x[n]=c[n-1][m]<=p[n]+c[n-1][m-w[n]];
if(x[n])
getbest(m-w[n],n-1,w,p);
else
getbest(m,n-1,w,p);
} }
void main(){
int m,n;int *w=NULL;
int *p=NULL;
printf(“输入背包容量和货物个数:”);
scanf(“%d%d”,&m,&n);p=(int *)calloc(n,sizeof(int));//分配n*sizeof(int)的内存大小,存取n个物品的价格
w=(int *)calloc(n,sizeof(int));//分配n*sizeof(int)的内存大小,存取n个物品的质量
if(!p||!w)//检测分配是否成功
{
printf(“Not Enough Memory!n”);
exit(1);//分配失败,退出
}
for(int i=1;i printf(“物品x%d的重量和价值:”,i); scanf(“%d%d”,w+i,p+i);} printf(“n总价值最大为:%d”,knapsack(m,n,w,p)); printf(“n”); for(i=0;i<=n;i++)//打印执行动态规划每步的值 for(int j=0;j<=m;j++) { printf(“%3d ”,c[i][j]); if(j==m) printf(“n”); } getbest(m,n,w,p); printf(“最优n元0-1向量为:n”); for(i=1;i<=n;i++) printf(“x%d ”,i); printf(“n”); //打印最优n元0-1向量(x1,x2,x3……,xn) for(i=1;i<=n;i++) printf(“%-4d”,x[i]); printf(“n”);} 运行结果: #include int c[10][100];/*对应每种情况的最大价值*/ int knapsack(int m,int n){ int i,j,w[10],p[10]; printf(“请输入每个物品的重量,价值:n”); for(i=1;i<=n;i++) scanf(“%d,%d”,&w[i],&p[i]); for(i=0;i<10;i++) for(j=0;j<100;j++) c[i][j]=0;/*初始化数组*/ for(i=1;i<=n;i++) for(j=1;j<=m;j++) { if(w[i]<=j)/*如果当前物品的容量小于背包容量*/ { if(p[i]+c[i-1][j-w[i]]>c[i-1][j]) /*如果本物品的价值加上背包剩下的空间能放的物品的价值*/ /*大于上一次选择的最佳方案则更新c[i][j]*/ c[i][j]=p[i]+c[i-1][j-w[i]]; else c[i][j]=c[i-1][j]; } else c[i][j]=c[i-1][j]; } return(c[n][m]); } int main(){ int m,n;int i,j; printf(“请输入背包的承重量,物品的总个数:n”); scanf(“%d,%d”,&m,&n); printf(“旅行者背包能装的最大总价值为%d”,knapsack(m,n)); printf(“n”); return 0;} 业余党校笔记(全部整理) 2009年4月16日 第一讲《中国共产党的性质和指导思想》 党的性质,是指一个政党所具有的质的规定性,即它代表哪个阶级利益,具有哪个阶级的特性。中国共产党的性质是有别于其他政党和团体的,中国共产党的性质表明它是一个有鲜明特色的政党。 《中国共产党章程》是中国共产党的根本大法,是党内的生活准则和行为规范,是最根本的党规党法。 一、中国共产党的性质 中国共产党是什么性质的党,这是每个要求加入中国共产党的同志首先必需弄清的问题。 十六大党章规定:“中国共产党是中国工人阶级的先锋队,同时是中国人民和中华民族的先锋队,是中国特色社会主义事业的领导核心,代表中国先进生产力的发展要求,代表中国先进文化的前进方向,代表中国最广大人民的根本利益。党的最高理想和最终目标是实现共产主义。” 下面就党的性质谈几方面的问题: (一)中国共产党是中国工人阶级的先锋队,同时是中国人民和中华民族的先锋队 1、中国共产党是中国工人阶级的先锋队 (1)从政党与阶级的关系看,政党是阶级的政治组织。 (2)从工人阶级的自身特点看,工人阶级是最先进、最具有前途的阶级。 (3)从工人阶级的发展变化看,它始终是推动中国先进生产力的基本力量。 (4)从中国共产党的构成看,党是由中国工人阶级的先进分子所组成。 2、中国共产党是中国人民和中华民族的先锋队 (1)中国工人阶级的根本利益同中国人民和中华民族的根本利益是一致的。 (2)中国共产党在代表中国工人阶级利益的同时,始终把代表中国人民和中华民族的利益作为自己的重要责任。 (3)新世纪新阶段全面建设小康社会,是中国共产党代表阶级、民族和人民利益的具体体现。 (二)中国共产党是中国特色社会主义事业的领导核心 1、中国共产党的领导地位是党的历史作用和历史使命决定的2、中国共产党的领导地位是党的自身特点决定的3、中国共产党的领导地位是历史的选择 (三)三个代表 1、中国共产党始终代表中国先进生产力的发展要求 2、中国共产党始终代表中国先进文化的前进方向 3、中国共产党始终代表中国最广大人民的根本利益 (四)坚持党的性质,保持党的先进性 1、巩固党的阶级基础,扩大党的群众基础 (1)正确认识我国工人阶级和社会结构的新变化。 (2)注重把社会各方面的先进分子吸收到党内来。 2、把党建设成中国特色社会主义事业的坚强领导核心 (1)必须始终把党的思想建设放在首位。 (2)必须坚持执政为民的根本宗旨。 (3)必须坚持和健全党的民主集中制。 3、按照“三个代表”要求,始终走在时代前列 (1)必须坚持以“三个代表”重要思想为指导。 (2)把发展作为执政兴国的第一要务,不断开创现代化建设新局面。 (3)牢牢把握中国先进文化的发展趋势。 (4)把最广大人民的根本利益实现好、维护好、发展好。 二、中国共产党的指导思想 党的十六大修订的新党章明确规定:“中国共产党以马克思列宁主义、毛泽东思想、邓小平理论和„三个代表‟重要思想作为自己的行动指南。”这个规定,赋予党的指导思想新的时代内涵,表明了党的指导思想与时俱进。 (一)马克思主义、毛泽东思想是工人阶级政党的理论基础和行动指南 (二)邓小平理论是指引中国特色社会主义现代化事业的伟大旗帜 (三)“三个代表”重要思想是加强和改进党的建设,推进我国社会主义自我完 (四)高举邓小平理论伟大旗帜,全面贯彻“三个代表”重要思想 1、高举邓小平理论伟大旗帜 第二讲《中国共产党的最高理想和现阶段的奋斗目标》 一、党的最高理想和最终目标——实现共产主义 我们党之所以称之为共产党,就是因为我们党要为实现共产主义而奋斗。共产党从诞生之日起,就是以实现共产主义为最终奋斗目标的,无论过去、现在和将来,共产主义理想都是共产党的力量源泉、精神支柱和立身之本。如果动摇了这个理想信念,也就动摇了共产党人的根本政治立场。 (一)共产主义是共产党人的的最高理想 1、生产力高度发展,物质财富极大丰富。 2、实行各尽所能,按需分配的原则。 3、人类获得全面发展,思想觉悟极大地提高。 4、阶级彻底消灭,三大差别完全消失。 5、政党和国家消亡。 二、党现阶段的奋斗目标是全面建设小康社会 党的十六大为我们提出了党和国家到2010年的奋斗目标,这就是集中力量全面建设惠及几十亿人口的更高水平的小康社会,这个全面建设小康社会的阶段,是实现现代化建设第三战略目标必须的承上启下的发展阶段,经过这个阶段的建设,再继续奋斗几十年,到本世纪中叶基本实现现代化就可以把我国建设成富强、民主、文明、和谐的社会主义国家。所以,全面建设小康社会,是全国各族人民的根本利益所在,展现了加快推进社会主义现代化建设的光明前景。 ●现阶段的奋斗目标是全面建设小康社会。 全面建设小康社会的主要奋斗目标。 实现全面建设小康社会奋斗目标的新要求。 1、要增强发展协调性,努力实现经济又好又快发展。 2、要扩大社会主义民主,更好保障人民权益和社 会公平正义。 3、要加强文化建设,明显提高全民族文明素质。 4、要加快发展社会事业,全面改善人民生活。 5、要建设生态文明,基本形成节约能源资源和保护生态环境的产业结构、增长方式、消费模式。 思考题: 1、党的最高理想和现阶段的奋斗目标是什么? 2、全面建设小康社会的奋斗目标是什么? 2009年5月14日 第三讲:《入党的条件与程序》 一、申请入党的资格 《中国共产党章程》第一章“党员”第一条明确规定: 年满十八岁的中国工人、农民、军人、知识分子和其他社会阶层的先进分子,承认党的纲领和章程,愿意参加党的一个组织并在其中积极工作、执行党的决议和按期交纳党费的,可以申请加入中国共产党。 1.申请入党的客观条件: ①必须年满十八岁; ②必须是具有中国国籍的公民; ③必须是工人、农民、军人、知识分子和其他社会阶层的先进分子。 2.申请入党的主观条件: ①承认党的纲领和章程; ②愿意参加党的一个组织并在其中积极工作; ③执行党的决议; ④按期交纳党费。 二、共产党员的基本条件 申请入党的同志不仅要具备申请入党的资格,还要懂得共产党员应该是什么样的人,也就是要懂得共产党员的基本条件。 1.《党章》第一章第二条指出: ①中国共产党党员是中国工人阶级的有共产主义觉悟的先锋战士。 ②中国共产党党员必须全心全意为人民服务,不惜牺牲个人的一切,为实现共产主义奋斗终身。 ③中国共产党党员永远是劳动人民的普通一员。除了法律和政策规定范围内的个人利益和工作职权以外,所有共产党员都不得谋求任何私利和特权。 2.党员基本条件解读 ①共产党员要牢固树立共产主义信念。共产主义信念,就是对共产主义思想、理论和社会制度具有深刻的理解,坚信共产主义事业的正确性和必然性,对共产主义理想进行执著的追求,自觉地为共产主义事业奋斗终身。 ②共产党员要全心全意为人民服务。全心全意为人民服务,是我们党的根本宗旨。共产党员要全心全意为人民服务,必须牢固树立无私奉献的人生观和价值观,自觉做到个人利益服从党和人民的利益,不惜牺牲个人的一切,尽最大努力为人民谋利益,不断提高为人民服务的本领,认真贯彻党的群众路线,与群众保持密切联系。 ③党员应该永远是劳动人民的普通一员,要防止各种特权思想和行为的发生,克服消极腐败现象,保持党与人民的血肉联系。 三、共产党员的具体条件——党员义务、权利 党员义务是指党员对党应尽的责任,是一种规范和约束。它体现了党对每个党员的基本要求,规定了做一名合格党员的具体标准,是党员条件的具体化。党员的权利是指根据党章规定,允许党员行使的权利和应当享有的利益。党员义务和权利既是共产党员的具体标准,也是衡量每个共产党员是否合格的统一尺度。 1.《党章》第一章第三条规定了共产党员必须履行的八项义务: (一)认真学习马克思列宁主义、毛泽东思想、邓小平理论和“三个代表”重要思想,学习科学发展观,学习党的路线、方针、政策和决议,学习党的基本知识,学习科学、文化、法律和业务知识,努力提高为人民服务的本领。 (二)贯彻执行党的基本路线和各项方针、政策,带头参加改革开放和社会主义现代化建设,带动群众为经济发展和社会进步艰苦奋斗,在生产、工作、学习和社会生活中起先锋模范作用。 (三)坚持党和人民的利益高于一切,个人利益服从党和人民的利益,吃苦在前,享受在后,克己奉公,多做贡献。 (四)自觉遵守党的纪律,模范遵守国家的法律法规,严格保守党和国家的秘密,执行党的决定,服从组织分配,积极完成党的任务。 (五)维护党的团结和统一,对党忠诚老实,言行一致,坚决反对一切派别组织和小集团活动,反对阳奉阴违的两面派行为和一切阴谋诡计。 (六)切实开展批评和自我批评,勇于揭露和纠正工作中的缺点、错误,坚决同消极腐败现象作斗争。 (七)密切联系群众,向群众宣传党的主张,遇事同群众商量,及时向党反映群众的意见和要求,维护群众的正当利益。 (八)发扬社会主义新风尚,提倡共产主义道德,为了保护国家和人民的利益,在一切困难和危险的时刻挺身而出,英勇斗争,不怕牺牲。 1.1党员义务解读: 党员义务是共产党员的基本职责。 履行党员义务是共产党员的分内之事,是共产党员的自觉行为。它是党员提高对共产主义事业的责任心与积极性,贯彻党的路线、方针、政策的有力保证。 党员义务的第一项首先强调了党员具有学习的义务。学习是对每一个共产党员最基本的要求,党员必须努力学习、善于学习马列主义基本立场、观点、方法,才能抓住理论的精髓,不断提高自己的思想觉悟和理论水平。 党员义务第二项和第三项属于政治方面的要求,要求党员贯彻执行党的路线和各项方针政策,带头参加改革开放和社会主义现代化建设,把党的事业和人民利益放在高于一切的地位,吃苦在前,享受在后,克己奉公,多作贡献。 党员义务的第四项和第五项,属于组织方面的要求,强调遵守纪律和国家法律,执行党的决议,服从组织分配,对党忠诚老实,维护党的团结和统一。 党员义务的第六、七、八项,属于道德、作风、品格,特别是与群众联系方面的要求。每一个党员都有做群众工作、向群众宣传党的主张、维护群众正当利益的责任。 党员要在道德作风方面作表率,发扬社会主义新风尚,提倡共产主义道德,同一切不健康的腐朽作风和腐败现象作斗争。 履行党员义务是行使党员权利的前提,行使党员权利是履行党员义务的保障。 党员在享有并正确行使党员权利的同时,也是在尽自己的义务,党员履行党员义务,同时也是在行使自己的权利。 2.《党章》第一章第四条规定了共产党员必须履行的八项权利: (一)参加党的有关会议,阅读党的有关文件,接受党的教育和培训。 (二)在党的会议上和党报党刊上,参加关于党的政策问题的讨论。 (三)对党的工作提出建议和倡议。 (四)在党的会议上有根据地批评党的任何组织和任何党员,向党负责地揭发、检举党的任何组织和任何党员违法乱纪的事实,要求处分违法乱纪的党员,要求罢免或撤换不称职的干部。 (五)行使表决权、选举权,有被选举权。 (六)在党组织讨论决定对党员的党纪处分或作出鉴定时,本人有权参加和进行申辩,其他党员可以为他作证和辩护。 (七)对党的决议和政策如有不同意见,在坚决执行的前提下,可以声明保留,并且可以把自己的意见向党的上级组织直至中央提出。 (八)向党的上级组织直至中央提出请求、申诉和控告,并要求有关组织给以负责的答复。 2.党员怎样对待义务和权利的关系? ①党员无论履行义务或行使权利,都为了更好地实现党的历史使命。 ②党员无论党龄长短,贡献大小,职位高低,都无一例外地享受同等权利,履行同样的义务。 ③由于党章对于党员义务和权利的规定的权威性和严肃性,因此党员必须无条件地服从。 ④党员的义务权利是辨证统一、相辅相成的。 四、《党章》规定的一般程序 1、个人自愿申请 2、党组织培养考察 3、填写入党志愿书 4、党支部大会表决通过 5、上级党组织(党总支、党委)批准 6、入党宣誓 7、预备期考察 8、转正 ①入 党 程 序 第一阶段:普通同学~入党积极分子 第二阶段:入党积极分子~重点发展对象 第三阶段:重点发展对象~预备党员 第四阶段:预备党员~正式党员 五、青年学生应该怎样努力,争取早日加入党组织? (一)认真学习党的理论知识和党章,真正认识党,了解党,明确努力方向,把入党目的建立在较为扎实的理论基础上,树立正确的入党动机,思想上行动上与党保持一致; (二)关心集体,关心党和国家大事,宣传党的方针政策,发挥健康向上的思想舆论导向作用,模范遵守校纪校规,努力把各级组织的要求落实到学习生活中去。 (三)刻苦钻研学业,勤奋读书,不断提高学习成绩,为营造良好的班风、学风、校风发挥骨干作用,配合各位任课教师组织好教学中各个环节工作,自觉成为刻苦学习的模范。 (四)密切联系群众,关心同学的学习、思想和生活困难,发挥党联系群众的桥梁纽带作用,把党的先进性体现在关心、带动群众中。 (五)服从党的需要,自觉把个人成才发展同祖国和人民的需要结合起来,积极投身于社会实践活动,到艰苦地方去锻炼成才,到祖国最需要的地方去服务,把自己的聪明才智贡献给人民,在服务祖国中促进发展,实现自身的价值。 六、小结 ①端正入党动机 ②按照党员标准严格要求自己 ③严格履行党章规定的入党手续 ●希望 大家团结在党旗下,努力学习、工作,争取早日加入党组织! 第四讲:《党员的修养和作用》 一、党员的修养的含义: “共产党员的党性修养是指党员立身行事的准则,是党员在政治思想、道德品质、组织纪律和知识技能等方面,按照党性原则所进行的自我教育、自我完善的过程。” 二、学生党员的含义: “学生党员”要在群众学生和团员学生中起到模范作用,时刻牢记党、国家和时代的要求。” 三、如何提高自身的修养,发挥先锋模范作用: 第一、要不断提高自己的学习能力。同时,还要注意个人文化修养的培养,扩大自己的知识面,丰富自己的文化底蕴。 第二、加强政治理论修养。确定人生目标。 ①是解决信仰问题。 ②是加强政治观教育。 ③是补充政治养分。 第三、加强思想道德修养,明确人生的坐标。 ①要树立“三观”。它影响着人们的思想境界,指导着人们的行为选择,关系着人们的价值判断。 ②要讲究诚信。因为“诚信既是一切道德赖以维系的前提,也是成大事者的基本行为准则”。 ③要有强烈的责任感。 责任是个人对工作、对群体、对社会所应尽义务的自觉态度,④要做到身心健康。健康是人生之本,是旺盛精力之源。 第四、向先进人物学习。 “榜样的力量是无穷的”。可以从英雄人物身上吸取高贵的品质,更要学习先进典型的精华。第五、积极率先垂范,认真践行优秀学生的责任和义务。 第六、学生党员要用自己的行动和工作影响、带动同学们共同前进。 ●希望: 1、在今后的学习中找准定位,刻苦学习,完成好党和国家交给的学习任务; 2、希望学员们在学风生活中发挥好主观能动性,起到模范作用; 3、希望学员们务必要做到牢记“八荣八耻”,在校风建设中发挥重要作用。 2009年5月30日 第五讲:科学发展观 一、关于科学发展观 1、科学发展观的前提—以经济建设为中心。 2、科学发展观的核心—以人为本。 3、科学发展观的重心—制度建设。 4、科学发展观的根本要求—“五个统筹”。 二、树立和落实科学发展观必须正确处理好以下几个关系 1、正确处理好改革、发展与稳定的关系。 2、正确处理好物质文明、政治文明与精神文明的关系。 3、正确处理好经济增长、经济发展与社会全面发展的关系。 三、学生应该如何实践科学发展观 1.是提高自身的学习能力 2.是提高自身管理能力 3.是提高自身服务能力 4.是提高自身沟通协调能力 5.是提高自身创新能力 四、学习科学发展观的基本内容 第一,科学发展观继承和发展了马克思列宁主义、毛泽东思想、邓小平理论和“三个代表”重要思想关于发展的理论,与马克思主义既一脉相承,又与时俱进,是马克思主义中国化的最新成果,是当代中国的马克思主义,是我们大学生必须认真学习的先进思想,尤其是学生党员和学生干部。 第二,科学发展观坚持了我国改革开放和现代化建设实践的宝贵经验,汲取和借鉴了世界各国的发展经验与当代发展理论的新成果,反映了实现我国经济社会又快又好发展的现实要求,以及当代世界发展进步的潮流 第三,科学发展观是实现全面实现小康社会宏伟目标的行动指南。 第六讲:树立正确的入党动机 入党动机:就是为什么要入党,这是每一名共产党员在入党前和入党后都要深深思考的问题。因为,共产党员不仅要在组织上入党,更重要的是要从思想上入党。正确的入党动机是思想上入党的根本问题,是激励我们入党的主观原因,它从根本上决定了每一个党员的素质和行为,是共产党员的世界观、人生观的集中反映。因此,树立正确的入党动机是十分重要的问题。 一、正确认识入党问题努力端正入党动机 二、树立正确的入党动机是争取入党的首要问题 1、入党动机的几种不正确现象 第一种,“入党可以为自己今后工作打好基础”。 第二种,“不写申请书就是不进步”。 第三种,受家庭和亲朋好友的推动才递交申请书。第四种,“入党是为了荣耀和满足”。 正确的入党动机应该是: 对社会主义祖国和人民充满热爱,信仰和坚持马克思主义科学真理,坚持“三个代表”重要思想,愿意全心全意为人民服务,在建设有中国特色社会主义、实现中华民族伟大复兴、服务祖国的过程中实现人生价值,积极学习科学文化知识和思想政治理论,不断从思想上丰富提高自己,坚定为共产主义奋斗的信念。 2、树立正确的入党动机的基本要求 加强马克思主义理论修养,以“三个代表”重要思想为指导,树立正确的世界观、人生观、价值观;主动投身于社会实践,在改造客观世界的同时改造主观世界;培养自律意识,提高批评与自我批评的自觉性。 3、学生党员坚持共产党员标准的特殊意义 第一,学生党员坚持共产党员标准关系到国家和民族的未来。 第二,坚持党员标准关系到党的性质。 第三,坚持党员标准关系到党组织的战斗力。 第四,坚持党员标准关系到党与群众的关系。 三、争取入党要正确把握与处理好十种关系 1.党员标准与做人标准的关系。 2、组织上入党与思想上入党的关系。 3、党组织培养同个人自我教育的关系。 4、政治骨干和学习骨干的关系。 5、党员与群众的关系。 6、入党动机与行为实践的关系。 7、提出入党申请与接受组织考验的关系。 8、入党前与入党后的关系。 9、新党员和“老党员”的关系。 10、带头与带领的关系。 四、用党员标准严格要求自己,以实际行动争取入党 用党员标准严格要求自己,实践“四个统一”,做社会主义事业的建设者和接班人。 坚持学习科学文化与加强思想修养的统一 坚持学习书本知识与投身社会实践的统一 坚持实现自身价值与服务祖国人民的统一 坚持树立远大理想与进行艰苦奋斗的统一 学生党员在日常学习、工作、生活中要做到: 学习理论,坚定信念; 牢记宗旨,勇挑重担; 艰苦朴素,勤奋好学; 严以律已,争做模范。 计算机二级C语言程序必背 1、/*输出9*9口诀。共9行9列,i控制行,j控制列。*/ #include { for(j=1;j<10;j++) { result=i*j; printf(“%d*%d=%-3d”,i,j,result);/*-3d表示左对齐,占3位*/ } printf(“n”);/*每一行后换行*/ } } 2、/*古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 兔子的规律为数列1,1,2,3,5,8,13,21....*/ main(){ long f1,f2;int i;f1=f2=1;for(i=1;i<=20;i++) { printf(“%12ld %12ld”,f1,f2); if(i%2==0)printf(“n”);/*控制输出,每行四个*/ f1=f1+f2;/*前两个月加起来赋值给第三个月*/ f2=f1+f2;/*前两个月加起来赋值给第三个月*/ } } 3、/*判断101-200之间有多少个素数,并输出所有素数及素数的个数。 程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。*/ #include “math.h” main(){ int m,i,k,h=0,leap=1; printf(“n”); for(m=101;m<=200;m++) { k=sqrt(m+1); for(i=2;i<=k;i++) if(m%i==0) {leap=0;break;} if(leap) /*内循环结束后,leap依然为1,则m是素数*/ {printf(“%-4d”,m);h++; if(h%10==0) printf(“n”); } leap=1; } printf(“nThe total is %d”,h);} 4、/*一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程 找出1000以内的所有完数。*/ main(){ static int k[10]; int i,j,n,s; for(j=2;j<1000;j++) { n=-1; s=j; for(i=1;i {if((j%i)==0) { n++; s=s-i; k[n]=i; } } if(s==0) {printf(“%d is a wanshu: ”,j); for(i=0;i printf(“%d,”,k[i]); printf(“%dn”,k[n]); } } } 5、/*下面程序的功能是将一个4×4的数组进行逆时针旋转90度后输出,要求原始数组的数据随机输入,新数组以4行4列的方式输出,请在空白处完善程序。*/ main(){ int a[4][4],b[4][4],i,j; /*a存放原始数组数据,b存放旋转后数组数据*/ printf(“input 16 numbers: ”);/*输入一组数据存放到数组a中,然后旋转存放到b数组中*/ for(i=0;i<4;i++) for(j=0;j<4;j++) { scanf(“%d”,&a[i][j]); b[3-j][i]=a[i][j]; } printf(“array b:n”); for(i=0;i<4;i++) { for(j=0;j<4;j++) printf(“%6d”,b[i][j]); printf(“n”); } } 6、/*编程打印直角杨辉三角形*/ main(){int i,j,a[6][6];for(i=0;i<=5;i++) {a[i][i]=1;a[i][0]=1;} for(i=2;i<=5;i++) for(j=1;j<=i-1;j++) a[i][j]=a[i-1][j]+a[i-1][j-1];for(i=0;i<=5;i++) {for(j=0;j<=i;j++) printf(“%4d”,a[i][j]); printf(“n”);} } 7、/*通过键盘输入3名学生4门课程的成绩,分别求每个学生的平均成绩和每门课程的平均成绩。 要求所有成绩均放入一个4行5列的数组中,输入时同一人数据间用空格,不同人用回车 其中最后一列和最后一行分别放每个学生的平均成绩、每门课程的平均成绩及班级总平均分。*/ #include int i,j; for(i=0;i<3;i++) for(j=0;j<4;j++) scanf(“%f”,&a[i][j]); for(i=0;i<3;i++) { sum1=0; for(j=0;j<4;j++) sum1+=a[i][j]; a[i][4]=sum1/4; } for(j=0;j<5;j++) { sum2=0; for(i=0;i<3;i++) sum2+=a[i][j]; a[3][j]=sum2/3; } for(i=0;i<4;i++) { for(j=0;j<5;j++) printf(“%6.2f”,a[i][j]); printf(“n”); } } 8、/*完善程序,实现将输入的字符串反序输出,如输入windows 输出swodniw。*/ #include int i,j,k; printf(“Enter a string: ”); scanf(“%s”,c); k=strlen(c); for(i=0,j=k-1;i { c1=c[i];c[i]=c[j];c[j]=c1;} printf(“%sn”,c); } 指针法: void invert(char *s){int i,j,k;char t;k=strlen(s);for(i=0,j=k-1;i { printf(“cannot open the filen”); exit(0); } printf(“input str:n”);gets(str); printf(“n%s”,str); fprintf(fp,“%s”,str);invert(str); printf(“n%s”,str);fprintf(fp,“n%s”,str); fclose(fp);} 9、/*下面程序的功能是从字符数组s中删除存放在c中的字符。*/ #include int j,k; printf(“nEnter a string: ”); gets(s); printf(“nEnter a character: ”); c=getchar(); for(j=k=0;s[j]!= ' ';j++) if(s[j]!=c) s[k++]=s[j]; s[k]= ' '; printf(“n%s”,s);} 10、/*编写一个void sort(int *x,int n)实现将x数组中的n个数据从大到小 排序。n及数组元素在主函数中输入。将结果显示在屏幕上并输出到文件p9_1.out中*/ #include if(x[j]>x[k])k=j; if(k!=i) { t=x[i]; x[i]=x[k]; x[k]=t; } } } void main(){FILE *fp; int *p,i,a[10]; fp=fopen(“p9_1.out”,“w”); p=a;printf(“Input 10 numbers:”);for(i=0;i<10;i++) scanf(“%d”,p++);p=a;sort(p,10);for(;p fprintf(fp,“%d ”,*p);} system(“pause”); fclose(fp);} 提高C语言程序运行稳定性的方法 一、前言 由于C语言的灵活性,用C语言开发出来的程序容易造成内存泄漏、运行异常、运行结果不可预期等程序质量问题,在用C语言开发程序的过程中,必须高度重视程序质量问题,应当把提高程序稳定性的方法加入到项目管理和开发过程中,最大限度地提高程序的稳定性,保证项目的成功开发。在这里总结多年来的C语言开发经验,拿出来共享以期在这方面能够得到更多的指教。 二、影响程序稳定性的因素 1、内存泄漏。造成内存泄漏的原因有: 1)、程序有多个出口,但不能保证在每一个出口能够完全释放掉所有的动态内存,如函数内有多个“return”,但没有在每一个“return”前释放掉在原已申请但必须释放的动态内存; 2)、对于“struct”数据结构,没有完全释放掉每一个指向动态内存的指针,如只释放指向“struct”数据结构指针没有释放“struct”体内的指针或某些指针被漏释放; 3)、对于用动态内存建立的链表在释放时没有一个一个结点去释放; 4)、一段动态内存空间原来只被一个指针引用,但在这个指针引用另外一段内存空间的时候,该段内存没有被释放; 5)、对于在函数内申请但必须在函数外释放的动态内存,在对该内存使用后忽略该动态内存的释放; 6)、用户强行退出程序,程序在退出前不能完全释放掉所有的动态内存; 7)、程序运行过程中发生了异常导致动态内存未被释放。 2、程序运行发生异常。造成异常产生的原因有: 1)、释放指针时该指针为空或是一个已被释放但释放后未被置空的指针; 2)、对于C库中的函数,如字符串操作函数,在调用该类函数时实参为空指针或者改指针没有指向可用的内存地址空间或者所指向的内存空间大小不足以用来实现当前的字符串操作; 3)、对于指向一个“struct”数据结构的指针,当指针为空时使用“struct”的分体数据; 4)、数组或指针发生越界操作; 5)、指针指向一个已被释放但释放后未被置空的指针,如一个全局变量的指针,在一个地方被释放后,但指针值未被置空,这时在另一个地方引用该指针的值时会发生异常; 6)、更改定义为常量的值; 7)、动态申请完一个内存后,未检查是否申请成功就调用了该指针; 8)、对于一块连续的内存块和“struct”数据结构在第一次使用时没有做初始化操作。 9)、在用非ASCII(如中文字符、Unicode)编码时,若使用char*来申请空间,在用C库中的字符串操作函数来操作,会因无法判断字符串结束位置而产生异常。 10)、指针类型强制转换时,当强制转换后指针指向的内存空间大于原来指针指向的内存空间时可能会出现异常(取决于堆或栈空间的结构和大小),如把“INT12*”强制转换成“INT32*”,应当尽量避免指针类型的强制转换; 11)、更改了数据结构,但代码没有相应更新或整个工程中相关文件没有做相应更新; 12)、申请的栈空间或堆空间超出了系统的容量限制; 13)、栈溢出,当函数中定义一个太大的数组时容易造成栈溢出,递归调用太深也容易造成栈举出; 14)、全局变量使用混乱,造成程序错乱; 16)、内存碎片太多,造成内存分配失败而导致程序异常,如建立一个太长的链表容易造成大量内存碎片; 17)、文件操作过于频繁(特别是写操作),系统应付不过来容易造成程序出现异常,这个在嵌入式系统中较常见。 三、内存泄漏预防措施 1、在代码审查时,检查函数体内的每一个“return”前是否有没有释放必须要释放的指针; 2、设计“struct”数据结构时,应当设计相应的释放“struct”指针的函数,并确保所有的“struct”体内的指针都被释放; 3、对于用动态内存建立的链表在释放时要一个一个结点去释放, 对于每一个链表也要有相应的链表内存管理函数,如链表的释放函数; 4、当一个指针变量要指向另一个动态内存地址时先检查一下该指针是否有指向另一个动态内存地址,如果有则应当考虑是否要先释放掉原先的指向的动态内存; 5、在调用一个函数时,对于函数的输出值要确认值的内存空间是否是在函数内部动态申请,如果是则应当考虑是适当的时候把它释放掉; 6、减少程序的出口的数目,最好是一个出口,在出口处理函数中确保释放所有的动态内存; 7、当用户强行退出时,要考虑在每一个退出点是否能够释放所有的动态内存; 8、释放掉一个指针所指的内存空间后,就立即把改指针置为空; 9、少用动态申请内存,能用数组代替的就用数组的形式; 10、尽量减少全局变量的使用,避免指针指向的混乱; 11、封装动态内存申请和释放的底层函数,便于检查内存泄漏问题; 12、把内存泄漏的检查方法放进设计代码中,便于发现内存泄漏。 四、程序运行异常预防措施 1、在释放指针前先检查指针是否为空; 2、当把指针作为参数传入C库函数中的参数时,先检查指针是否为空; 3、在函数体内,当要调用指针参数时,先判断该指针是否为空; 4、当要调用“struct”指针数据结构中的分体时要先判断该指针是否为空; 5、当做指针移动操作时要考虑指针是否会发生越界; 6、当一个函数体内可能会改变参数中的值时,要避免传入常量形式的值,在设计函数时要尽量避免试图去改变参数中的值; 7、动态申请完一个内存后要先检查是否申请成功; 8、对于一块连续的内存块和“struct”数据结构在第一次使用时要做初始化操作,如申请完内存后,记得用memset清空内存; 9、备案所有的全局变量,考虑全局变量对程序可能产生的影响,尽量少用全局变量。对于全局变量的定义最好使用“static”来申明,不让其它模块直接访问该全局变量,并且设计好相应的操作该全局变量的方法函数,在定义全局变量时要充分考虑好全局变量的初始化方法和程序结束时的处理方法,对于整个工程中的全局变量要进行登记管理,登记内容包括变量名、类型名、定义位置、使用范围、使用目的、初始化方法、程序结束时的处理方法及其它注意事项。 10、在用非ASCII(如中文字符、Unicode)编码时,要使用unsigned char*来申请空间,并记住申请空间大小,不要用C库中的字符串操作函数来操作。 11、记得申请足够的内存,比如,储存年份应该是5个空间而不是4个,记得保留‘ ’的空间; 12、在函数中最好不要定义占用内存太大的局部变量,否则容易造成栈溢出,对于较大内存的使用最好是使用堆内存空间的方法。由于栈溢出这种情况比较不常见,容易被人忽视,所以在发生因栈溢出而产生问题时往往不容易被发现原因所在; 13、尽量不频繁分配小块的内存; 14、在设计递归调用时要考虑递归调用可能的深度,防止出现栈溢出; 15、不要定义太多的局部变量,如果要定义一个数组类型的局部变量,数组不要太长,以防止出现栈溢出; 16、减少读写文件的次数,优化文件的读写方法。 指针是C/C++的精华,也是最难的部分。本书中规中矩地讲解了指针的概念、定义与初始化、操作等。 指针的灵活性可以把大量的工作化繁为易,前提是必须首很把足够繁的指针弄懂。听起来有点像绕口令,事实就是这样,你现在把难懂的东西弄懂了,日后可以把难事化简,大事化小。 从VB过来的人一定会熟悉“值传递”和“地址传递”这两个概念,实际上,“地址传递”这种说法正是为了弥补VB没有指针却有类似的需要才发明的。我认为C/C++程序员要想深入理解指针,首先要抛弃这个概念。在C/C++程序中,即使在函数调用中传递指针,也不能说“地址传递”,还应该说是值传递,只不过这次传递的值有点特殊,特殊在于借用这个值,可以找到其它值。就好像我给你一把钥匙一样,你通过钥匙可以间接获得更多,但是我给你的只不过是钥匙。 我前阵子曾写过一篇关于指针的文章,之所以写那篇文章,是因为看到一大堆初学者在论坛上提问。通过对他们提的问题的分析,我总结了几点。下面,首先就先引用我自己写的《关于指针》中的片段吧(完整的文章请到我的个人主页查找): 一、指针就是变量: 虽然申明指针的时候也提类型,如: char *p1; int *p2; float *p3; double *p4; .....但是,这只表示该指针指向某类型的数据,而不表示该指针的类型。说白了,指针都是一个类型:四字节无符号整数(将来的64位系统中可能有变化)。 二、指针的加减运算很特殊: p++、p--之类的运算并不是让p这个“四字节无符号整数”加一或减一,而是让它指向下一个或上一个存储单元,它实际加减的值就是它所指类型的值的size。 比如: char *型指针,每次加减的改变量都是1; float *型的指针,每次加减的改变量都是4; void *型指针无法加减。 还要注意的是:指针不能相加,指针相减的差为int型。 正是因为指针有着不同于其它变量的运算方式,所以,在任何时候用到指针都必须明确“指针的类型”(即指针所指的变量的类型)。这就不难理解为什么函数声明时必须用“int abc(char *p)”而调用的时候却成了“a = abc(p);”这样的形式了。 三、用指针做参数传递的是指针值,不是指针本身: 要理解参数传递,首先必须把“形参”与“实参”弄明白。 函数A在调用函数B时,如果要传递一个参数C,实际是在函数B中重新建立一个变量C,并将函数A中的C值传入其中,于是函数B就可以使用这个值了,在函数B中,无论有没有修改这个C值,对于函数A中的C都没有影响。函数B结束时,会将所有内存收回,局部变量C被销毁,函数B对变量C所做的一切修改都将被抛弃。 以上示例中,函数A中的变量C称为“实参”,函数B中的变量C被称为“形参”,调用函数时,会在B函数体内建立一个形参,该形参的值与实参的值是相同的,但是形参的改变不影响实参,函数结束时,形参被销毁,实参依然没有发生变化。 指针也是一个变量,所以它也符合以上的规定,但是,指针存放的不仅仅是一个值,而是一个内存地址。B函数对这个地址进行了改动,改动的并不是形参,而是形参所指的内存。由于形参的值与实参的值完全相同,所以,实参所指的内存也被修改。函数结束时,虽然这个形参会被销毁,指针的变化无法影响实参,但此前对它所指的内存的修改会持续有效。所以,把指针作为参数可以在被调函数(B)中改变主调函数(A)中的变量,好像形参影响了实参一样。 注意:是“好像”。在这过程中,函数B影响的不是参数,而是内存。 下面再来看刚才的例子:“int abc(char *p)”和“a = abc(p);”。为什么申请中要用*号,因为函数必须知道这是指针;为什么调用时不加*号,因为传递的是“指针值”,而不是“指针所指内存的值”。 四、指向指针的指针: 正因为指针也是一个变量,它一样要尊守形参与实参的规定。所以,虽然指针做参数可以将函数内对变量的修改带到函数外,但是,函数体内对指针本身作任何修都将被丢弃。如果除了对变量的修改带到函数外,还要让指针本身被修改而且要影响函数外,那么,被调函数就应该知道“该指针所在的内存地址”。这时,指针不再是指针,而是“普通变量”。作为参数传递的不是这个“普通变量”,而是指向这个“普通变量”的指针。即“指向指针的指针”。 如果p是一个指向指针的指针,那么*p就是一个指针,我们不妨就把它看成q。要访问q指针所指的内存,只要*q就是了。用初中数学的“等量代换”一换就知道,*q就是**p。 五、指针数组。 之所以要把“指针数组”单独提出来,是因为数组本身就与指针有着千丝万缕的关系。即使你不想用指针,只要你使用了数组,实际就在与指针打交道了。 只要理解了指针本身就是变量,就不难理解“指针数组”,我们可以暂且把它当成普通数组来处理,a[0]、a[1]、a[2]……就是数组的元素,只是,a[0]是一个指针,a[1]、a[2]也是一个指针。那a呢?当然也是指针,但这是两码事。你可以完全无视a的存在,只去管a[0]等元素。*a[0]与*p没有什么本质的区别。 还有一个东西不得不提一下,它比较重要: 指针的定义有两个可取的方式,它们各有优缺点:“int *p;”和“int* p;”是完全等价的,后者的好处是让人体会到p是一个“指向int的”指针,前者会让人误解为*p是一个int型变量(这里没有定义int型变量);但是前者的好处是不会产生混淆,如“int *p, *q;”让人一眼就看出定义了两个指针,而“int* p,q;”会让人误解成定义了两个指针(实际上q不是指针)。 C是一个结构化语言,如谭老爷子所说:它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制),而对于C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。 所以C与C++的最大区别在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中 ”,而就语言本身而言,在C中更多的是算法的概念。第二篇:c语言版背包问题
第三篇:红绿灯C语言程序
第四篇:十大C语言经典程序
第五篇:C语言程序稳定性