1、课程编号:02202001课程名称:程序设计实践课程性质:专业基础限选总 学 时:30(实践学时 30) 学分:2适用专业:计算机科学与技术程序设计实践教学大纲一、教学目标程序设计实践课程的教学目标旨在训练学生 C 语言编程的基本能力。通过本课程的训练,使学生具备后续程序设计类课程,如数据结构、算法分析与设计等,所要求的编程能力,为这些教学活动的顺利开展打下良好基础。二、教学说明程序设计实践分模块对学生的 C 语言编程技能进行训练,涵盖了基本设计方法、输入输出、指针、字符串、参数传递、递归调用、文件操作等项目。这些技能即是后续与程序设计类课程经常要用到的,也是日后从事 C 语言程序开发所必备的
2、,乃至对掌握其他编程语言,如 C+、Java 和C#等也是非常有益的。训练模块的设计,以及各模块中训练题目的选择是基于以往教学经验,挑选学生普遍薄弱以及未来经常使用的编程技能编辑而成。教师可根据具体情况,特别是学生对 C 语言编程的掌握情况,灵活调整训练模块和模块中的训练题目。目前各模块基本相对独立,前后顺序可以调整,但仍建义将实验一和实验二放在最开始;实验三不晚于实验六;实验四不晚于实验五。建议每次课能抽出部分时间对与本模块相关的理论知识做简单归纳总结。本课程是对编程能力的训练,因此反对学生参考成熟的程序,甚至鼓励学生尽量少用库函数,而是自己独立编程实现。这一点与其他程序设计类课程有所不同,
3、望在教学实施过程中予以注意。本课程虽是对编程能力的训练,但在注重结果正确的前提下,也应注意对学生良好编程风格的培养。鼓励学生选择与训练模块相关的,来自于自己程序开发实践活动的题目参与训练,但要事先征得教师的认可。如果条件允许,应该全程开展对训练结果的机器自动检查。三、教学内容及要求实验一 基本设计方法训练(一)实验内容本次实验对基于程序流程图写代码,以及通过程序流程图分析代码的程序设计方法进行训练。实验题目分如下两大类,学生可分别从每类中选择 1 道来完成:1流程图转换为代码(1)写出下列流程图对应的代码(2)写出下列流程图对应的代码2代码转换为流程图(1)画出下列代码的流程图p = head
4、; for(j=1; jnext; while(head-next != head) for(j=1; jnext; q = p-next; p-next = q-next; printf(“%d “,q-number); if(q = head) head = q-next; free(q); p = p-next; printf(“%dn“,head-number);(2)画出下列代码的流程图r1=head1;p1=head1-next;r2=p2=head2-next;while(p1p2=p2-next;free(r2);r2=p2;r1=p1;p1=p1-next;else if(p
5、1-indexp2-index)r2-next=p1;r1-next=r2;p2=p2-next;r2=p2;else if(p1-indexindex)r1=p1;p1=p1-next;(二)实验要求能写出程序流程图对应的代码,并能画出代码对应的程序流程图。实验二 输入输出格式控制训练(一)实验内容本次实验对输入输出语句的使用,主要是格式控制参数的使用进行训练。实验题目分如下两大类,学生可分别从每类中选择 2 道来完成:1输入语句(1)读入一组以空格分隔的数,把它们存入数组,用逗号分隔的方式输出,并统计数的个数。例:【输入】20 37.5 43 5 87.0【回车】【输出】20,37.5,
6、43,5,87.05(2)按照“学号【空格】姓名【空格】性别【空格】年龄【回车】 ”的格式输入若干学生信息,将他们存储在结构体数组中(即每一个学生的信息存储在一个结构体中) ,输入以“#”结束。统计学生信息数量,并按行输出每条学生信息(逗号分隔) 。例:【输入】20142101 zhang Male 19【回车】20142102 wang Female 18【回车】#【回车】【输出】220142101,zhang,Male,19【回车】20142102,wang,Female,18【回车】(3)读入一组以制表符(Tab)分隔的数,把它们存入数组,并用逗号分隔输出。例:【输入】5【Tab】35【
7、Tab】15【Tab】100【回车】【输出】5,35,15,100【回车】2输出语句(1) 打印如下图形,层数由用户输入,最后一行左侧顶格。 *(2)打印如下图形,层数由用户输入,中间一行左侧顶格。 *(3)打印倒的杨辉三角形,层数由用户输入,第一行左侧顶格。例:1 3 3 11 2 11 113综合类(1)输入一组以逗号分隔的整数,以回车结尾,以每行 5 个,空格分隔,左对齐的方式输出它们。例:【输入】100,21,3950,7,8,3289,943,495,34134,343,209,47,2,7293,29,2732,843,392,24【回车】【输出】100 21 3950 7 832
8、89 943 495 34134 343209 47 2 7293 292732 843 392 24 (2)输入一组以逗号分隔的整数,以回车结尾,以每行 5 个,空格分隔,右对齐的方式输出它们。例:【输入】100,21,3950,7,8,3289,943,495,34134,343,209,47,2,7293,29,2732,843,392,24【回车】【输出】 100 21 3950 7 83289 943 495 34134 343209 47 2 7293 292732 843 392 24 (3)输入一组以空格分隔的英文单词,以回车结尾,以每行 5 个,空格分隔,左对齐的方式输出它们
9、。例:【输入】Machine learning is the term that refers to learning patterns in the data In other words【回车】【输出】Machine learning is the termthat refers to learning patternsin the data In other words(4)输入一组以空格分隔的英文单词,以回车结尾,以每行 5 个,空格分隔,右对齐的方式输出它们。例:【输入】Machine learning is the term that refers to learning patt
10、erns in the data In other words【回车】【输出】Machine learning is the termthat refers to learning patternsin the data In other words(5)输入一组以逗号分隔的小数,以回车结尾,以每行 5 个,空格分隔,小数点对齐的方式输出它们。例:【输入】10.0,2.1,39.50,7.8,328.9,9.43,49.5,341.34,34.3,2.09,0.47,2.0,7.293,29.00【回车】【输出】 10.0 2.1 39.50 7.8 328.99.43 49.5 341.34
11、 34.3 2.090.47 2.0 7.293 29.00(6)输入一组以空格分隔的英文单词,以回车结尾,以每行 5 个,空格分隔,中间对齐的方式输出它们。例:【输入】Machine learning is the term that refers to learning patterns in the data In other words【回车】【输出】Machine learning is the termthat refers to learning patternsin the data In other words(二)实验要求能利用输入输出语句完成相应任务。实验三 指针及字符串
12、训练(一)实验内容本次实验对指针的使用和字符串的操作进行训练。实验题目如下,学生可从中选择 2 道来完成:1用指针操作实现一个二维数组的转置运算。输入:输入包含 m + 1 行。第一行是整数 m 和 n,两项之间用一个空格隔开( 1 #include #include typedef struct _foruse struct _foruse* next; int number; foruse,*link; link create(int n); void joseph(link head, int k, int m); link create(int n) link head = (link
13、)malloc(sizeof(foruse); foruse *tail; int i; head-next = head; head-number = 1; tail = head; for(i=2;inumber = i; p-next = tail-next; tail-next = p; tail = p; return head; void joseph(link head, int k, int m) int j; foruse *p; foruse *q; if(m = 1 while(p-next != head) printf(“%d “,p-number); q = p-n
14、ext; free(p); p = q; printf(“%dn“,p-number); else if(m = 1 for(j=1; jnext; while(head-next != head) q = p-next; p-next = q-next; printf(“%d “,q-number); if(q = head) head = q-next; free(q); printf(“%dn“,head-number); else p = head; for(j=1; jnext; while(head-next != head) for(j=1; jnext; q = p-next;
15、 p-next = q-next; printf(“%d “,q-number); if(q = head) head = q-next; free(q); p = p-next; printf(“%dn“,head-number); void main() link head; int m, n, k; printf(“please input n,m,k:“); scanf(“%d,%d,%d“, head = create(n); joseph(head,k,m); 2约瑟夫问题:假设有 n 个人围圈而坐,现在从第 k 人开始数数,数到 m 的人出列,紧接着的后续人又从 1 开始数数,到 m 出列,如此重复下去,直到全体人员出列。输出出列序列。#include#includetypedef struct nodeint data;struct node *next;LNode,*LinkList;LinkList look(LNode *p,int e)LNode *p3;p3=(LNode *)malloc(sizeof(LNode);