西南交大c语言实验(共10篇)
西南交大c语言实验 篇1
实验十 指针应用 ●实验目的
掌握指针的概念,会定义和使用指针变量; 学会使用数组的指针和指向数组的指针变量; 学会使用字符串的指针和指向字符串的指针变量; 学会使用指向函数的指针变量;
了解指向指针的指针的概念及其使用方法。●实验步骤
进入编程环境;
按照题目要求编写程序,自行调试使程序可以正确运行,按照实验指导教师的要求检查。●实验内容
1.输入N个英文单词,建立字符串数组,按字典顺序输出这些英文单词。1.要求用指针。自己编写的源程序:
#include“stdafx.h” #include
int main(){
char word[50][50];int num = 0;printf(“请输入单词数量:”);scanf(“%d”, &num);printf(“请输入%d个单词:”, num);for(int i = 0;i < num;i++){ } char temp[50];for(int i = 0;i < num;i++){
} for(int i = 0;i < 5;i++){ } printf(“%s ”, word[i]);for(int j = 0;j < i;j++){
} if(strcmp(word[i], word[j])< 0){
}
strcpy(temp, word[j]);strcpy(word[j], word[i]);strcpy(word[i], temp);scanf(“%s”, word[i]);
} printf(“n”);return 0;
2.输入一个字符串,不另开辟字符串存储空间,实现字符串逆序存储并输出。自己编写的源程序:
#include“stdafx.h” #include
int main(){
} char str[50];printf(“请输入原字符串:”);scanf(“%s”, str);for(int i = strlen(str)11-i] = temp;
3.任意输入5个学生姓名的拼音,然后存入一个2维的字符数组中,按照字符表先后顺序输出这5个同学的姓名。自己编写的源程序:
#include“stdafx.h” #include
int main(){
char name[5][50];printf(“请输入5个姓名的拼音:”);for(int i = 0;i < 5;i++){
} } scanf(“%s”, name[i]);char temp[50];for(int i = 0;i < 5;i++){
} for(int i = 0;i < 5;i++){ } printf(“n”);return 0;printf(“%s ”, name[i]);for(int j = 0;j < i;j++){
} if(strcmp(name[i], name[j])< 0){
}
strcpy(temp, name[j]);strcpy(name[j], name[i]);strcpy(name[i], temp);
4.定义一个实型数组存入一组无序的实数,用一个函数实现对数组所有元素的升序排序,函数的参数和返回值皆为指针,在主函数中输出排序后的数组,考虑如果不使用指针如何解决该问题,哪一种方法更方便。自己编写的源程序:
#include“stdafx.h” #include
double* sort(doublenum[]);
int main(){
double num[5] = { 0 };printf(“请输入5个实数:”);for(int i = 0;i < 5;i++){ } sort(num);printf(“原数组升序排列结果为:”);for(int i = 0;i < 5;i++){ scanf(“%lf”, &num[i]);
} } printf(“%lf ”, num[i]);printf(“n”);return 0;double* sort(doublenum[]){
} for(int i = 0;i < 5;i++){
} returnnum;for(int j = 0;j < i;j++){
} if(num[i] } double temp = num[j];num[j] = num[i];num[i] = temp; 1 实验教学的目的及要求 1.1 实验教学目的。 上机属于实践环节, 试验教学的主要任务是从应用和实践的角度出发, 使学生通过上机操作掌握本课程所讲述的程序设计思想, 并能独立编写C应用程序, 为提高学生的实际编程能力打下基础。 1.2 实验要求。 1.2.1上机做好充分的准备。上机前没有充分的准备, 会白白浪费上机时间;如果抄书本上的或别人的程序, 会一无所获。上机前写好自己的程序, 并仔细检查, 想想可能出现的情况, 带着问题上机, 这样上机效用就高了。1.2.2上机调试运行程序。考虑可能的各种情况, 分析程序, 调试程序, 看是否是预期的结果。学会独立思考, 勤于分析, 通过自己实践得到的经验用起来更加得心应手。1.2.3整理上机实验结果, 写出实验报告。实验结束后, 要整理实验结果并认真分析和总结, 根据实验要求写出实验报告, 用书面形式加深对本次实验涉及到的相关知识的理解和应用。 2 在实验教学中遇到的实际问题及解决方法 C语言的最大特点是:功能强、使用方便灵活。C编译的程序对语法检查并不象其它高级语言那么严格, 这就给编程人员留下“灵活的余地”, 但还是由于这个“灵活”给程序的调试带来了许多不便, 尤其对初学C语言的人来说, 经常会出一些连自己都不知道错在哪里的错误。常见典型错误有: 2.1 书写标识符时, 忽略了大小写字母的区别。 编译程序把a和A认为是两个不同的变量名, 而显示出错信息。C认为大写字母和小写字母是两个不同的字符。习惯上, 符号常量名用大写, 变量名用小写表示, 以增加可读性。 2.2 忽略了“=”与“==”的区别。 在许多高级语言中, 用“=”符号作为关系运算符“等于”。如在BASIC程序中可以写:if (a=3) then… 但C语言中, “=”是赋值运算符, “==”是关系运算符。如:if (a==3) a=b; 前者是进行比较, a是否和3相等, 后者表示如果a和3相等, 把b值赋给a。由于习惯问题, 初学者往往会犯这样的错误。 2.3 多加分号。 本是如果3能整除a, 则i加1。但由于if (a%3==0) 后多加了分号, 则if语句到此结束, 程序将执行i++语句, 不论3是否整除a, i都将自动加1, 这就从根本上歪曲了程序设计的初衷。 2.4 输入数据的方式与要求不符。 2.4.1 scanf ("%d%d", &a, &b) ; 输入时, 不能用逗号作两个数据间的分隔符, 如下面输入不合法: 3, 4 输入数据时, 在两个数据之间以一个或多个空格间隔, 也可用回车键, 跳格键tab。 2.4.2 scanf ("%d, %d", &a, &b) ; C规定:如果在"格式控制"字符串中除了格式说明以外还有其它字符, 则在输入数据时应输入与这些字符相同的字符。下面输入是合法的: 3, 4 此时不用逗号而用空格或其它字符是不对的。 3 4 3:4 2.5 输入输出的数据类型与所用格式说明符不一致。例如, a已定义为整型, b定义为实型 编译时不会给出错误提示信息, 但运行结果将与原意不符。这种错误只有在上机调试的时候才会发现, 如果没有亲手调试过这样的程序, 是不会发现的, 会大大影响同学们对各种数据类型之间区别的理解, 尤其需要注意。 以上这些错误都是我们在实验教学中经常遇到的, 其中有些是不太明显的语法错误, 软件不会给出错误提示, 但是编译链接的时候却会出错, 执行的结果也不正确, 还有的是因为前面的数据定义错误, 造成了后面语句的出错, 使得同学们找不到到底是哪里错了。这些问题, 都是需要同学们熟练掌握编程规范和深入学习较难的章节后才会解决的。 学习C语言始终要记住“千金难买回头看”。“千金难买回头看”是学习知识的重要方法, 就是说, 学习后面的知识, 不要忘了回头弄清遗留下的问题和加深理解前面的知识, 这是学生最不易做到的, 然而却又是最重要的。比如:在C语言中最典型的是关于结构化程序设计思想, 不管是哪种教材, 一开始就强调这种方法, 这时也许你不能充分体会, 但是学到函数时, 再回过头来仔细体会, 温故知新, 理解它就没有那么难了。学习C语言就是要经过几个反复, 才能前后贯穿, 积累应该掌握的C语言相关知识。 3 对于今后实验教学的几点建议 3.1 启发式教学。 为培养学生逻辑思维和创新能力, 在教学过程中, 教师应遵循启发式教学原则, 通过各种教学方式和手段激发学生的学习欲望, 积极投入到学习活动中, 积极思考, 发现问题, 提出问题, 并逐步解决问题。例如, 在讲解程序设计举例时, 不只是简单地给出程序清单, 而是从分析问题入手, 继而找出解决问题的方法, 再给出算法, 最后编写出完整的程序, 而在这一全过程中, 最关键的是每一步都采用与学生一起探讨的方式, 让学生在启发下思考, 在思考中解决问题, 从而掌握独立分析问题、解决问题的方法。 3.2 积极使用现代化教学手段。 结合传统的“粉笔+黑板”的教学模式, 大量采用多媒体教学, 大大提高了课程教学效果。目前一般为教师提供了两种多媒体教学环境:一种是配有音响和大屏幕投影的多媒体教室;第二种是装有多媒体教学软件的计算机机房。 3.3 网络教学。 为充分发挥校园网的优势, 培养学生自主学习的能力, 可以把课程教学大纲、电子教案、教师精心制作的教学课件等教学资源放在网上供学生自学, 并利用电子邮件、学院网站的交流园地与学生进行课外交流, 为学生答疑解惑, 为学生提供了更为广泛的沟通渠道与环境。 3.4 开放的实验环境。 学校机房应定时向学生开放, 并安排指导教师给予一定的指导, 不仅增加了学生上机实践的时间, 同时也为培养学生较好的自主学习习惯打下了良好的基础。 3.5 实践教学形式多样。 除传统的课堂实验外, 还要开展课程设计、典型程序分析与设计等实践环节, 并要求教师组织C程序设计兴趣小组, 组织C程序设计大赛, 组织学生在学习C语言的编程基础之上学习高级编程语言, 参与科研开发等。 综上所述, 实验教学是提出问题、分析问题、解决问题的过程, 我们要从中了解和把握学生的个性特点、学习情况和学习能力等方面的差异, 从学生的实际出发, 针对不同学生的不同情况组织教学, 使同学们能克服畏难、厌学的情绪, 上课能专心听讲, 提前做好预习与上机调试, 只有做到这些, 才能让同学们真正体会到其实C语言并不难学。 摘要:C语言功能丰富、使用灵活、可移植性好、既具有高级语言的优点, 又具有低级语言的许多特点。在实践教学中, 主要内容包括基础知识、四种结构的程序设计、函数与数组的应用和一些简单的算法。主要结合实验教学中遇到的一些问题及实例, 进一步阐述了如何学好C语言的核心内容。 关键词:高级语言,程序设计,算法,实验教学 参考文献 [1]谭浩强.C程序设计[M].北京:清华大学出版社, 2001. [2]骆健, 何光明.C语言学·练·考[M].北京:清华大学出版社, 2004. [3]谭浩强, 张基温, 唐永炎.C语言程序设计教程[M].北京:高等教育出版社, 1992. 关键词:C语言;实验;教学方法 中图分类号:G642文献标识码:A文章编号:1009-3044(2007)12-21728-02 Discussion of the Experiment Teaching Method in C-programming LIU Han-ying (Department of Electronic and Computer, Guilin University of Technology, Guilin 541004, China) Abstract:C-programming experiment is important part of C-programming teaching. As the result of each kind of reason, there are some disadvantages in the experiment teaching of C-programming: the experiment passing rate of national examination is low; the teacher can't instruct because of so many students; the students written down the programs without preparation. The students don't know how to do with the errors. With some teaching examples of the C-programming experiment, this paper propose some teaching methods, The experiences show that the proposals stimulated the students' enthusiasms of studying, and improved the quality of experiment teaching. Key words:C language; experiment; teaching method 《C语言程序设计》(以下称C语言)是计算机及相关专业的一门专业基础课,是学习其他专业课程如《C++与面向对象程序设计》、《JAVA》、《数据结构》、《数据压缩》、《计算机图形学》的基础,C语言实验是C语言教学中的一个重要环节,常常占总学时的2/5以上。C语言实验教学有利于增加学生对理论知识的理解,调动学生的学习主动性,提高学生思维能力和动手能力。然而,由于各方面的原因,C语言实验教学中存在一些问题:全国等级考试实验通过率不是很高;C语言实验往往是大班上课,学生人数较多,老师指导不过来;学生课前没有预习,上机时直接输入参考程序,实验成了打字练习;英语水平不高,对错误提示无从下手;部分学生以为编译通过就是调试成功,不会使用调试工具。笔者近年来多次承担C语言实验教学任务,总结了一些教学方法和经验,下面是笔 者对C语言实验教学方法的探讨。 1 思想上重視实验环节,提高学习兴趣 由于C语言教学往往是大班教学,在考核方式上常常采用的是理论考试,部分学生不重视实验课,课前不预习,上机时就直接输入指导书上的参考程序,实验效果很差。因此,为了提高实验教学的效果,应将上机考核作为C语言考核的重要组成部分,让学生从思想上重视实验环节,做好课前预习。同时,笔者把一些用C语言程序实现的小游戏或画的图形图像演示给学生看,激发学生的学习兴趣,取得了较好的效果。 2 编写适宜的实验指导书 目前,有许多与C语言课程配套的实验指导书,这些指导书常常配有答案[1]。学生拿到指导书后,看有答案,常常不自己思考就将书上的程序录入进去,编译出错时不是根据错误提示查找错误原因,而是从头到尾地与书上程序比对,改正录入错误,遇到书上有错,就无从下手。整个上机练习成了打字练习。笔者认为,一本适宜的实验指导书应具备以下几点: (1)实验指导书要与理论知识配套 C语言实验教学的目的是通过实验,让学生增强对理论知识的理解,学会自己编写、调试程序。因此,实验指导书的内容要与理论教学配套,有针对性地设置实验内容,且实验时间安排要合理(略晚于理论教学),参考程序与实验指导书分离。 (2)实验内容难度适宜 由于种种原因,学生能力上有很大差异,为此,在编写实验指导书时要兼顾各个能力层次的学生,设置基础题、中等难度题和较难题多个层次。笔者从历年的考试题中抽取一些具有代表性的改错题作为基础题练习;在此基础上,设置一些程序设计题让学生编写、调试;对学有余力的学生,可设置一些难度较大的题目,组成小组讨论。 3 养成良好的编程习惯 3.1 注意编程思想 算法是程序设计的精髓,语言只是表示形式,没有正确的计算机算法,就无法用计算机正确地解决问题。对于每一道题目,首先找出解决问题的算法,画出盒图,最后才是编写程序,这样可以减少出错的可能性。 3.2 使用有意义的标识符 C语言教材常常使用i,j,k,a,b,c几个字符作为标识符,很多学生在学习C++时觉得很难,其中一点就是C++中教材中的标识符较长。笔者建议学生,在编写程序时尽量使用一些有意义的字符串作为标识符,尽量不要用l作为标识符,提高程序的可读性,如输入一系列学生成绩时使用的是score1,score2……,而不是a1,a2……。 3.3 养成良好的程序录入习惯 有的学生在录入程序时不注意书写格式,在遇到错误时常常不易查找。笔者要求学生使用锯齿形的书写格式,在录入大括号、小括号、引号等时都要做到成对录入,有较地提高了程序录入的准确率。 4 改革实验辅导方法 4.1 网络教学软件的使用 传统的实验课是老师先布置实验习题,学生练习,遇到问题举手,老师解答。然而,C语言实验往往是大班教学,学生人数较多,许多问题十分相似,老师常常为同一问题解释多次,指导不过来。针对这一问题,笔者使用了红蜘蛛软件[3],这个软件可以在局域网上实现多媒体信息的教学广播,是一款实现在电子教室、多媒体网络教室或者电脑教室中进行多媒体网络教学的非常好的软件产品,集电脑教室的同步教学、控制、管理、音视频广播、网络考试等功能于一体,并同时实现屏幕监视和远程控制等网络管理的目的。该软件是专门针对电脑教学和培训网络开发,可以非常方便地完成电脑教学任务,包括教师演示、学生示范、屏幕监视、遥控辅导、屏幕录制、屏幕回放、网络考试、网上语音广播、两人对讲和多方讨论、联机讨论、同步文件传输、提交作业、远程命令、获取远端信息、电子教鞭、电子黑板与白板、网上消息、电子举手、锁定学生机的键盘和鼠标、网络唤醒、远程关机和重启、学生机同步升级服务、远程安装、倒计时、班级和学生管理等。笔者通过文件传输功能,将实验题目(如基础改错题)发放给学生,让学生练习,然后通过提交作业功能抽一名学生的作业来讲解。 4.2 总结错误 针对一些学生英语水平不高,对错误提示无从下手的现状,笔者总结了上机时经常遇到的错误,如语法错误、逻辑错误等,罗列给学生,并从一些试题中挑选一些适宜的改错题传给学生练习,学生不用从头到尾地录入程序,提高了实验效率。 4.3 调试方法的使用 調试的目标是寻找软件错误的原因并改正错误[2],一般有以下几种调试途径: 4.3.1 蛮干法 上机时指导学生查找错误,学习使用程序调试工具,跟踪程序的执行过程,发现较隐蔽的错误,提高学生动手解决问题的能力。如学生编写如下程序计算 (用公式 )时,发现结果不对,笔者指导学生使用调试工具观察变量pi和t的值,很快找到了错误原因,同时学生也练习了调试工具的使用方法。 #include #include void main() {float s,n,t,pi; t=1;pi=0;n=1;s=1; while(fabs(t)<1e-6) {pi=pi+t; n=n+2; s=-s; t=s/n;} pi=pi*4; printf("pi=%fn",pi);} 4.3.2 回溯法 从发现症状的地方开始,人工沿程序的控制流往回追踪分析源程序代码,直到找出错误原因为止。如上例中,用go to cursor执行到pi=pi*4,发现pi的值不对,则往回分析代码,很快可以查出是循环条件不对。 4.3.3 对分查找法 对分查找法的基本思路是,如果已经知道每个变量在程序中若干个关键点的正确值,可以用赋值语句或输入语句在程序中关键点附近“注入”这些变量的正确值,然后运行程序,并检查所得到的输出。如果输出结果是正确的,则错误原因在程序的前半部分;反之,错误原因在程序的后半部分。 4.4 让学生自己调试程序 由于学生多,问题多,为了快速地解决问题,有时老师会帮学生调试程序来提高效率。笔者认为,老师应指导学生调试程序,而不是帮学生调试程序,学生只有自己动手,动脑,才能真正学会调试方法。同时笔者鼓励学生之间互相帮助和交流,培养团结协作的精神,学生在帮助同学的同时自己也得到学习。 5 结束语 以上是笔者对《C语言程序设计》实验教学方法进行的探讨,通过实践发现,这些方法有助于激发学生学习自觉性和主动性,提高学生分析问题和解决问题的能力,达到提高教学质量的目的。 参考文献: [1]谭浩强.C语言程序设计题解与上机指导[M].北京:清华大学出版社,2005. [2]张海藩.软件工程导论[M].北京:清华大学出版社,2003.168. [3]http://www.forclass.com/. 实验名称 ____ C程序的运行环境和运行C程序的方法_学期日期 同组人李江涛指导老师_杨雪松___________成绩___________------------------------- 【实验目的】: 1.了解所用的计算机系统的基本操作方法,学会独立使用该系统 2.了解在该系统上如何编辑、编译、连接和运行一个C程序 3.通过运行简单的C程序,初步了解C源程序的特点 【实验原理及相关知识】:(此处请简短概述一下就可以) 【实验设备】:(正确填写每次实验所用的设备型号) 【实验内容】:(此外按实指导书的要求写自己设计的东西) 【实验过程】: 【实验总结】:(此处写实验完成情况及对相关结果的分析总结) 【实验心得及其他】: 请各位同学认真添写实验报告,不要抄袭,尽量用自己的语言,自己的想法完成实验及 实验六 函数 掌握函数实参与形参的对应关系以及“值传递”的方式; 3 掌握函数递归调用的方法; 二 实验内容 编写两个函数,分别求两个正整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果,两个正整数由键盘输入。 【提示】设有两个正整数m和n ⑴ 实验四介绍了求最大公约数的算法,也可以用递归的方法求最大公约数。设hcf(int m,int n)是用来求m和n的最大公约数h函数,k=m%n,则: hcf(n,k)hnk0k0⑵ 若最大公约数为h,则最小公倍数为:m*n/h。 实验时,完成以下两个函数的定义,使之和主程序构成完整的程序,实现题目的要求。#include 完整程序如下: #include int lcd(int m,int n,int h)/* 求最小公倍数的函数 */ { return(m*n/h);} main(){ int m,n,h,l;printf(“请输入两个正整数m、n:”);scanf(“%d,%d”,&m,&n);h=hcf(m,n);printf(“%d和%d的最大公约数是:%dn”,m,n,h);l=lcd(m,n,h);printf(“%d和%d的最小公倍数是:%dn”,m,n,l);} 运行结果如下图: 编写求n!的函数f(int n),在主函数中输入两个整数m、n,然后调用函数求: Cnmm!n!(m-n)!【注意】函数f的类型应用long或double。 程序如下: #include void main(){ long m,n,c;printf(“请输入两个整数”); scanf(“%d,%d”,&m,&n);c=f(c);m=m*(m-1)n=n*(n-1)c=m/(n*c)printf(“组合为%dn”,c); } 有一个字符串,输入一个字符,编写函数dstr将输入的指定字符从字符串中删去。#include 完整程序如下: #include 1、实验报告要求使用本校实验报告专用纸张。不允许使用从作业本上撕下来的纸张。 2、实验报告要求字迹清楚,书写认真,内容完整,不允许打印或复印。 3、为保证同学们在实验后达到预定教学效果,不允许抄袭实验报告,不得弄虚作假。 4、实验报告参考课本第13章格式和要求来写。对应各项填入实验报告纸对应的位置。 5、实验报告一般应该有以下各项:①班级②学号③姓名④实验日期⑤实验报告名称(如果没有名称,则用“上机实验1”代替)⑥实验目的要求⑦实验内容(编程题除程序源代码之外,还必须有程序运行时的键盘输入数据和对应显示输出的记录,否则会影响成绩)⑧回答指定的思考问题(没有第⑧项会影响成绩)⑨如果同学们认为对学习有帮助,可以在最后附上实验心得体会,如实验中遇到的问题,问题的解决方法,尚未解决的问题等等,这些会有利于教师今后的教学(第⑨项与实验报告成绩无关)。 6、出现实验报告字迹潦草、内容不全、伪造实验数据、抄袭实验报告、问题回答错误等情况时,教师会酌情扣除实验报告成绩。 靳天飞 CUDA是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。开发人员可以使用C语言来为CUDA架构编写程序,所编写出的程序可以在支持CUDA的处理器上以超高性能运行[1]。 目前,全球已经有超过250所大学开设了CUDA编程和GPU计算的课程,支持CUDA的GPU销量已逾1亿,基于CUDA开发的应用程序从视频与音频处理和物理效果模拟到石油天然气勘探、产品设计、医学成像以及科学研究,涵盖了各个领域[2,3]。为了促进CUDA技术的发展,NVIDIA公司于2009年底授予中国科学院过程工程研究所和清华大学CUDA卓越中心的称号,以表彰他们在中国推广CUDA和GPU计算以及利用GPU在高性能计算领域做出的突出贡献,在此之前,CUDA卓越中心已经在哈佛大学、剑桥大学等5所学府设立。 鉴于GPU并行计算的应用前景,在2009年开始在C语言教学中引入CUDA平台技术开发,主要包括CUDA平台的C开发环境,并行程序开发等,让学生通过程序设计对比GPU程序运行与传统CPU运行的效率对比,对并行加速有了直观的印象,激发了学生的学习兴趣,实验教学取得了良好的效果。 2 基于GPU的CUDA软硬件环境 2.1 硬件 GPU称之为图像处理器,在图像处理方面发挥了重要的作用,其本质是一个流处理器,内部有很多处理单元,处理单元并行工作,采用超流水线的方式进行工作,这种体系架构决定了它在并行计算上的优势。另外GPU实际采用的是将一根总线与多个处理单元进行连接,使得对单指令流多数据流有很好的处理能力。根据它采用单一控制总线的结构,必须协调各个处理核心的工作,尽量让各个处理核心的工作协调,避免交叉指令在程序中出现,同时,由于CUDA架构将自己的任务都集中在数据的计算方面,要协调数据的输入与输出,尽量减小它和内存之间数据的交换,当然最好是能尽可能地使用纹理存储器,这会使存取的速度比起一般的存取速度要快很多。只有综合利用GPU的这些特点才能使并行计算的速度有一个很好的提升。 CUDA支持的GPU(CUDA-enabled GPU)包括NVIDIA公司的Geforce、Quadro和Tesla 3个产品线,如表1所示。其中,Geforce和Quadro系列显示芯片可以直接插入普通PCI-Express×16插槽中,最大理论带宽为8 GB/s,为了便于将CPU与GPU进行性能比较,选用丽台公司PX8800GT显卡,显卡采用Geforce8800GT显示芯片。该芯片采用G92显示核心,有112个流处理器,内核时钟为600 MHz,内存带宽为57.6 GB/s,支持并行数据高速缓存(parallel data cache)。本文中的实验采用的是GeForce 9600 GT。 2.2 软件 在CUDA的软件层面,核心是NVIDIA编译器nvcc.exe。CUDA程序是GPU和CPU的混合编码,其程序文件包括.cu和.cpp,且程序中混合着C语言函数和CUDA语言函数。程序首先通过C编译器将GPU与CPU的代码分离,GPU代码被编译成能交给GPU计算的代码,而CPU代码编译成标准CPU机器码。因此,一个完整的CUDA软件开发环境需要有2个编译器:面向CPU的C编译器和面向GPU的编译器nvcc.exe。CUDA可以支持多种运行在Windows XP和Linux操作系统下的编译系统。考虑到通用性,在测试中采用Microsoft Visual Studio 2008,其C编译器为cl.exe[4]。CUDA软件架构如图1所示。 3 实例 对定积分计算进行编程,基本思想为:分配处理核心,每个核心完成一个梯形的面积计算工作,待最后的所有任务都计算完成之后,将所有的和进行相加,得到的将是所求的积分面积。采用Block、Thread数量大小为个,分别设立256个共享存储器单元和全局存储单元,以存放每个Thread的计算之和及每个Block之和,最终将各Block之和返回host端进行最后的加总。 以为对象测试,采用的是分段积分方式进行测试,代码如下: 测试结果如图2所示。 测试结果证实GPU在这个策略下,相对于CPU,其并行处理积分问题时快上20倍左右,实验用的处理器共有4个核心单元,其中采用的是多核心,超流水线的处理方式进行处理。 在这个架构下,加速主要是因为线程的扩充、处理核心的增加,使得在计算和时,速度得到较大的提高。如果让GPU先计算前面m*thread个区间的积分和,得到(m-1)×thread的计算和与得到的m×1个和相并,继续计算,一直到计算完毕,这样速度会有更大的提高。 4 结语 GPU并行计算是结合硬件与软件共同完成的,这种并行处理单元硬件设计采用的是超流水线的设计方式,是未来处理芯片的发展方向,具有很广的应用前景。就目前看来,这种芯片适合在计算机群中进行应用,适合大型的网络服务器的需要。在网页的构造以及搜索引擎方面也有非常大的应用前景,同时,在数值计算方面也影响不小,如果采用这项技术进行并行搜索或计算,将大大节省计算时间,提高效率。 摘要:C语言在本科信息技术教学中具有重要的地位,随着GPU性能的增强,以C语言为核心的CUDA具有广阔的应用前景。在C语言实验中引入CUDA开发平台的训练,具有重要的意义。 关键词:C程序,图形处理器,CUDA架构 参考文献 [1]http://www.nvidia.cn/object/personal_supercomputing_cn.html. [2]董廷星,王龙,迟学斌.二维扩散方程的GPU加速[J].计算机工程与科学,2009,31(11):121-123 [3]吴强,杨灿群,葛振,陈娟.使用GPU加速分子动力学模拟中的非绑定力计算[J].计算机工程与科学,2009,31(A1):46-49. 关键词 C语言 软件编程 实验探讨 中图分类号:TP3 文献标识码:A 1 C语言的概述 在各种计算机编程语言中,C语言属于一门高级语言,它是一切计算机语言的基础,拥有高级语言和低级语言的特点,灵活方便,简洁紧凑;而且它的语法限制不严格,程序员在设计时程序书写自由。不仅能够编写系统软件,同时还可以编写应用软件,能够适应于多种操作系统,应用广泛,可移植性强。总之,C语言对于信息技术的发展具有十分重要的作用和价值。 2基于C语言的计算机软件编程实验研究 2.1C语言的编程技巧 (1)灵活运用指针 在C语言编程的时候,指针是一种特殊类型的变量,它能够帮助程序员有效的表达和解决程序设计过程中遇到的复杂问题,熟练掌握指针是必要的。指针具有三要素:指针名以及指针类型和值。在编程时,指针和一般变量名相同,但是在类型以及值上具有区别,另外,指针不仅能够被用于表示数组,还可以被作为函数的参数返回值。 (2)C 语言的特有函数 在C语言编程的时候,有时需要用到一些特有函数。函数都具有一定的功能,同时函数名也反映了该函数的功能。在进行函数定义时,程序员需要把函数的名字、返回值类型以及参数名等各项都进行定义。另外,因为库函数是由C 编译系统提供的,这些函数均是系统首先定义好的,在程序调用的时候,程序员只需利用“#include 指令”把与之相关的头文件包含到所用文件中即可。 (3)算法技巧 在程序设计的过程中,算法是程序的灵魂,因此,掌握一定的算法技巧是必不可少的。通常情况下,算法不仅可以用自然语言表示,有的时候也利用流程图表示。需要注意的是,利用流程图表示算法时,程序设计员必须熟练掌握常用的流程图符号。且“数学乃是计算机之母”,牢固的数学知识同样能够提升编程效率。 (4)位运算以及文件知识 相比其他计算机高级语言的运算方法,位运算作为C 语言的重要特色,具有独特性和唯一性。位运算是以二进制位为对象,然后结合相关程序要求进行各种运算。文件包含有数据文件以及程序文件,是计算机不可缺少的,程序设计员在进行编程时,需要把所写的程序存储的文件之中,这样可以便于程序员查找数据,提升查找效率。 2.2 C语言和汇编语言混合的程序设计案例分析 (1)混合的软件编程方法 随着信息技术的不断发展和应用,在软件开发过程中,大多时候需要使用两种语言混合编程,有效地提高了程序的开发效率。通常情况下,混合的软件编程方法有两种,具体如下: ①把汇编语句嵌入C语言程序中。例如,把asm汇编语句嵌入到C语言源程序中:/*把5送到ax寄存器*/当把一组汇编语句嵌入到C语言源程序中,则需要利用大括号把嵌入程序给括起来:在本次的实验之中,在进行程序嵌入时,有其固定的格式,需要在嵌入的各行代码之前加“asm”关键字,也可以直接在asm代码块中放入汇编语句。但是程序设计者在进行嵌入时,一定要注意满足以下条件:汇编语言指令代码中关键字asm必不可少,且要放在指令代码之前;嵌入汇编语言指令代码能够和正常C语言程序混合,但是C语言的分隔符“;”必不可少;嵌入汇编语言时C语言的注释分界符必不可少,分别是“/*”和“*/” 。 ②首先编写C语言程序以及汇编程序,然后独立编译目标代码模块,最终进行链接。 首先,在进行混合编程时,C语言程序能够调用汇编语言的各种子程序以及其定义的变量,同时,C语言编写的函数以及定义的变量等也可以被汇编语言调用。而且混合编程的过程中,一个任务往往是由若干个功能模块组成,且不同的功能模块均是利用合适的语言进行独立编程,且以函数的形式存在。因此,程序设计者要根据每一模块的特点选择相应的语言和语言编程系统进行独立编程,并形成目标文件,继而连接目标文件,形成完整的可执行文件。在混合编程的过程中,设计者需要注意五个问题:参数传递问题;寄存器的使用问题;存储模式;变量以及函数的调用问题;子程序的返回值问题。其中,关于参数传递问题,在进行C语言程序调用汇编程序时,必须遵从参数传递原则,利用堆栈把参数传递给汇编程序。例如,在C语言程序中含有函数:voidaa(char*p,inti),这个函数是利用汇编语言进行编写的,如果编译是在小内存模式下实施的,系统在进行调用时,则写成aa(&q, n);运行时程序首先把n压入堆栈,然后再把&q压入堆栈,当参数传递过来并被汇编语言的子程序取得时,BP寄存器便被用作基地址寄存器,实现对栈中所存数据进行存取操作。 (2)混合的软件编程实例分析 程序的主要功能是在五个数中寻找最小数,有主程序“min.c” 以及汇编子程序“qiumin.asm”这两个部分组成。其中主程序是利用C语言编写,汇编子程序是利用汇编语言编写,被主程序调用,主要于完成寻找最小数。程序代码如下: /*文件名为:min.c*/ /*声明qiumin为外部函数*/ 利用C语言和汇编语言混合的编程方法,能够实现应用程序局部满足高运行速度的要求,但是在具体的运用之中,程序设计者仍需要注意寄存器分配以及内存模式等因素对于程序的影响;且在运行时,因为程序设计语言之间存在相互调用的外部接口,故可以实现外部调用。 参考文献 姓名: 班级: 学号: 实验内容: 编写一个程序,从键盘输入任意一个五位数,把这个数值分解为单个数字,然后打印出每一个数字(每个数字之间用三个空格分开)。例如用户输入了42339,屏幕输出结果为: 【提示】巧妙使用 / 和 % 两种运算符。源代码: #include long int num,a,b,c,d,e; scanf(“%ld”,&num);a=num/10000;b=num%10000/1000;c=num%1000/100;d=num%100/10;e=num%10;printf(“%ld %ld %ld %ld %ldn”,a,b,c,d,e);} 运行结果: 实验内容: 已知三角形三边a,b,c,计算三角形的面积。 注:三角形面积公式为area=[s(s-a)(s-b)(s-c)]的1/2次幂 S=1/2*(a+b+c)源代码: #include } scanf(“%lf%lf%lf”,&a,&b,&c);s=(a+b+c)/2;if(a>0 && b>0 && c>0){ area=sqrt(s*(s-a)*(s-b)*(s-c));printf(“area=%lfn”,area);} else printf(“输入错误,三角形边长不能为负数或0n”);运行结果: 实验内容: 输入圆的半径,计算出圆的周长和面积 源代码: #include double r,z,area,pi=3.14159;scanf(“%lf”,&r);if(r>0) { z=2*pi*r;area=pow(r,2)*pi;printf(“圆面积为%lf周长为%lfn”,area,z);return 0; } } else printf(“输如错误,圆的半径不能为负数或0n”);运行结果: 实验内容: • 体型判断。按“体指数”对肥胖程度进行划分: 体指数t = 体重w /(身高h)2 (w 单位为公斤,h单位为米) – 当t < 18时,为低体重; – 当t介于18和25之间时,为正常体重; – 当t介于25和27之间时,为超重体重; – 当t >= 27时,为肥胖。 • 编程从键盘输入你的身高h和体重w,根据给定公式计算体指数t,然后判断你的体重属于何种类型。• 用3种方法编程: – 算法1:用不带else子句的if语句编程 – 算法2:用在if子句中嵌入if 语句的形式编程 – 算法3:用在else子句中嵌入if 语句的形式编程 算法1:源代码: #include float w,h;double t;scanf(“%f%f”,&h,&w);if(w<=0 || h<=0){ printf(“输入错误,身高体重不能为负数或0n”);} { t=w/pow(h,2); if(t<18){ printf(“低体重n”); goto loop; goto loop; } if(t>=18 && t<25) { } if(t>=25 && t<27){ printf(“超重体重n”); goto loop;} if(t>=27){ printf(“正常体重n”);goto loop; printf(“肥胖n”); } } loop:return 0;} 运行结果: 算法2:源代码: #include #include float w,h;double t;scanf(“%f%f”,&h,&w);if(w<=0 || h<=0){ printf(“输入错误,身高体重不能为负数或0n”);} { t=w/pow(h,2);if(t<25){ if(t>=18){ } printf(“正常体重n”);goto loop;goto loop; printf(“低体重n”);} if(t>=25){ if(t<27){ } printf(“超重体重n”);goto loop; printf(“肥胖n”);} } loop:return 0;} 运行结果: 算法3:源代码: #include float w,h;double t;scanf(“%f%f”,&h,&w);if(w<=0 || h<=0)printf(“输入错误,身高体重不能为负数或0n”);else { } t=w/pow(h,2);if(t<18)printf(“低体重n”);else { } if(t>=18 && t<25)printf(“正常体重n”);else { } if(t>=25 && t<27) printf(“超重体重n”);else printf(“肥胖n”);return 0;} 运行结果: 实验内容: 编写一个程序,计算-32768~+32767之间任意整数(由键盘输入)中各位奇数的平方和。源代码: #include } int a,b=0,c=0,i;scanf(“%d”,&a);for(i=0;i<5;i++){ if(a%2!=0){ } a/=10;} printf(“%dn”,b);return 0;c=a%10;b=b+c*c; 运行结果: 实验内容: 设有一四位数abcd=(ab+cd)2,编写一个程序,求a、b、c、d。源代码: #include for(num=1000;num<=9999;num++){ a=num/1000; } 运行结果: } return 0;b=num%1000/100;c=num%100/10;d=num%10;if(num==pow((10*a+b+10*c+d),2))printf(“a=%db=%dc=%dd=%dn”,a,b,c,d); 实验内容: 鸡兔问题:鸡兔共30只,脚共有90个。编写一个程序,求鸡、兔各多少只。源代码: #include } 运行结果: int x,y;for(x=0;x<=45;x++){ } return 0;for(y=0;y<=22;y++)if(x+y==30 && 2*x+4*y==90)printf(“鸡有%d只,兔有%d只n”,x,y); 实验内容: 编写一个程序,求S值(n由键盘输入): (程序检验参考: x=6.66,n=8时,s=40.955;x=6.66,n=15时,s=-1.511 源代码: #include #include double jiecheng(int); double s=0,x=6.66; } double jiecheng(int x){ } double f;if(x==0||x==1)f=1;int n,i;scanf(“%d”,&n);for(i=1;i<=n;i++){ } printf(“%.3fn”,s);return 0;s=s+pow(-1,i)*pow(x,i)/jiecheng(i);else f=jiecheng(x-1)*x;return f; 运行结果: 实验内容: 编写一个程序,求前 n 项之和S值,其中 n≥1,x ≠ 0。(n由键盘输入): 2x 5x 13x S = ── ── + ──-── +...2x 5x 13x(程序检验参考:x=6.66,n=8时,s=-16.492;x=6.66,n=15时,s=-28.469)源代码: #include int a=1,b=2,n,i,t=0; double s=0,x; scanf(“%lf%d”,&x,&n); if(n>=1) { for(i=1;i<=n;i++) { if(i%2) { s+=pow(-1,i+1)*a/(b*x); t=a; a=b; b=t+b; } else { s+=pow(-1,i+1)*a*x/b; t=a; a=b; b=t+b; } } printf(“%fn”,s); } return 0;} 运行结果: x3x5x7x9x,3!5!7!9! 实验内容: 利用泰勒级数sin(x)≈ 计算sin(x)的值。要求最后一项的绝对值小于10-5,并统计出此时累加了多少项。 (程序检验参考:x=6时,sin(x)=-0.279415,count=13)源代码: #include double s=0,x; int i,count=0;scanf(“%lf”,&x);for(i=1;;i+=2){ } s+=pow(-1,count)*pow(x,i)/jiecheng(i);count+=1;if(fabs((pow(x,i)/jiecheng(i))) } printf(“sin(x)=%f count=%dn”,s,count);return 0;double jiecheng(int i){ } 运行结果: double f;if(i==0||i==1)f=1;else f=jiecheng(i-1)*i;return f; 实验内容: 三色球问题。若一个口袋中放有12个球,其中有3个红色的,3个白色的,6个黑色的,从中任取8个球,问共有多少种不同的颜色搭配? 源代码: #include int i,j,k,way=0; for(i=0;i<=3;i++) { for(j=0;j<=3;j++) { for(k=0;k<=6;k++) { if(i+j+k==8) way=way+1; } } } printf(“way=%dn”,way); return 0;} 运行结果: 实验内容:编程打印以下图案 ****** ****** ****** ****** 源代码: #include int i,j;for(j=1;j<=4;j++){ for(i=1;i<=4-j;i++) } { printf(“ ”);} printf(“******n”); return 0;} 运行结果: * *** ***** ******* 源代码: #include int i,j;for(j=1;j<=4;j++) { for(i=1;i<=2*j-1;i++) } printf(“*”);printf(“n”);return 0;} 运行结果: * * * * * * * * * * * * * * * * * * * * * * * * * 源代码: #include int i,j,m,n;for(j=1;j<=7;j++){ if(i<5) { } else { m=j-4;n=(15-2*j);m=4-j;n=2*j-1; } for(i=1;i<=m;i++) printf(“ ”); for(i=1;i<=n;i++)printf(“*”); printf(“n”);} return 0;} 运行结果: 实验内容: 输出下三角形乘法九九表--------1 2 3 4 12 16 5 10 15 20 25 6 12 18 24 30 36 7 14 21 28 35 42 49 8 16 24 32 40 48 56 64 9 18 27 36 45 54 63 72 81 源代码: #include 9n”); for(j=1;j<=i;j++) { printf(“ %d ”,k=i*j); } printf(“n”);} return 0;} 目 录 实验一visual c++编译环境的使用..............................................................................2 实验二 顺序程序设计...............................................................................................6 实验三 选择结构程序设计........................................................................................9 实验四 循环结构程序设计......................................................................................13 实验五 函数...........................................................................................................17 实验六 指针...........................................................................................................22 实验七 数组...........................................................................................................25 实验八 结构体........................................................................................................32 实验一visual c++编译环境的使用 实验目的: 1.掌握c程序设计编程环境visual c++,掌握运行一个c程序设计的基本步骤,包括编辑、编译、连接和运行。 2.掌握c语言程序设计的基本框架,能够编写简单的c程序。3.了解程序调试的思想,能找出并改正c程序中的语法错误。实验内容: 1.在“我的电脑”上新建一个文件夹,用于存放c程序,文件夹名字可以是学号姓名。2.调试示例,在屏幕上显示一个短句“Hello World!”。 源程序 #include Hello World!基本步骤:(要求熟练掌握)1)启动VC++ “开始”->“程序”->“Microsoft Visual Studio 6.0”->“Microsoft Visual C++6.0”进入VC++编程环境。2)新建文件(*.cpp) “文件”->“新建”,单击“文件”选项卡,选择“C++Source Files”,修改文件保存“目录”和“文件”(文件名),单击“确定”。 3)编辑和保存(注意:源程序一定要在英文状态下输入,即字符标点都要在半角状态下,同时注意大小写,一般都用小写) 在编辑窗口输入源程序,然后执行“文件”->“保存”或“文件”->“另存为” 4)编译(*.obj) 用来检查语法错误 “编译”->“编译”或Ctrl+F7,在产生的工作区队话框中,选择“是”。5)连接(*.exe)“编译”->“构件”或F7 6)运行 “编译”->“执行”或Ctrl+F5 7)关闭程序工作区 “文件”->“关闭工作区” 8)打开文件 “文件”->“打开” 9)查看C源文件、目标文件和可执行文件的存放位置。 源文件在保存目录下,目标文件和可执行文件在“保存目录Debug”中 3.编程,在屏幕上显示一个短句“this is my first c program.”。4.调试示例,在屏幕上显示一个短句“welcome to you!”。源程序(有错误的程序)#include 1)按照实验2中介绍的步骤1)~3)输入上述源程序并保存。 2)编译,“编译”->“编译”(Ctrl+F7),信息窗口中显示编译出错信息,如下图所示。3)找出错误,在信息窗口中依次双击出错信息,编辑窗口就会出现一个箭头指向程序出错的位置,一般在箭头的当前行或上一行,可以找到出错语句。 第4行,出错信息:Welcome是一个未定义的变量,但Welcome并不是变量,出错的原因是Welcome前少了一个双引号。 4)改正错误,重新编译,得下如下图所示出错信息。 出错信息:“}”前少了分号。 5)再次改正错误,在“}”前即printf()后加上“;”(英文状态),生新编译,显示正确 6)连接,“编译”->“构件”(F7),出现如下出错信息。 出错信息:缺少主函数。 7)改正错误,即把“mian”改为“main”后,重新连接,信息窗口显示连接正确。8)运行,“编译”->“执行”(Ctrl+F5),观察结果是否与要求一致。5.改错,改正下列程序中的错误,在屏幕上显示以下3行信息。 **************** Welcome **************** 源程序(有错误的程序)#include } 实验报告要求 将以上各题的源程序、运行结果,以及实验中遇到的问题和解决问题的方法,以及实验过程中的心得体会,写在实验报告上。 Printf(“ Welcome”)Printf(“****************n”); 实验二 顺序程序设计 【实验目的】 1.学会顺序程序设计的思想 2.进一步熟悉Turbo C集成编译环境的使用,达到熟练使用的目的 3.熟练掌握各种数据类型的输入输出格式,并学会使用输入输出函数 4.学会使用表达式 【实验内容】 1.在屏幕中输出一行文字“Hello,Welcome!” 说明: (1)只需要在屏幕中显示一行文字即可 参考程序如下: #include printf(“Hello,Welcome!n”);} 2. 输入一个华氏温度,要求输出摄氏温度。公式为 输出要求有文字说明,取两位小数 说明: (1)摄氏温度F和华氏温度c都应用float类型变量存储(2)注意表达式书写中的各变量的顺序问题(3)输出时只需输出两位小数 参考程序如下: #include float F,c; printf(“input F:”); scanf(“%f”,&F); c=5*(F-32)/9; printf(“c=%.2fn”,c);} 3.输入三角形三边长a、b、c,求三角形周长和l面积s。用scanf输入数据,输出计算结果,输出时要求有文字说明,取消书店后两位小数。说明: (1)程序设计中使用的所有变量均为float类型 c59F32(2)三角形周长公式:labc abc2(3)三角形面积公式;sp(pa)(pb)(pc),其中 p (4)注意应保证输入数据能够构成三角形 (5)需要使用开根号函数sqrt,在程序顶部加上#include #include float a,b,c,l,s; float p; printf(“input a,b,c:”); scanf(“%f,%f,%f”,&a,&b,&c); l=a+b+c; p=(a+b+c)/2; s=sqrt(p*(p-a)*(p-b)*(p-c)); printf(“l=%.2fn”,l);printf(“s=%.2fn”,s);} 4.设圆半径r1.5,圆柱高h3,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积。用scanf输入数据,输出计算结果,输出时要求有文字说明,取消书店后两位小数。说明: (1)程序设计中使用的所有变量均为float类型(2)圆周长公式:l2r(3)圆面积公式:S1r(4)圆球表面积公式:S24r V14322(5)圆球体积公式: r3 (6)圆柱体积公式:V2rh 参考程序如下: #include 2main(){ float r=1.5,h=3; float l,s1,s2,v1,v2; l=2*PI*r; s1=PI*r*r; s2=4*PI*r*r; v1=4*PI*r*r*r/3; v2=PI*r*r*h; printf(“l=%.2fn”,l);printf(“s1=%.2fn”,s1);printf(“s2=%.2fn”,s2);printf(“v1=%.2fn”,v1);printf(“v2=%.2fn”,v2);} 实验三 选择结构程序设计 【实验目的】 1.了解C语言的逻辑运算 2.学会使用if语句和switch语句 3.熟练掌握选择结构程序设计方法 【实验内容】 1.有一函数 y x x1 1x10 2x 13x11 x10 写一程序,输入x,输出y值 说明: (1)根据输入x的不同求y的值,使用if语句 (2)分别输入三个分段中的三个数,判断输出结果是否正确,测试程序正确与否 参考程序如下: #include float x,y; printf(“input x:”); scanf(“%f”,&x); if(x<1) y=x; if(x>=1 && x<10) y=2*x-1; if(x>=10) y=3*x-11;printf(“y=%fn”,y);} 2.从键盘输入一个字符,可以是数字、字母、或是标点符号,对输入的字符进行判断,如果是数字则输出“* is a number!”,如果是字母则输出“* is a letter!”,如果是其他的字符怎输出“* is the other!”(*为输入的字符)说明: (1)从键盘输入一个字符,用char类型变量存储(2)使用if语句作判断(3)判断条件根据输入字符的ASCII码值的范围,具体的ASCII码值参看书后的ASCII码表 参考程序如下: #include char c; printf(“input a char:”); scanf(“%c”,&c); if(c>=48 && c<=57) printf(“%c is a number!n”,c); else if((c>=65 && c<=90)||(c>=97 && c<=122)) printf(“%c is a letter!n”,c); else printf(“%c is the other!n”,c);} 3.输入两个实数a、b,保证变量a中存储的是较大的数,变量b中存储的实较小的数,并按照由大到小的顺序输出。说明: (1)需要对输入的两个数进行比较,判断是否需要交换两个数(2)按照从大到小的顺序输出两个数 参考程序如下: #include float a,b; float temp; printf(“input a,b:”); scanf(“%f,%f”,&a,&b); if(a { temp=a; } printf(“%f,%fn”,a,b);} 4.输入一年份,判断该年是否是闰年。说明: (1)判断闰年的条件:能够被4整除,但不能被100整除或者能被100整除,又能被400整除 (2)使用一个变量来代表是否是闰年 a=b;b=temp;10(3)如果是闰年则输出“* is a leap year!”,否则输出“* is not a leap year!”。*代表输入的年份 参考程序如下: #include int year; int flag=0; printf(“input a year:”); scanf(“%d”,&year); if((year%4==0 && year%100!=0)||(year%100==0 && year%400==0)) flag=1; if(flag==1) printf(“%d is a leap year!n”,year); else printf(“%d is not a leap year!n”,year);} 5.从键盘输入一个月号,显示输出该月号的英文名称 说明: (1)使用if语句较为麻烦,因为需要做12次比较(2)使用switch语句 (3)如果输入月份超出范围,则应当输出错误信息 参考程序如下: #include int month; printf(“input a month:”); scanf(“%d”,&month); switch(month) { case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: printf(“January!n”);printf(“February!n”);break;break;printf(“March!n”);break;printf(“April!n”);break;printf(“May!n”);break;printf(“June!n”);break;printf(“July!n”);break;printf(“August!n”);break;printf(“September!n”);break;case 10: printf(“October!n”);break;case 11: printf(“November!n”);break;case 12: printf(“December!n”);break; } } default: printf(“input error!n”);12 实验四 循环结构程序设计 【实验目的】 1.学会使用while、do-while、for语句 2.熟练掌握循环结构程序设计方法 3.掌握选择结构与循环结构的嵌套 【实验内容】 201.求和说明: n!n1(即求1!+2!+„„+20!) (1)首先要求出每一项的n!的值 (2)然后把各项相加得到所求的值 (3)存储求和运算结果的变量的初始值应为0(4)存储求积运算结果的变量的初始值应为1 参考程序如下: ①使用while循环 #include float sum=0; float mid=1; int n=1; while(n!=21) { mid=mid*n; } printf(“sum=%fn”,sum);} ②使用for循环 #include float sum=0; float mid=1; int n; for(n=1;n<=20;n++) { mid=mid*n;n++;sum=sum+mid; sum=sum+mid;} printf(“sum=%fn”,sum);} 2.求出100到200以内最大的素数和最小的素数,并求出两者的差值 说明: (1)素数的概念:只能被1和自身整除的正整数 (2)分别求出这个两个素数,并输出,输出格式为: big one:* small one:* 最小的素数正序找出 最大的素数倒序找出 (3)求出两者的差,并输出,输出格式为: result:* 参考程序如下: #include int big,small; int result; } for(i=200;i>=100;i--){ int i,j;int flag;for(i=100;i<200;i++){ flag=0;for(j=2;j } if(i%j==0){ } flag=1;break;if(flag==0){ } small=i;break;flag=0;for(j=2;j { } if(flag==0){ } big=i;break;if(i%j==0){ flag=1;break;} } result=big-small;printf(“big:%dn”,big);printf(“small:%dn”,small);printf(“reslut:%dn”,result);} 3.输入两个正整数m和n,求其最大公约数和最小公倍数 说明: (1)最大公约数:能够被m和n同时整除的最大正整数(2)最小公倍数:m和n相乘的积除以最大公约数 (3)使用for循环,将m和n同时除以1到m(m为m和n两者中较小者),直到找出最大的正整数即为最大公约数(4)输出格式如下: The greatest common divisor is *! The least common multiple is *!参考程序如下: #include printf(“input m,n:”); scanf(“%d,%d”,&m,&n);if(m>n){ temp=m;m=n; n=temp;} for(i=1;i<=m;i++){ if(n%i==0 && m%i==0) great=i;} least=m*n/great;printf(“The greatest common divisor is %dn”,great);printf(“The least common multiple is %dn”,least);} 4.打印出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其各位数字立方和等于该数本书。例如,153是一水仙花数,因为153153 说明:(1)“水仙花数”是三位数,所以范围是从100到999(2)使用for循环 (3)循环中需要把数字的每一位都分离出来,然后求和,同原数字比较,进行判断 参考程序如下: #include int i;int temp;for(i=100;i<1000;i++){ a=i/100;b=(i-a*100)/10;c=i%10;temp=a*a*a+b*b*b+c*c*c;if(i==temp)printf(“%dn”,i); 33} } 实验五 函数 【实验目的】 1.掌握C语言函数的定义、声明以及函数的调用方法 2.了解主调函数和被调函数之间的参数传递方式 3.熟练掌握数组作为函数参数的用法 【实验内容】 1.写一个判断素数的函数,在主函数输入一个整数,输出是否素数的信息。说明: (1)判断素数的函数名为Prime(2)传递参数为int类型的变量(3)输出格式为: * is a prime!或者* is not a prime!参考程序如下: #include if(num%i==0) { } flag=1;break;} if(flag==0)printf(“%d is a prime!n”,num);else printf(“%d is not a prime!n”,num);} main(){ int num;printf(“input a num:”);scanf(“%d”,&num);Prime(num);} 2.写一个函数,用“冒泡法”对输入的10个数字由小到大顺序排列,并输出。说明: (1)排序的函数名为Sort(2)排序前后的输入输出都应在主函数中完成(3)使用数组作为函数参数(4)使用“冒泡法”排序 参考程序如下: #include } } main(){ int num[10];int i;printf(“input 10 numbers:”);for(i=0;i<10;i++) scanf(“%d”,&num[i]);Sort(num);printf(“the sorted numbers:”);for(i=0;i<10;i++) printf(“%d ”,num[i]);} 3.写一函数,使给定的一个二维数组(5×5)转置,即行列互换。说明: (1)使用5×5的二维数组存放数据 (2)矩阵转置的函数名为Turn(2)转置前后的输入输出都应在主函数中完成(3)使用数组作为函数参数 for(j=0;j<9-i;j++){ } if(num[j]>num[j+1]){ temp=num[j]; } num[j]=num[j+1];num[j+1]=temp;18 参考程序如下: #include } } main(){ int num[5][5]={{1,2,3,4,5},{6,7,8,9,0},{11,12,13,14,15},{16,17,18,19,20},{21,22,23,24,25}}; int i,j;printf(“Before array be turned:n”);for(i=0;i<5;i++){ for(j=0;j<5;j++)printf(“%2d ”,num[i][j]);for(j=i;j<5;j++){ } temp=num[i][j];num[i][j]=num[j][i];num[j][i]=temp; printf(“n”);} Turn(num);printf(“After array be turned:n”);for(i=0;i<5;i++){ } } 4.写一函数,使输入的字符串反序存放,在主函数中输入和输出字符串。说明: (1)字符串反序的函数名为Reverse(2)反序前后的输入输出都应在主函数中完成(3)使用数组作为函数参数 for(j=0;j<5;j++)printf(“%2d ”,num[i][j]);printf(“n”);19(4)需要使用strlen函数得到字符串长度,需要在源文件头部加入#include #include } } main(){ char str[50];printf(“input a string:”);scanf(“%s”,str);Reverse(str);printf(“After reversed is %sn”,str);} 5.写一函数,将两个字符串连接。 说明: (1)连接两个字符串的函数名为:Connect(2)将连个字符串存入两个字符串数组中,要保证第一个字符串的长度能够容纳两个字符串之和 (3)连接两个字符串主要是找到第一个字符串的结尾,然后将第二个字符串连接到第二个字符串的后边 (4)输出格式为: The connected string is *!(5)使用数组作为函数参数 (6)连接前后的字符串输出都要在主函数中完成,自定义函数只完成连接功能 参考程序如下: #include str1[i]=str2[j];str1[i]=';} main(){ char str1[50],str2[20];int i,j;printf(“input string1:”);scanf(“%s”,str1);getchar();printf(“input string2:”);scanf(“%s”,str2);Connect(str1,str2);printf(“The connected string is %sn”,str1);} 6.写一函数,求字符串的长度,并编写主函数。说明: (1)求字符串长度的函数名为:Count(2)字符串结束的标志是’’(3)输出格式为: The length of string is *!(4)使用数组作为函数参数 参考程序如下: #include 实验六 指针 【实验目的】 1.掌握C语言指针变量的定义、声明和赋值 2.学会使用指针变量的程序设计 3.掌握指针作为函数参数的用法 【实验内容】 1.使用指针作为函数参数,写一交换两个数的函数 说明: (1)交换两个数的函数名为:Swap(2)使用指针变量作为函数参数 (3)在主函数中输入输出,自定义函数只完成交换功能 参考程序如下: #include 2.使用指针作为函数参数,写一求数组中最大值和最小值的函数。说明: (1)函数名为:MaxAndMin(2)使用指针指向一维数组 (3)最大值和最小值的输出必须要在主函数中 参考程序如下: #include *max=array[0];*min=array[0];for(i=0;i<10;i++){ if(*maxarray[i])*min=array[i]; } } main(){ int array[10]={0,1,2,3,4,5,6,7,8,9};int max,min;int *p1,*p2;p1=&max;p2=&min;MaxAndMin(array,p1,p2);printf(“max=%dnmin=%dn”,max,min);} 3.找出以下程序的错误,并加以修改。①交换两个数 #include temp=p1; p1=p2; p2=temp;} main(){ int a,b;int *pointer_1,*pointer_2; scanf(“%d,%d”,&a,&b); pointer_1=&a;pointer_2=&b;Swap(pointer_1,pointer_2); } ②输出数组重点全部元素 #include *p++=i; for(i=0;i<10;i++) printf(“a[%d]=%dn”,i,*p++);} 4.写一函数,求出矩阵中的最大值和最小值,要求使用指针作为函数参数。说明: (1)使用二维数组存放矩阵元素(2)只用指针变量指向数组(3)函数名为:ArrayMaxAndMin 参考程序如下: #include *min=*(array+i*n+j);for(i=0;i } if(*max<*(array+i*n+j))*max=*(array+i*n+j);if(*min>*(array+i*n+j))*min=*(array+i*n+j); } } main(){ int array[3][3]={1,2,3,4,5,6,7,8,9};int max,min;int *p,*p1,*p2;p=array;p1=&max;p2=&min;ArrayMaxAndMin(p,p1,p2,3);printf(“max=%dnmin=%dn”,max,min);} 实验七 数组 【实验目的】 1.掌握一维数组和二维数组的定义、赋值和初始化的方法 2.掌握字符数组的使用 3.熟练掌握与数组相关的各种算法 【实验内容】 1.从键盘输入10个整数,对这个十个数进行排序,并输出 说明: (1)将这10个整数存入一个含有10个元素的一维数组中 (2)冒泡法:从第一个数开始依次让相邻的两个数进行比较,如次序对则不做任何操作;如次序不对则使这两个数交换位置。第一遍比较后,最大的数已放在最后,第二遍只需考虑剩下的数,以此类推直到最后两个数比较后就可以完成排序。(3)比较完成后将数组中元素依次输出 参考程序如下: #include scanf(“%d”,&num[i]);for(i=0;i<=8;i++){ for(j=0;j<9-i;j++){ if(num[j]>num[j+1]){ temp=num[j];num[j]=num[j+1];num[j+1]=temp; } } } printf(“the sorted numbers:”);printf(“%d ”,num[i]);for(i=0;i<10;i++) } 2.从键盘输入一串字符串,统计字符串中特定字符的个数(特定字符也需要从键盘输入),并输出个数 说明: (1)输入时需要用到的输入格式控制字是%s(2)字符串存入一个足够大的字符数组中,保证输入的字符个数不要超过最大个数(3)使用循环控制语句,需要了解字符数组的结束标志是’’,作为循环的结束标志(4)输出格式如下: The number of * is *!参考程序如下: #include { if(str[i]==ch)count++;i++;} printf(“The number of %c is %d!n”,ch,count);} 注意: 程序中多了一行getchar(),这并不是多余的,而是因为在输入完字符串后,键入的回车被放入到内存的输入缓冲区中,在输入特殊字符的时候ch得到了上一个回车,而无法得到我们要输入的字符,因此需要使用一行getchar()将缓冲区中的回车读出,相当于清除缓冲区的作用。 3.青年歌手参加歌曲大奖赛,有10个评委进行打分,试编程求这位选手的平均得分(去掉一个最高分和一个最低分)。 说明: (1)将10位评委的打分放入一个含有10个元素的一维数组中(2)程序设计重点是排序 (3)排序后只要用中间的8个元素即可(4)输出格式为: The average is *!参考程序如下: #include scanf(“%f”,&score[i]);for(i=0;i<=8;i++){ for(j=0;j<9-i;j++){ if(score[j]>score[j+1]){ } temp=score[j];score[j]=score[j+1];score[j+1]=temp;} } for(i=1;i<=8;i++){ sum=sum+score[i]; } average=sum/8;printf(“The average is %f!n”,average);} 4.将两个字符串连接起来,不要使用strcat函数。 说明: (1)将连个字符串存入两个字符串数组中,要保证第一个字符串的长度能够容纳两个字符串之和 (2)连接两个字符串主要是找到第一个字符串的结尾,然后将第二个字符串连接到第二个字符串的后边 (3)输出格式为: The connected string is *!参考程序如下: #include printf(“input string1:”);scanf(“%s”,str1);getchar();printf(“input string2:”);scanf(“%s”,str2);for(i=0;str1[i]!=';i++);for(j=0;str2[j]!=';j++,i++) str1[i]=str2[j];str1[i]=';printf(“The connected string is %sn”,str1);} 5.已有一个已排好序的数组,从键盘输入一个数,要求按原来排序的规律将它插入数组中。说明: (1)需要保证数组的元素据个数比插入前多1(2)需要找到在数组中插入的位置 (3)可倒序查找:假设从小到大排序,从最后一个开始查找,如果要插入元素比当前数组元素小则将该数组元素赋予后边一个元素,继续比较;否则将要插入元素赋予该数组元素的下一个元素,然后break结束循环(4)输入该数组即可 参考程序如下: #include if(a[i]>b)a[i+1]=a[i];else { } a[i+1]=b;break;} printf(“The new sorted array is ”);for(i=0;i<10;i++) } printf(“%d ”,a[i]);6.将一个数组中的值按逆序重新存放。例如:原来顺序为8,6,5,4,1,要求改为1,4,5,6,8。说明: (1)只要将原来数组中的值以中间值为中心交换 n1(2)交换次数为2次 (3)注意此时的n是数组最后一个元素的下标 参考程序如下: #include temp=num1[i]; num1[i]=num1[9-i];num1[9-i]=temp;} for(i=0;i<(8+1)/2;i++){ temp=num2[i];num2[i]=num2[8-i];num2[8-i]=temp; } printf(“The converted array1 is ”);for(i=0;i<10;i++) printf(“%d ”,num1[i]);printf(“nThe converted array2 is ”);for(i=0;i<9;i++) printf(“%d ”,num2[i]);} 7.求一个3×3矩阵的对角线元素之和 说明: (1)使用3×3的二维数组存储数据 (2)使用for循环嵌套,判断数组中元素是否是对角线元素,如果是则相加(3)对角线元素的特点是行号和列号相同 参考程序如下: #include int array[3][3]={1,2,3,4,5,6,7,8,9};int sum=0;int i,j;for(i=0;i<3;i++)for(j=0;j<3;j++){ } if(i==j)sum=sum+array[i][j];{ } printf(“summary is %dn”,sum);} 8.设计一个较为复杂的一维数组操作程序,实现对一维数组的基本操作 说明: (1)通过输入函数实现对一维数组的输入,可以将数组定义为100个整型元素,输入其中的10个元素 (2)在屏幕上将数组中的10个元素输出 (3)往数组中插入一个元素,并将插入后的11个元素输出(4)从数组中删除一个元素,并将删除后的10个元素输出 (5)从数组中查找一个元素,并将查找后的元素下标输出,如果元素不存在,给出提示 参考程序如下: #include int a[100],i,j;int ins,del,find,pos;printf(“input the data: ”);for(i=0;i<10;i++)scanf(“%d”,&a[i]);printf(“The array is ”);for(i=0;i<10;i++)printf(“%d ”,a[i]);printf(“ninsert a data: ”);scanf(“%d”,&ins);for(i=0;i<10;i++){ if(ins for(j=9;j>=i;j--)a[j+1]=a[j];a[i]=ins;break; } } if(i==10) a[i]=ins;printf(“nAfter insert: ”);for(i=0;i<11;i++)printf(“%d ”,a[i]);printf(“ndelete a data: ”);scanf(“%d”,&del);for(i=0;i<11;i++){ if(del==a[i]) { for(j=i;j<10;j++) a[j]=a[j+1];break; } } if(i==11) printf(“nnot foundn”);else { printf(“nAfter delte: ”); for(i=0;i<10;i++)printf(“%d ”,a[i]);} printf(“nfind a data: ”);scanf(“%d”,&find);for(i=0;i<10;i++){ if(find==a[i]) { pos=i; break; } } if(i==10) printf(“nnot foundn”);else printf(“npos=%dn”,pos+1);} 实验八 结构体 【实验目的】 1.掌握C语言结构体变量的定义和使用 2.学会设计简单的结构体程序 【实验内容】 1.有一学生信息包含学号、姓名、性别、年龄、电话等信息,要求设以一个结构体用于存储该学生信息,实现学生信息的输入和显示。说明: (1)使用结构体实现学生信息的存储(2)按照序号顺序排列学生信息(3)实现按照序号查找学生信息 参考程序如下: #include if(i==0)printf(“The first onen”);if(i==1)printf(“The second onen”);if(i==2)printf(“The third onen”);printf(“ input number:”);scanf(“%s”,stu[i].num);printf(“ input name:”);scanf(“%s”,stu[i].name);printf(“ input sex:”);scanf(“%s”,stu[i].sex);printf(“ input age:”);scanf(“%d”,&stu[i].age); } 【西南交大c语言实验】推荐阅读: 西南交大选课通知09-13 西南交大自荐信08-19 房屋建筑工程西南交大08-18 西南交大有自主招生吗09-01 西南交大计网课程设计06-14 西南交大考研材料力学介绍08-16 西南交大届研究生毕业典礼校长寄语09-15 西南交大数值分析第二次大作业(可以运行)08-08 交大金融06-12 交大社团联合会07-23西南交大c语言实验 篇2
C语言实验教学方法探讨 篇3
C语言实验报告 篇4
西南交大c语言实验 篇5
c语言实验报告要求 篇6
C语言教学实验中的CUDA技术 篇7
西南交大c语言实验 篇8
大一C语言上机实验报告 篇9
C语言程序设计实验教案 篇10