您好,欢迎来到尔游网。
搜索
您的当前位置:首页西南石油大学

西南石油大学

来源:尔游网
西 南 石 油 大 学

教 案

课程名称 C语言程序设计 任课教师 院(系、部) 计算机科学学院 教 研 室 计算机基础教研室

2017年2月25日

课 程 表

课程名称 C语言程序设计 专业年级 学 时 节次 56 行课时间 1—15周 10—12节 1—2节 3—5节 6—7节 8—9节 星期一 星期二 星期三 星期四 星期五 星期六 星期日

教书育人工作要点

1、

认真备好课,多参考各方面的书籍以及网站上的相关信息和实例以及最新研究资料,在上课时,作适当补充,以使学生了解更多、更实用的网络计算机相关知识; 2、

上课时注重教学方法的运用,多采用启发式教学(设问式、因果式、图示)和师生互动(提问、上讲台实践),以达到上课不仅是被动的接受,而且是主动思考问题,不仅是理论学习,更要上机实践; 3、

在培养学生灵活运用知识的能力时,不仅仅着眼于教材后面的参考作业,还需要布置一些实用而具有应用的操作练习作业。作业布置后,应尽力调动学生自主学习的能力,多做一些“寻根溯源”的工作,是学生加深理解; 4、

在教学中,做到按时上下课,不旷课、不迟到、不早退,严格遵守学校的各项教学制度,形成良好的教学秩序。讲课过程中声音洪量、吐字清楚、板书工整。 5、 6、

耐心辅导、答疑,认真批改作业。

严格要求学生,按时完成作业,遵守课堂秩序,不迟到、不早退,形成良好的学习风气。 7、

善于发现学生中存在的思想问题,为学生排忧解难,在生活中,成为学生的知心朋友。

“学高为师,身正为范”,作为这门课的老师,一方面不断丰富自己的知识,一方面从思想行为上起带头作用,这样才能对自己以及对学生问心无愧。

《C语言程序设计》课程教学大纲

一、基本信息

中文名称: C语言程序设计

英文名称: C Programming Language 开课学院: 计算机科学学院 属学

性分

: 理论 :

3.5

总学时:

56

实验学时:

上机学时:

26

课程编码: 3012211035

适用专业: 理工类专业

先修课程: 3015111010 大学计算机基础 大纲执笔: 计算机基础教研室 贾月乐 大纲审批: 计算机科学学院学术委员会

教学院长: 赵刚

制定(修订)时间:2016年3月

二、目的与任务及能力培养

C语言程序设计是高等工科院校中非计算机专业的一门计算机公共基础课。本课程的主要目的是引导学生实现问题求解思维方式的转换,培养学生的计算思维能力,培养学生的程序设计与实现能力。

通过本课程的学习,使学生学会用计算思维方法求解问题,增强解决问题的编程实践能力,为将来后继课程的学习,以及在今后工作中解决实际工程问题、科学技术问题奠定基础。

三、基本要求

了解软件开发的基本过程,理解用计算机求解实际问题的基本过程;理解算法的概念和描述方法;掌握顺序、分支和循环基本控制结构及相关控制语句;掌握以数组、字符串和结构体作为函数参数的函数设计方法;理解传值调用和传地址调用两种参数传递方式的区别;掌握结构化程序设计的基本思想和方法;掌握常用的算法,包括迭代、递归、求最值、求平均值、排序、查找等;了解文件的建立和文件的基本操作。

本课程学时少内容多,实践性较强,要求学生课外需花费不少于讲课学时来加深和巩固所学内容。

四、教学内容、要求及学时分配

(一)理论教学(30学时)

第一章 程序设计基础(2学时)

目的与要求:了解程序相关概念和程序设计方法,了解C语言的特点和C程序的结构,程序编制的规范性。掌握C程序的开发过程,调试方法。

难点与重点:C语言程序结构、开发过程及调试方法

教学内容(2学时):

1 了解程序设计语言的发展过程;

2了解程序与程序设计语言的相关概念; 3了解软件开发的基本过程; 4掌握简单的C程序结构;

5 C语言程序的开发环境介绍。

【重点】程序结构、main函数、程序书写规范 【难点】C程序的开发过程及调试方法 第二章 C数据类型(1学时)

目的与要求:熟练掌握C的基本数据类型,掌握变量的定义和初始化 难点与重点:C的基本数据类型,变量的定义和初始化 教学内容(1学时): 1.掌握C语言数据类型 2.掌握常量与变量的概念 3.掌握常量与变量的使用

【重点】数据类型,常量,变量的定义及初始化 【难点】数据类型,变量的定义及使用 第三章 顺序结构程序设计(3学时)

目的与要求:熟练掌握简单运算符与表达式的使用、输入与输出方法,掌握宏常量的使用,完成顺序结构程序设计

难点与重点:简单表达式计算,输入输出,顺序程序设计方法 教学内容:

第一节(1学时)

1.1掌握数值型数据间的混合运算

1.2掌握运算符与表达式(算术、自增自减、赋值) 1.3了解强制类型转换

【重点】算术、赋值运算符使用 【难点】自增自减运算符 第二节(2学时)

2.1.掌握字符的输入与输出 2.2掌握格式输入与输出 2.3掌握宏常量与宏替换 2.4应用顺序结构程序设计

【重点】宏常量的使用,scanf函数和printf函数 【难点】scanf引导格式

第四章 选择结构程序设计(4学时)

目的与要求:掌握“条件”的正确表示,熟练掌握if语句的使用,掌握switch语句的使用 难点与重点:关系、逻辑表达式的运算,分支语句的使用,选择结构程序设计方法 教学内容:

第一节(2学时)

1.1. 掌握关系运算符与关系表达式 1.2. 掌握逻辑运算符与逻辑表达式 1.3. 掌握逗号、条件运算符的使用

【重点】关系、逻辑、逗号、条件运算符的使用 【难点】关系、逻辑、逗号、条件运算符的使用 第二节(2学时)

2.1掌握if语句三种形式 2.2掌握if语句的嵌套 2.3.掌握 switch语句

【重点】关系、逻辑表达式的运算,if语句的使用 【难点】使用if语句和switch语句实现多分支

第五章 循环结构程序设计(4学时) 目的与要求:熟练掌握各种循环(while循环、do-while循环、for循环),掌握循环嵌套的使用,理解break语句和continue语句的使用

难点与重点:循环语句的使用,循环结构程序设计方法 教学内容:

第一节(2学时) 1.1掌握while语句 1.2掌握do-while语句 1.3掌握for语句

【重点】条件判断、while、do-while、for循环语句的执行过程 【难点】正确表达while、do-while、for循环语句的结构 第二节(2学时) 2.1掌握循环嵌套 2.2掌握break语句 2.3掌握continue语句

2.4应用循环结构程序设计

【重点】for循环和循环嵌套,break语句和continue语句执行过程 【难点】循环嵌套、break和continue语句区别 第六章 函数(4学时)

目的与要求:熟练掌握函数的定义和调用,掌握函数参数传送,理解变量的作用域和生存期 难点与重点:函数相关概念及使用方法,变量作用域和生存期 教学内容:

第一节(2学时)

1.1掌握函数定义的方法

1.2掌握函数参数的概念及使用 1.3掌握函数类型的概念

1.4掌握函数返回值的概念及使用方法 1.5掌握函数声明

【重点】函数的定义,函数的参数传递形式,函数返回值 【难点】参数传递的形式,函数返回值 第二节(2学时)

2.1掌握函数调用的方法 2.2了解递归函数概念

2.3掌握变量的作用域和生存期

【重点】函数调用,变量的作用域和生存期 【难点】递归调用,变量的作用域和生存期 第七章 数组(4学时)

目的与要求:熟练掌握一维、二维数组的定义和基本操作,掌握字符数组的定义和基本操作 难点与重点:一维、二维数组的定义和基本操作,字符数组的使用 教学内容:

第一节(2学时) 1.1掌握数组的概念

1.2掌握一维数组的定义、初始化及引用 1.3掌握一维数组的输入输出

1.4应用一维数组的操作(平均值、最值、排序等) 【重点】一维的定义,以为数组的基本操作

【难点】数组的基本操作(平均值、最值、排序等) 第二节(2学时)

2.1掌握二维数组的定义、初始化及引用 2.2掌握二维数组的操作

2.3掌握字符数组的定义、初始化及引用

2.4了解字符串处理函数

【重点】二维数组的操作、字符数组、字符串及字符串结束标记、字符串处理函数 【难点】常用字符及字符串处理函数 第八章 指针(4学时)

目的与要求:理解指针的基本概念,掌握指针的基本运算及应用 难点与重点:指针的相关概念及应用,指针与数组 教学内容:

第一节(2学时)

1.1了解变量与地址的概念 1.2掌握指针与变量的概念

1.3掌握指针的定义、引用及初始化 1.4.掌握指针运算

【重点】指针与变量,指针的定义、引用及初始化 【难点】指针的初始化、指针引用 第二节(2学时)

2.1掌握指针与数组的应用 2.2掌握指针与字符串的应用 2.3了解指针与函数

【重点】利用指针处理变量,指针指向数组、指向字符串 【难点】指针与字符串、指针与数组 第九章 结构体(2学时)

目的与要求:掌握结构体类型的定义,掌握结构体类型变量、数组、指针的定义,初始化和应用,了解typedef定义类型

教学内容:

1掌握结构体类型的定义

2掌握结构体变量的定义、引用、初始化 3掌握结构体嵌套

4了解结构体变量作为函数参数 5掌握结构体指针 6了解结构体数组

7了解结构体数组作为函数参数 8应用typedef定义类型

【重点】结构体类型变量、指针的定义,初始化和应用、结构体嵌套、结构体数组定义、初始化和应用,结构体数组作为函数参数

【难点】结构体嵌套、结构体指针与结构体数组 第十章 文件(2学时)

目的与要求:了解文件的概念,熟练掌握文件的建立和访问 教学内容:

1了解文件概述、文件类型指针、文件的打开和关闭方法 2了解文件的读写方法 3了解文件的定位方法 【重点】文件读写操作 【难点】文件读写操作

(二)实验教学(26学时)

目的和要求:通过本课程的上机操作实践,理解结构化程序设计的基本思想,掌握C语言程序设计的控制结构、函数、数组、指针、结构体及文件等相关知识,培养学生的计算思维能力,使学生学会用计算思维方法求解问题,增强解决问题的编程实践能力。

1、 必修实验项目 序号 1 2 3 4 5 6 项目编码 07014047 07014048 07014049 07014050 07014051 07014052 项目名称 C语言简单程序设计 (4学时) C语言控制结构程序设计 (4学时) C语言函数程序设计 (4学时) C语言数组程序设计 (4学时) C语言指针程序设计 (4学时) C语言综合应用程序设计 (6学时) 五、考核方式与评分标准:

(一)成绩核算办法

1、总成绩过程与函数设计

总成绩(100%) 2、分项成绩

课堂成绩(100%) 实践成绩(100%) 实验成绩(100%) 平时成绩(%) 15 0 100 期中成绩(%) 0 0 0 期末成绩(%) 85 0 0 课堂成绩(%) 70 实践成绩(%) 0 实验成绩(%) 30 (二)成绩评定方式

1、平时成绩:考勤、随堂测验、课外延伸、作业、实验完成情况及撰写报告质量等考查; 2、期末成绩:课程结束时,闭卷机考成绩。

六、主要教材及参考书:

(一)教材:

苏小红等著,《C语言程序设计》(第三版),高等教育出版社,2015年 苏小红等著,《C语言程序设计学习指导》(第三版),高等教育出版社,2015年 (二)参考书:

Ivor Horton[美]著,《C语言入门经典》(第五版),清华大学出版社,2015年 Brian W.Kernighan,Dennis M. Ritchie[美]著,《C程序设计语言》(第二版),机械工业出版社,2015年

K.N.King[美]著,《C语言程序设计现代方法》(第二版),人民邮电出版社,2015年 谭浩强著,《C程序设计》(第三版),清华大学出版社,2014年 七、其它

(一) 课程网站及其它网络教学资源:

课程教学网站:http://studymooc.swpu.edu.cn/course/53805.html

授 课 日 历

周次 授课时间 授课内容 重点、难点 作业、实验 课后记录 1 02月27日 C语言的发展历程 重点:书写格式及规则、标识符、基本数据为什么要学C语言 软件开发过程及开发环境 类型 C程序书写格式与规则 难点:C程序的开发过程 C程序标识符、基本数据类型 常量、变量 算术运算符、关系运算符、逻辑运算符及其表达式 赋值、自增自减运算、强制转换运算符、逗号运算符、条件运算符及表达式 习题2.1(教材P24) 2 03月6日 重点:变量的定义和初始、运算符和表达式的优先级、强制转换运算、赋值和条件运算 习题2.2(教材P24) 难点:变量的定义和初始化 习题3.1,3.2(教材P40) 自增、自减运算符的使用 3 C语句 03月13日 字符的输入输出 数据的格式化屏幕输出 重点:语句和printf函数 难点: printf函数 scanf函数 习题4.1-4.3(教材P56) 2 实验目的: (1)熟悉C程序的开发环境和开发过程 实验一:简单程序设计(一) (2)掌握赋值语句和常用标准函数的使用(3)掌握数据的输入输出 if语句 switch语句 重难点:if语句,switch语句 实验报告 4 03月20日 习题5.3 5.5. (教材P95) 3 实验目的: 实验一:简单程序设计(二) (1)掌握数据的输入输出 (2)顺序程序设计编程 实验报告 5 循环控制结构与循环语句 03月27日 计数控制、条件控制的循环 嵌套循环 实验二: 控制结构程序设计(一) 循环辅助控制(break,continue) 结构化设计的核心思想 控制结构常见算法举例 重难点:while、do while、for循环结构,习题6.1,6.2(教材嵌套循环 P137) 实验目的: (1)掌握“条件”的正确表示 (2) 掌握使用if语句和switch语句实现程序的分支 4 实验报告 6 04月3日 重难点:循环辅助控制(break,continue) 习题6.15,6.10 (教材 穷举法和迭代法 P160) 5 实验二: 控制结构程序设计(二) 实验目的: (1)掌握for循环、while循环、do-while实验报告 循环的使用 (2)掌握多重循环的使用 重点:函数参数和返回值 难点:函数地址传递和递归调用 习题7.1,7.2 (教材P184) 7 函数的定义 04月10日 函数调用、参数、返回值 函数原型、递归函数 7 实验目的: 实验三:函数程序设计(一) (1)掌握函数的定义和调用 (2)了解函数间的参数传送 实验报告 8 变量的作用域与存储类型 04月17日 模块化程序设计方法 预处理 重点:全局和局部变量,静态和动态变量。带参的宏定义 习题7.5 (教材P186) 难点:全局变量和静态变量、带参的宏定义 8 实验目的: 实验三:函数程序设计(二) (1)掌握函数的定义和调用 (2)了解函数间的参数传送 重点:一维和二维数组的定义、初始化和引用 难点:常用的排序和查找算法 实验报告 9 一维和二维数组的定义、初始化和引用 04月24日 向函数传递一维数组 常用的排序和查找算法 习题8.1,8.2 (教材P222) 9 实验目的: 实验四:数组程序设计(一) (1)掌握数组的定义和使用 (2)掌握使用数组的常用算法 向函数传递二维数组 字符数组与字符串 字符数组输出与输出 字符串处理函数 实验报告 10 05月1日 重点:字符数组输出与输出、字符串处理函数 难点:向函数传递二维数组、字符串处理函习题10.3(教材P287) 数 10 实验目的: 实验四:数组程序设计(二) (1)掌握数组的定义和使用 (2)掌握使用数组的常用算法 实验报告 11 05月8日 变量的内存地址 指针变量的定义和初始化 指针和数组 重点:指针变量的定义和初始化。指针使用 习题9.1,9.3(教材难点:指针和数组 P255) 11 实验目的: 实验五:指针程序设计(一) (1)掌握指针的定义和指针的运算 (2)掌握用指针处理变量和数组 实验报告 12 指针数组 05月15日 用指针变量作函数参数 动态内存分配函数 重点:用指针变量作函数参数 难点:指针数组 习题11.1(教材P332) 12 实验目的: 实验五:指针程序设计(二) (1)掌握指针的定义和指针的运算 (2)掌握用指针处理变量和数组 实验报告 13 用typedef 定义数据类型 05月22日 结构体变量及结构体数组的定义、初始化和成员的引用 重难点:用typedef 定义数据类型 结构体变量及结构体数组的定义、初始化和习题12.1(教材P378) 成员的引用 实验目的:结合前面学过的C语言知识,运用数组以及字符串操作实现学生管理系实验报告 统的基本功能 13 实验九:综合练习(一) 14 结构体指针的定义、初始化和05月29日 成员的引用,结构体与函数 共用体 重难点:结构体指针的定义、初始化和成员 的引用,结构体与函数 14 实验九:综合练习(二) 实验目的:运用函数、指针等知识添加学生实验报告 管理系统的功能,增强系统的可用性 15 文本文件与二进制文件 06月05日 文件的打开和关闭 文件的读和写 重难点:文本文件与二进制文件,文件的打复习 开和关闭,文件的读和写 实验目的:通过使用文件,完成具有一定难度的综合设计题目的编写、调试、运行工作,实验报告 进一步掌握面向过程程序设计的基本方法,从而提高分析问题、解决问题的能力。 15 实验九:综合练习(三) 第 1 次 课

日期 2016/02/27 周次 1 星期 一 学时 2

一、『学习目标』

了解C语言出现的历史背景

掌握C语言程序的结构、书写格式和上机步骤 知道C语言的基本数据类型

二、『教学内容』

C语言概述

C语言的发展过程

C语言版本、C语言的特点 简单的C程序介绍 标识符、基本数据类型

三、『重点及难点』

C语言程序的结构及其特点 C语言上机步骤

四、『学习方法』

本章概念和知识点较多,学习的时候注意不能死记硬背,要分清知识点的轻重程度。对于计算机语言的发展,只要了解其主要过程就可以了;对于程序设计方法和C语言的特点,不能在本章范围内孤立学习,要结合下面相应的章节以及亲自上机实践才能掌握,并且这是个渐进的过程,不能一蹴而就;对于C集成开发环境的使用则一定要通过实际的动手操作才能熟悉。

五、『知识点』

计算机语言;机器语言;汇编语言;高级语言。 程序;程序设计;程序设计方法。 结构化程序设计;面向对象程序设计。 标识符,关键字,I/O流。

程序调试,语法错误,逻辑错误。 int、float、double、char

六、『教学设计』

首先以讲故事的方式,向学生展现计算机以及程序设计的无穷魅力,让学生了解计算机对人类生活的影响,以及如何成为“编 程高手”。

根据教材目录引出这门课程要讲述的主要内容。然后对《C程序设计》课程要求及目标进行说明,对教学进度及学时安排情况进行总体介绍。帮助学生认识学习本课程的重要性,介绍本课程的学习方法。

然后引出本次课应该学习的内容。先以简单的C程序实例说明C程序的基本组成。

然后进一步介绍C程序的基本语法成分,主要从字符集、关键字、标识符介绍。

Visual C++简介,主要说明一个Visual C++程序的编写和运行过程,着重介绍程序调试过程中经常出现的语法错误和逻辑错误,要求同学在今后上机实践中千万要注意。

教学内容介绍完毕,强调本次课学生容易出错的地方,提出问题并与同学们讨论。 总结本节课内容,重申学习目标,再次强调本课重点。

布置课后作业及上机任务,辅导答疑以及课后延伸阅读等课后任务。

七、『教学过程』 1导课(3分钟)

1)知道目前的流行编程语言吗? 2)为什么要学习C语言?

2课程介绍(8分钟)

本课程是作为程序设计第一语言为非计算机专业开设的计算机基础课程。它将传统的面向过程的内容、现代的面向对象的内容和MFC编程三部分有机地结合在一起。它强调培养学生的程序设计能力,讲授语法知识时力求从实用的角度出发,着重难点和重点的介绍,而语法细节由学生课后自学完成,既可解决学时相对紧张和内容相对较多的矛盾,又可在一定程度上培养学生的自学能力。算法上力求从简入繁、化繁为简。通过本课程的学习,使学生不仅具备扎实的面向过程的程序设计的能力,而且掌握面向对象程序设计方法和MFC编程的思想,为在以后的学习或工作中,通过补充适当的知识而能够使用Visual C++编程解决各自专业领域的计算机应用问题打下一个良好的基础。

然后对《C语言程序设计》课程要求及目标进行说明,对教学进度及学时安排情况进行总体介绍。

3讲授内容(69分钟)

3.1新课引入

计算机仅仅只是一个数据处理机,它只能识别二进制的信息,计算机语言可以看成是一个人机接口,让计算机按照人们的意愿来进行数据处理。C语言比其他一些编程语言要稍微复杂一些。它复杂的地方主要在于指针部分,可以这样说,如果指针部分没有学好的话,那么整个C语言是没有学好的。在开始学习C语言之前,我们先一起来了解一下C语言的发展历史。

3.2 C语言发展历史

CPL语言-〉BCPL语言-〉B语言-〉C语言

CPL语言是1963年英国剑桥大学发明的。BCPL语言是在CPL语言基础上演变而来的。它是对CPL语言的一个简化。

在1970年由美国贝尔实验室将CPL语言改写成为了B语言。

1972年,美国贝尔实验室的D.Ritchie将B语言发展成为了C语言,D.Ritchie独自完成了整个C语言的定义,而且C语言是非常短小精悍的。

C语言的重要性可以从Unix操作系统来体现,Unix以前的版本是用70%的汇编和30%的B语言来编写的,当时的代码量非常少,并且功能很弱,没有得到广泛的使用,在1973年的时候K.Thompson和D.Ritchie合作将UNIX重写了一遍,在重写的过程中不但将代码换成

了C语言来编写,并且增强了功能,代码量变为以前的3倍,把Unix改成了多进程的系统,从此奠定了Unix操作系统的基础,Unix操作系统开始被移植到了大中小各种型号的计算机上,很快就变得很流行。

1977年D.M.Ritchie发表了不依赖于具体及其的C语言编译文本,使得C语言成为了一个跨平台的语言,C语言开始移植到了大、中、小、微型计算机上。很快成为了世界上应用最为广泛的程序设计高级语言。 程序设计语言的发展

机器语言汇编语言 高级语言 面向过程

3.3 C语言特点

面向对象 1.语言简洁、紧凑、灵活 c=c+1 c+=1 c++ 2.运算符和数据类型丰富

34个运算符号 位操作 逻辑运算 指针运算

3.数据类型丰富

标准类型 浮点 整形 字符型 可以自己构造数据类型 结构体 共同体 4.C语言是完全模块化和结构化的语言 5.语法不太严格,程序设计自由度大

6.C语言允许直接访问物理地址,可以直接对硬件进行操作 7.生成目标代码质量高,程序执行效率高。 8.用 C语言编写的程序可移植性好。 3.4 C程序格式和结构特点

例1.1 第一个程序 Hello,World!

/* example1.1 The first C Program*/ #include main() {

printf(“Hello,World!”); }

输出:

Hello,World! 例1.2

/* example1.1 calculate the sum of a and b*/ #include

/* This is the main program */ main()

{ int a,b,sum;

a=10; b=24;

sum=add(a,b);

printf(”sum= %d\\n\}

/* This function calculates the sum of x and y */ int add(int x,int y)

main( ) { int z;

{ z=x+y;

int i , j , sum; return(z);

sum=0; }

for(i=1; i<10;i++)

{ 格式特点

for(j=1;j<10;j++) 习惯用小写字母,大小写敏感

{ 不使用行号,无程序行概念

sum+=i*j ; 可使用空行和空格

} 常用锯齿形书写格式 } 优秀程序员的素质之一: printf(“%d\\n”,sum); 使用TAB缩进 } {}对齐 有足够的注释 有合适的空行

通过以上几个李子,可以看到: (1)C程序是由函数构成

(2)一个函数由两部分组成:函数首部和函数体

(3)一个C程序总是从main函数开始执行,而不论main函数在整个程序中的位置如何 (4)C程序书写格式自由,一行内可以写几个语句,一个语句可以分写在多行上,C程序中没有行号。

(5)每个语句和数据声明的最后必须有一个分号。分号是C语句的必要组成部分。 (6)C语言本身没有输入输出语句。

(7)可以用/* */对C程序中的任何一行或数行做注释。 3.5 运行C语言的步骤与方法 C程序开发步骤

编辑 程序代码的录入,生成源程序*.c 编译 语法分析查错,翻译 链接 与其它目标程序或库 执行 内容 源程序 目标程序 可执行程序 机器语言 可以 .exe 程序设计语言 机器语言 不可以 .c 不可以 .obj 可执行 文件名后缀 为了编译、连接和运行C程序,必须要有相应的C编译系统。目前使用的大多数C编译系统都是继承开发环境(IDE)的,把程序的编辑、编译、连接和运行等操作全部集中在一个界面上进行,功能丰富,使用方便,直观易用。

有许多的编译系统可以对C程序进行操作,常用的有TurboC2.0、TurboC3.0、Visual C++6.0等。由于TurboC是用在Dos环境的,并且不支持鼠标操作,因此现在一般都在Visual C++ 6.0中调试和运行C程序。

1.Visual C++ 6.0是在Windows环境中工作的 2.输入和编辑源代码 3.程序的编译和连接

4、学生容易出错的地方(3分钟)

如何区分用户自定义合法标识符、预定义标识符、关键字这三者的区别。 格式化输出时不注意要输出的数据类型与格式控制符的统一。 格式化输入时不注意格式控制,比如各数据之间可以采用空格、Tab键或Enter键分隔。

5、问题与讨论(10分钟)

何时在一个#include中使用尖括号?何时使用双引号?

C语言的书写格式有哪些特点?

格式化输入时,可以用哪些键将各数据之间分隔。

6、知识要点回顾(5分钟)

1)简介:C语言最初是为设计UNIX操作系统而开发的一种优秀的结构化程序设计语言。

2)点:灵活、高效、通用性、可移植性好,功能强大。

3)程序结构:C程序是由一个或多个函数组成的,其中必须要有一个main()函数。程序从main函数开始执行,到main函数结束。在一个函数内,语句的执行是从上到下的。

基本语法成分:

• 可用字符集中包含26个大小写英文字母、十个数字字符以及一些运算符。

• 标识符:以字母或下划线开始的,由字母、数字字符和下划线组成的字符串,用来标识变量名、符号常量名、函数名、类名等。

• 关键字:有特定含义的、用户不能用来命名自定义的变量、符号常量、函数、类的特殊标识符。

标准输入输出:printf和scanf函数的介绍

简单介绍C集成开发环境,以及在该环境下从编辑、编译、连接到运行的程序开发过程以及调试程序中的常见错误。

了解程序的使用,进一步熟悉VC环境的使用。重点掌握数据输入、输出函数及其格式控制的步头文件。细节不能死记,对于无把握的细节,要在上机中进行测试,并学会用使用帮助。

7、课后任务(2分钟)

1)整理课堂笔记。

2)完成老师布置的课后作业:习题3、5(教材P20)。 3)完成老师布置的上机实验:熟悉C环境,将例本节例子在该环境下编辑、调试、运行。

4)辅导答疑:教学互动社区上进行辅导答疑。 5)延伸阅读:C的发展简史。

第 2 次 课

日期 2016/3/6 周次 2 星期 一 学时 2

一、『学习目标』

应熟悉C语言中的运算符和表达式 应会掌握字符串常量与字符常量的区别 应会掌握转义字符的使用 应会各类数据混合运算

熟悉常用运算符的优先级和结合性。

掌握算术运算符、赋值运算符,条件运算符、逗号运算符和表达式的使用

二、『教学内容』

基本数据类型 标识符 常量与变量 运算符与表达式

算术运算符和算术表达式 赋值运算符和赋值表达式 条件运算符和条件表达式 逗号运算符和逗号表达式

三、『重点及难点』

重点:C 语言的基本数据类型及其常用运算符和表达式,运算符的优先级问题 难点:不同数据类型的使用范围,数据的隐式转换问题,运算符的优先级问题

四、『学习方法』

由于本节内容语法点比较多,所以在教学中结合多个小程序,在练习中掌握各知识点。 通过实例操作,体会语法点,由教师与同学共同总结。

五、『知识点』

基本数据类型,构造数据类型。

整型、实型、指针、空类型、字符型和布尔型。 数组类型、结构体类型、共用体(联合)类型 算术运算符和算术表达式 赋值运算符和赋值表达式 条件运算符和条件表达式 逗号运算符和逗号表达式

优先级和结合性、单目运算、双目及三目运算

六、『教学设计』

首先根据提问引出本次课将讲授的内容;

然后引出数据类型的概念,数据类型是按被说明量的性质,表示形式,占据存储空间的多少,构造特点来划分的。然后引出数据类型的分为基本类型和构造类型两类;

接着介绍基本类型数据的存储和数据范围;

而基本类型数据又分为常量和变量,在程序中,常量是可以不经说明而直接引用的,而变量则必须先说明后使用。

正是丰富的运算符和表达式使C语言功能十分完善。 这也是C语言的主要特点之一。于是开始介绍C各种运算符以及各种表达式。

先介绍C语言中,运算符的运算优先级共分为15级,1级最高,15级最低。而在一个运算量两侧的运算符优先级相同时, 则按运算符的结合性所规定的结合方向处理。

变量的数据类型是可以转换的。然后介绍转换的方法有两种, 一种是自动转换,一种是强制转换。

教学内容介绍完毕,强调本次课学生容易出错的地方,提出问题并与同学们讨论。 总结本节课内容,重申学习目标,再次强调本课重点。

布置课后作业及上机任务,辅导答疑以及课后延伸阅读等课后任务。

七、『教学过程』 1导课(2分钟)

程序中要对用到的数据都必须指明其类型。那么数据类型的作用是什么? 整型、浮点型、字符型变量分别如何定义、在内存中分别占据的存储单元? 学习了数据结构,混合类型数据运算时如何转换?谁该优先计算和处理?

2讲授内容(80分钟)

2.1 C语言中的数据类型

程序的主要部分是由数据和执行语句组成的,计算机处理的对象是数据,计算机里有多种数据,常见的整形、浮点型等等。因此编程语言里面也会有对这些数据的定义,今天我们来学习C语言中的数据类型。

在C语言中,数据类型可分为:基本数据类型,构造数据类型,指针类型,空类型四大类。

整型 int

基本类型

字符型 char 实型(浮点型) 数组类型

数据类型

构造类型

结构类型 struct 联合类型 union

指针类型

枚举类型 enum

单精度实型 float

双精度实型 double

空类型(无值类型) void

⑴、基本数据类型:基本数据类型最主要的特点是,其值不可以再分解为其它类型。也就是说,基本数据类型是自我说明的。 ⑵、构造数据类型:构造数据类型是根据已定义的一个或多个数据类型用构造的方法来定义的。也就是说,一个构造类型的值可以分解成若干个“成员”或“元素”。每个“成员”都是一个基本数据类型或又是一个构造类型。在C语言中,构造类型有以下几种: ·数组类型 ·结构体类型 ·共用体(联合)类型

⑶、指针类型:指针是一种特殊的,同时又是具有重要作用的数据类型。其值用来表示某个变量在内存储器中的地址。虽然指针变量的取值类似于整型量,但这是两个类型完全不同的量,因此不能混为一谈。

⑷、空类型:在调用函数值时,通常应向调用者返回一个函数值。这个返回的函数值是具有

a 变量名 3 变量值 存储单元一定的数据类型的,应在函数定义及函数说明中给以说明,例如在例题中给出的max函数定义中,函数头为:int max(int a,int b);其中“int ”类型说明符即表示该函数的返回值为整型量。又如在例题中,使用了库函数sin,由于系统规定其函数返回值为双精度浮点型,因此在赋值语句s=sin (x);中,s 也必须是双精度浮点型,以便与sin函数的返回值一致。所以在说明部分,把s说明为双精度浮点型。但是,也有一类函数,调用后并不需要向调用者返回函数值,这种函数可以定义为“空类型”。其类型说明符为void。在后面函数中还要详细介绍。 在本章中,我们先介绍基本数据类型中的整型、浮点型和字符型。其余类型在以后各章中陆续介绍。

2.2 常量与变量

对于基本数据类型量,按其取值是否可改变又分为常量和变量两种。在程序执行过程中,其值不发生改变的量称为常量,其值可变的量称为变量。它们可与数据类型结合起来分类。例如,可分为整型常量、整型变量、浮点常量、浮点变量、字符常量、字符变量、枚举常量、枚举变量。在程序中,常量是可以不经说明而直接引用的,而变量则必须先定义后使用。 整型量包括整型常量、整型变量。 直接常量(字面常量): 整型常量:12、0、-3; 实型常量:4.6、-1.23; 字符常量:‘a’、‘b’。 标识符:用来标识变量名、符号常量名、函数名、数组名、类型名、文件名的有效字符序列。 符号常量:用标示符代表一个常量。在C语言中,可以用一个标识符来表示一个常量,称之为符号常量。

习惯上符号常量的标识符用大写字母,变量标识符用小写字母,以示区别。 用标识符代表一个常量,称为符号常量。

符号常量与变量不同,它的值在其作用域内不能改变,也不能再被赋值。 使用符号常量的好处是: 含义清楚;

能做到“一改全改”。

其值可以改变的量称为变量。 在C语言中,有3类标识符:

(1)关键字。C语言规定了32个关键字,如int、float、for、if、else等,它们有特定的用途和含义,不能用作变量名。

(2)系统预订一的标识符。如系统提供的库函数的名字sin、printf、main等以及预编译命令define等。系统允许把它们另作它用,但这就会使它们失去原有作用,容易产生混乱,建议不要把它们用作变量名。

(3)用户标识符。即用户自己定义的标识符,用来给程序中的变量、函数、符号常量、数组、结构体、公用体、文件等命名。 C语言规定:

标识符只能由字母、数字和下划线3种字符组成,且第一个字符必须为字母或下划线。

2.3整型数据

整型常量的表示方法:

整型常量就是整常数。在C语言中,使用的整常数有八进制、十六进制和十进制三种。 十进制整常数:十进制整常数没有前缀。其数码为0~9。

八进制整常数:八进制整常数必须以0开头,即以0作为八进制数的前缀。数码取值为0~7。八进制数通常是无符号数。 2.4整型变量

整型数据在内存中的存放形式

如果定义了一个整型变量i:int i;i=10;

0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 有符号整型变量:最大表示32767

0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 无符号整型变量:最大表示65535

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 Turbo C中各类整型量所分配的内存字节数及数的表示范围。 类型说明符 int unsigned int short int unsigned short int long int unsigned long 以13为例: int型: 00 00 00 00 00 00 11 01 short int型: 数的范围 -32768~32767 即-215~(215-1) 0~65535 即0~(216-1) -32768~32767 即-215~(215-1) 0~65535 即0~(216-1) -21474838~21474837即-231~(231-1) 0~4294967295 即0~(232-1) 字节数 2 2 2 2 4 4 00 00 00 00 00 00 11 01 long int型: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 11 01 unsigned int型: 00 00 00 00 00 00 11 01 unsigned short int型: 00 00 00 00 00 00 11 01 unsigned long int型: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 11 01 整型变量的定义

变量定义的一般形式为:

类型说明符 变量名标识符,变量名标识符,...; 例如:

int a,b,c; (a,b,c为整型变量) long x,y; (x,y为长整型变量) unsigned p,q; (p,q为无符号整型变量) 在书写变量定义时,应注意以下几点:

允许在一个类型说明符后,定义多个相同类型的变量。各变量名之间用逗号间隔。类型说明符与变量名之间至少用一个空格间隔。 最后一个变量名之后必须以“;”号结尾。

变量定义必须放在变量使用之前。一般放在函数体的开头部分。 2.5 实型数据

实型常量的表示方法

实型也称为浮点型。实型常量也称为实数或者浮点数。在C语言中,实数只采用十进制。它有二种形式:十进制小数形式,指数形式。 十进制数形式:由数码0~ 9和小数点组成。 实型变量

类型说明符 float double long double 比特数(字节数) 有效数字 32(4) (8) 128(16) 6~7 15~16 18~19 数的范围 10-37~1038 10-307~10308 10-4931~104932 实型变量定义的格式和书写规则与整型相同。

2.6 字符型数据

字符型数据包括字符常量和字符变量。 字符常量

字符常量是用单引号括起来的一个字符。 转义字符

转义字符是一种特殊的字符常量。转义字符以反斜线\"\\\"开头,后跟一个或几个字符。转义字符具有特定的含义,不同于字符原有的意义,故称“转义”字符。例如,在前面各例题printf函数的格式串中用到的“\\n”就是一个转义字符,其意义是“回车换行”。转义字符主要用来表

示那些用一般字符不便于表示的控制代码。 实例(具体见ppt) 2.7 变量赋初值

在程序中常常需要对变量赋初值,以便使用变量。语言程序中可有多种方法为变量提供初值。本小节先介绍在作变量定义的同时给变量赋以初值的方法。这种方法称为初始化。在变量定义中赋初值的一般形式为:

类型说明符 变量1= 值1,变量2= 值2,……; 各类数值型数据之间的混合运算

变量的数据类型是可以转换的。转换的方法有两种,一种是自动转换,一种是强制转换。自动转换发生在不同数据类型的量混合运算时,由编译系统自动完成。自动转换遵循以下规则: 若参与运算量的类型不同,则先转换成同一类型,然后进行运算。

转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int量转成long型后再进行运算。

所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算。

char型和short型参与运算时,必须先转换成int型。 在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度左边长时,将丢失一部分数据,这样会降低精度,丢失的部分按四舍五入向前舍入。 2.8 强制类型转换

强制类型转换是通过类型转换运算来实现的。 其一般形式为:

(类型说明符) (表达式)

其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。 例如:

(float) a 把a转换为实型

(int)(x+y) 把x+y的结果转换为整型 在使用强制转换时应注意以下问题:

类型说明符和表达式都必须加括号(单个变量可以不加括号),如把(int)(x+y)写成(int)x+y则成了把x转换成int型之后再与y相加了。 无论是强制转换或是自动转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,而不改变数据说明时对该变量定义的类型。 2.9 算术运算符和算术表达式

C语言中运算符和表达式数量之多,在高级语言中是少见的。正是丰富的运算符和表达式使C语言功能十分完善。这也是C语言的主要特点之一。 C语言的运算符不仅具有不同的优先级,而且还有一个特点,就是它的结合性。在表达式中,各运算量参与运算的先后顺序不仅要遵守运算符优先级别的规定,还要受运算符结合性的制约,以便确定是自左向右进行运算还是自右向左进行运算。这种结合性是其它高级语言的运算符所没有的,因此也增加了C语言的复杂性。 C运算符简介

C语言的运算符可分为以下几类:

算术运算符:用于各类数值运算。包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)、自增(++)、自减(--)共七种。 关系运算符:用于比较运算。包括大于(>)、小于(<)、等于(==)、 大于等于(>=)、小于等于(<=)

和不等于(!=)六种。

逻辑运算符:用于逻辑运算。包括与(&&)、或(||)、非(!)三种。

位操作运算符:参与运算的量,按二进制位进行运算。包括位与(&)、位或(|)、位非(~)、位异或(^)、左移(<<)、右移(>>)六种。

赋值运算符:用于赋值运算,分为简单赋值(=)、复合算术赋值(+=,-=,*=,/=,%=)和复合位运算赋值(&=,|=,^=,>>=,<<=)三类共十一种。

条件运算符:这是一个三目运算符,用于条件求值(?:)。 逗号运算符:用于把若干表达式组合成一个表达式(,)。 指针运算符:用于取内容(*)和取地址(&)二种运算。

求字节数运算符:用于计算数据类型所占的字节数(sizeof)。 特殊运算符:有括号(),下标[],成员(→,.)等几种。 算术运算符和算术表达式 2.10 基本的算术运算符

加法运算符“+”:加法运算符为双目运算符,即应有两个量参与加法运算。如a+b,4+8等。具有右结合性。

减法运算符“-”:减法运算符为双目运算符。但“-”也可作负值运算符,此时为单目运算,如-x,-5等具有左结合性。

乘法运算符“*”:双目运算,具有左结合性。

除法运算符“/”:双目运算具有左结合性。参与运算量均为整型时,结果也为整型,舍去小数。如果运算量中有一个是实型,则结果为双精度实型。

求余运算符(模运算符)“%”:双目运算,具有左结合性。要求参与运算的量均为整型。 求余运算的结果等于两数相除后的余数。 2.11 算术表达式和运算符的优先级和结合性

表达式是由常量、变量、函数和运算符组合起来的式子。一个表达式有一个值及其类型, 它们等于计算表达式所得结果的值和类型。表达式求值按运算符的优先级和结合性规定的顺序进行。单个的常量、变量、函数可以看作是表达式的特例。 算术表达式是由算术运算符和括号连接起来的式子。

算术表达式:用算术运算符和括号将运算对象(也称操作数)连接起来的、符合C语法规则的式子。

运算符的优先级:C语言中,运算符的运算优先级共分为15级。1级最高,15级最低。在表达式中,优先级较高的先于优先级较低的进行运算。而在一个运算量两侧的运算符优先级相同时,则按运算符的结合性所规定的结合方向处理。

运算符的结合性:C语言中各运算符的结合性分为两种,即左结合性(自左至右)和右结合性(自右至左)。例如算术运算符的结合性是自左至右,即先左后右。如有表达式x-y+z则y应先与“-”号结合,执行x-y运算,然后再执行+z的运算。这种自左至右的结合方向就称为“左结合性”。而自右至左的结合方向称为“右结合性”。 最典型的右结合性运算符是赋值运算符。如x=y=z,由于“=”的右结合性,应先执行y=z再执行x=(y=z)运算。C语言运算符中有不少为右结合性,应注意区别,以避免理解错误。 2.12 强制类型转换运算符

其一般形式为:

(类型说明符) (表达式)

其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。 例如:

(float) a 把a转换为实型

(int)(x+y) 把x+y的结果转换为整型 2.13 自增、自减运算符

自增1,自减1运算符:自增1运算符记为“++”,其功能是使变量的值自增1。 自减1运算符记为“--”,其功能是使变量值自减1。

自增1,自减1运算符均为单目运算,都具有右结合性。可有以下几种形式: ++i i自增1后再参与其它运算。 --i i自减1后再参与其它运算。 i++ i参与运算后,i的值再自增1。 i-- i参与运算后,i的值再自减1。

在理解和使用上容易出错的是i++和i--。 特别是当它们出在较复杂的表达式或语句中时,常常难于弄清,因此应仔细分析。

赋值运算符和赋值表达式 2.14赋值运算符

简单赋值运算符和表达式:简单赋值运算符记为“=”。由“= ”连接的式子称为赋值表达式。其一般形式为: 变量=表达式 例如: x=a+b

w=sin(a)+sin(b) y=i+++--j

赋值表达式的功能是计算表达式的值再赋予左边的变量。赋值运算符具有右结合性。因此 a=b=c=5

可理解为 a=(b=(c=5))

在其它高级语言中,赋值构成了一个语句,称为赋值语句。 而在C中,把“=”定义为运算符,从而组成赋值表达式。 凡是表达式可以出现的地方均可出现赋值表达式。 例如,式子:x=(a=5)+(b=8)

是合法的。它的意义是把5赋予a,8赋予b,再把a,b相加,和赋予x,故x应等于13。 在C语言中也可以组成赋值语句,按照C语言规定,任何表达式在其未尾加上分号就构成为语句。因此如x=8;a=b=c=5;

都是赋值语句,在前面各例中我们已大量使用过了。 类型转换

如果赋值运算符两边的数据类型不相同,系统将自动进行类型转换,即把赋值号右边的类型换成左边的类型。具体规定如下:

实型赋予整型,舍去小数部分。前面的例子已经说明了这种情况。

整型赋予实型,数值不变,但将以浮点形式存放,即增加小数部分(小数部分的值为0)。 字符型赋予整型,由于字符型为一个字节,而整型为二个字节,故将字符的ASCII码值放到整型量的低八位中,高八位为0。整型赋予字符型,只把低八位赋予字符量。 2.15 复合的赋值运算符

在赋值符“=”之前加上其它二目运算符可构成复合赋值符。如+=,-=,*=,/=,%=,<<=,>>=,&=,^=,|=。

构成复合赋值表达式的一般形式为: 变量 双目运算符=表达式 它等效于

变量=变量 运算符 表达式 例如:

a+=5 等价于a=a+5 x*=y+7 等价于x=x*(y+7) r%=p 等价于r=r%p

复合赋值符这种写法,对初学者可能不习惯,但十分有利于编译处理,能提高编译效率并产生质量较高的目标代码。 逗号运算符和逗号表达式

在C语言中逗号“,”也是一种运算符,称为逗号运算符。 其功能是把两个表达式连接起来组成一个表达式, 称为逗号表达式。 其一般形式为: 表达式1,表达式2

其求值过程是分别求两个表达式的值,并以表达式2的值作为整个逗号表达式的值。 例如: 表达式1,(表达式2,表达式3)

形成了嵌套情形。因此可以把逗号表达式扩展为以下形式: 表达式1,表达式2,…表达式n 整个逗号表达式的值等于表达式n的值。 程序中使用逗号表达式,通常是要分别求逗号表达式内各表达式的值,并不一定要求整个逗号表达式的值。

并不是在所有出现逗号的地方都组成逗号表达式,如在变量说明中,函数参数表中逗号只是用作各变量之间的间隔符。

3学生容易出错的地方(4分钟)

注意c语言中变量名与其类型无关。

意,空白字符不可出现在整数数字之间。

注意字符’9’和数字9的区别,前者是字符常量,后者是整型常量,它们的含义和在计算机中的存储方式都截然小同。

要特别注意字符串与字符串常量的区别,除了表示形式小同外,其存储性质也不相同,字符‘A‘,只占1个字节,而字符串常量“A”占2个字节。

切记,所有关系和逻辑表达式产生的结果不是0就是1

求余运算两边须都是整型数据,整除运算如果有实型量,则结果为实型量 自增、自减运算符只能作用于整型变量或字符型变量。 各类数据混合运算,注意自动转换和强制转换

格式化输出时不注意要输出的数据类型与格式控制符的统一 格式化输入时不注意格式控制,比如数据以什么分隔等

4问题与讨论(8分钟)

1)变量先定义后使用有了什么好处? 2)字符常量与字符串常量如何区别? 3)混合类型数据运算时如何转换?

4)如果有printf(“%d”,-i++),到底该输出-3,还是4或者其他?

如果不赋值直接使用可能会发生了什么后果?

5知识要点回顾(4分钟)

数据类型、(整型、实型、字符型)的数据表示范围、在内存中占据的存储单元。 掌握常量与变量的定义和使用

掌握整型数据中不同进制的整型常量的表达方式、 符号和无符号的整形变量的定义及数值范围

了解实型常量的两种表达方式、实型变量的定义和使用以及所占的内存单元 掌握字符数据的定义、在内存中的存储形式及其使用方法 各类数据混合运算

运算符的优先级:它是一种运算顺序,规定的是不同运算符混合运算符时的先后顺序。 运算符的结合性:也是一种运算顺序,规定的是相同优先级别的运算符运算时的先后顺序,除赋值运算符、条件运算符和单目运算符是右结合性,其他运算符都是左结合性

运算符的种类:从运算符对操作数的个数(即目数)要求来看, C 语言的运算符分为单目、双目和三目运算符。一般来说,单目运算符较双目运算符的优先级别要高,而双目运算符的优先级别要比三目运算符高,作为一种特殊情况,条件运算符(三目运算符)的级别比双目的赋值运算符高。从运算符的功能来分,有算术运算符、关系运算符、逻辑运算符、赋值运算符等等。

运算符的特殊说明:C/C++中的一些运算符对运算数的类型有特殊限定,有的运算符产生的运算结果具有特定的类型和数值约定,还有的运算符在运算过程中会自动进行类型转换,这些都是掌握运算符的难点。

由常量、变量、函数及运算符组合在一起便构成了表达式。在表达式中,可以用多层小括号来改变运算顺序,但中括号和大括号没有改变运算顺序的作用。设计程序过程中,在书写表达式时,乘号是不能省略的。

6、课后任务(2分钟)

1)整理课堂笔记。

2)完成老师布置的作业:习题1、3 教材P63习题5、7教材P63

3)完成老师布置的上机实验:将例题2-1、2-2在C环境下调试运行。 4)辅导答疑:教学互动社区上进行辅

第 3 次 课

日期 2016/3/12 周次 3 星期 一 学时 2

一、『学习目标』

了解C语句的概念及种类、掌握C语言常用的输入/出方式 学会简单的顺序程序设计

二、『教学内容』

C语句概述 赋值语句

数据输入输出的概念及在C语言中的实现 字符数据的输入输出

putchar 函数(字符输出函数) getchar函数(键盘输入函数) 格式输入与输出

printf函数(格式输出函数) scanf函数(格式输入函数) 顺序结构程序设计举例

三、『重点及难点』

赋值语句

C语言常用的输入/出方式

格式化输入输出在实际编程时的正确应用

四、『学习方法』

本章学习的时候注意不能死记硬背,要分清知识点的轻重程度。通过程序设计操练,熟练掌握编程基础;通过程序的扩展,进行对比学习结构化程序设计

五、『知识点』

顺序结构、选择语句、循环语句, 基本语句和控制语句,

表达式语句、空语句和复合语句;

选择控制语句和循环控制语句,空语句和复合语句

if 语句有 if 单分支、 if-else 双分支和 if-else if 多分支形式;

六、『教学设计』

从简单的问题着手,先要求学生自己编写程序,引入条件语句,同时在程序中讲解相关的语法知识点,提升高度。

通过正反例学习if-else语句的嵌套,采用课堂讨论激发学生思考; 以实例为基础扩张学习if语句和switch语句的应用。

赋值语句:赋值语句是由赋值表达式加上一个分号构成,如:b=3,数据输入输出的概念及在C语言中的实现

字符数据的输入输出

教学内容介绍完毕,强调本次课学生容易出错的地方,提出问题并与同学们讨论。 总结本节课内容,重申学习目标,再次强调本课重点。

布置课后作业及上机任务,辅导答疑以及课后延伸阅读等课后任务。

七、『教学过程』 1导入提问(4分钟)

字符串常量与字符常量的区别

整型、浮点型、字符型变量分别如何定义、在内存中分别占据的存储单元?

2讲授内容(78分钟)

2.1程序的三种基本结构

从程序流程的角度来看,程序可以分为三种基本结构,即顺序结构、分支结构、循环结构。 这三种基本结构可以组成所有的各种复杂程序。C语言提供了多种语句来实现这些程序结构。 本章介绍这些基本语句及其在顺序结构中的应用,对C程序有一个初步的认识, 为后面各章的学习打下基础。

C程序的执行部分是由语句组成的。 程序的功能也是由执行语句实现的。 C语句可分为以下五类:

表达式语句:表达式语句由表达式加上分号“;”组成 函数调用语句:由函数名、实际参数加上分号“;”组成

控制语句:控制语句用于控制程序的流程, 以实现程序的各种结构方式。它们由特定的语句定义符组成。C语言有九种控制语句。 复合语句

空语句:只有分号“;”组成的语句称为空语句。空语句是什么也不执行的语句。在程序中空语句可用来作空循环体。 赋值语句

赋值语句是由赋值表达式再加上分号构成的表达式语句。 2.2数据输入输出的概念及在C语言中的实现

字符输入输出函数 基本的输入输出

getchar函数 putchar函数 printf函数 输出格式控制符 输出宽度和精度 输出宽度和精度 scanf函数 输入格式控制符 输入宽度 重点:printf与scanf的异同

格式输入输出函数

所谓输入输出是以计算机为主体而言的。

本章介绍的是向标准输出设备显示器输出数据的语句。

在C语言中,所有的数据输入/输出都是由库函数完成的。 因此都是函数语句。

在使用C语言库函数时,要用预编译命令

#include将有关“头文件”包括到源文件中。

使用标准输入输出库函数时要用到 “stdio.h”文件,因此源文件开头应有以下预编译命令: #include< stdio.h >或#include ”stdio.h” stdio是standard input &outupt的意思。

考虑到printf和scanf函数使用频繁,系统允许在使用这两个函数时可不加 #include< stdio.h > 或

#include ”stdio.h” 字符数据的输入输出

putchar 函数(字符输出函数)

putchar 函数是字符输出函数, 其功能是在显示器上输出单个字符。 其一般形式为: putchar(字符变量) 例如:

putchar('A'); (输出大写字母A)

putchar(x); (输出字符变量x的值) putchar(‘\\101’); (也是输出字符A) putchar('\\n'); (换行)

对控制字符则执行控制功能,不在屏幕上显示。 使用本函数前必须要用文件包含命令: #include 或#include “stdio.h”

使用getchar函数还应注意几个问题:

getchar函数只能接受单个字符,输入数字也按字符处理。输入多于一个字符时,只接收第一个字符。

使用本函数前必须包含文件“stdio.h”。

在TC屏幕下运行含本函数程序时,将退出TC 屏幕进入用户屏幕等待用户输入。输入完毕再返回TC屏幕。

程序最后两行可用下面两行的任意一行代替: putchar(getchar()); printf(“%c”,getchar()); 格式输入与输出

printf函数(格式输出函数)

printf函数称为格式输出函数,其关键字最末一个字母f即为“格式”(format)之意。其功能是按用户指定的格式,把指定的数据显示到显示器屏幕上。在前面的例题中我们已多次使用过这个函数。

printf函数调用的一般形式

printf函数是一个标准库函数,它的函数原型在头文件“stdio.h”中。但作为一个特例,不要求在使用 printf 函数之前必须包含stdio.h文件。 printf函数调用的一般形式为:

printf(“格式控制字符串”,输出表列) 其中格式控制字符串用于指定输出格式。格式控制串可由格式字符串和非格式字符串两种组成。格式字符串是以%开头的字符串,在%后面跟有各种格式字符,以说明输出数据的类型、形式、长度、小数位数等。如:

“%d”表示按十进制整型输出; “%ld”表示按十进制长整型输出; “%c”表示按字符型输出等。

非格式字符串在输出时原样照印,在显示中起提示作用。

输出表列中给出了各个输出项,要求格式字符串和各输出项在数量和类型上应该一一对应。

3、学生容易出错的地方(3分钟)

函数没有赋给某个变量

输入数据时不注意输出语句的格式

4、问题与讨论(10分钟)

怎样书写输入语句从而在输入时减少出错? 条件语句在程序中怎样使用?

5、知识要点回顾(3分钟)

在表达式运算中,关系运算符与逻辑运算符的优先顺序。 如何表示表达式的值? if语句的执行过程

嵌套if语句的匹配原则

if语句的基本表达形式,为什么要用if语句?

6、课后任务(2分钟)

1)整理课堂笔记。

2)完成老师布置的作业:习题9、11教材P

3)完成老师布置的实验:将题四-1、四-2在VC环境下调试运行 4)辅导答疑:http://jkx.swpu.edu.cn/tech/上进行辅导答疑。

第 4 次 课

日期 2016/3/20 周次 4 星期 一 学时 2

一、『学习目标』

在程序中正确使用语句构成条件判断

使用if 和switch语句编写多分支选择程序。 会使用条件语句的嵌套

二、『教学内容』

if语句嵌套 switch语句 程序举例

三、『重点及难点』

1. 嵌套if-else语句

2. 编写多分支选择程序

四、『学习方法』

本章的知识点不多,但难点较大,学习的时候注意不能死记硬背,要分清知识点的轻重程度。不能在本章范围内孤立学习,要结合前面相应的章节以及亲自上机实践才能掌握,并且这是个渐进的过程,不能一蹴而就;对于循环结构的使用则一定要通过实际的动手操作才能熟悉。程序的实现可以由老师与同学共同完成,三种循环语句的异同点,可由同学们讨论完成。

五、『知识点』

if语句,switch语句,for语句; if语句的嵌套;

六、『教学设计』

从简单的问题着手,先要求学生自己编写程序,引入条件语句,同时在程序中讲解相关的语法知识点,提升高度。

通过过正反例学习选择语句的嵌套,采用课堂讨论激发学生思考。 程序的实现可以由老师与同学共同完成,if语句和switch语句实现多分支语句的异同点,可由同学们讨论完成。

教学内容介绍完毕,强调本次课学生容易出错的地方,提出问题并与同学们讨论。 总结本节课内容,重申学习目标,再次强调本课重点。

布置课后作业及上机任务,辅导答疑以及课后延伸阅读等课后任务。

七、『教学过程』 1 提问(3分钟)

选择语句如何构成? 如何实现if语句的嵌套?

2讲授内容(70分钟)

if语句

用if语句可以构成分支结构。它根据给定的条件进行判断,以决定执行某个分支程序段。C语言的if语句有三种基本形式。 if语句的三种形式

第一种形式为基本形式:if if(表达式) 语句

其语义是:如果表达式的值为真,则执行其后的语句, 否则不执行该语句。其过程可表示为下图。

【例】 main(){

int a,b,max;

printf(\"\\n input two numbers: \"); scanf(\"%d%d\ max=a;

if (max本例程序中,输入两个数a,b。把a先赋予变量max,再用if语句判别max和b的大小,如max小于b,则把b赋予max。因此max中总是大数,最后输出max的值。 第二种形式为: if-else if(表达式)

语句1; else

语句2;

其语义是:如果表达式的值为真,则执行语句1,否则执行语句2 。 其执行过程可表示为下图。

【例】 main(){ int a, b;

printf(\"input two numbers: \"); scanf(\"%d%d\ if(a>b)

printf(\"max=%d\\n\ else

printf(\"max=%d\\n\}

输入两个整数,输出其中的大数。

改用if-else语句判别a,b的大小,若a大,则输出a,否则输出b。 第三种形式为if-else-if形式

前二种形式的if语句一般都用于两个分支的情况。 当有多个分支选择时,可采用if-else-if语句,其一般形式为: if(表达式1)

语句1;

else if(表达式2) 语句2;

else if(表达式3) 语句3; …

else if(表达式m) 语句m; else

语句n;

其语义是:依次判断表达式的值,当出现某个值为真时,则执行其对应的语句。然后跳到整个if语句之外继续执行程序。 如果所有的表达式均为假,则执行语句n。然后继续执行后续程序。 if-else-if语句的执行过程如图3—3所示。

在使用if语句中还应注意以下问题:

在三种形式的if语句中,在if关键字之后均为表达式。 该表达式通常是逻辑表达式或关系表达式, 但也可以是其它表达式,如赋值表达式等,甚至也可以是一个变量。 例如:

if(a=5) 语句; if(b) 语句;

都是允许的。只要表达式的值为非0,即为“真”。 如在:

if(a=5)…;

中表达式的值永远为非0,所以其后的语句总是要执行的,当然这种情况在程序中不一定会出现,但在语法上是合法的。 又如,有程序段: if(a=b)

printf(\"%d\ else

printf(\"a=0\");

本语句的语义是,把b值赋予a,如为非0则输出该值,否则输出“a=0”字符串。这种用法在程序中是经常出现的。

在if语句中,条件判断表达式必须用括号括起来,在语句之后必须加分号。

在if语句的三种形式中,所有的语句应为单个语句,如果要想在满足条件时执行一组(多个)语句,则必须把这一组语句用{}括起来组成一个复合语句。但要注意的是在}之后不能再加分号。 if语句的嵌套

当if语句中的执行语句又是if语句时,则构成了if 语句嵌套的情形。 其一般形式可表示如下:

if(表达式) if语句; 或者为

if(表达式) if语句; else

if语句;

在嵌套内的if语句可能又是if-else型的,这将会出现多个if和多个else重叠的情况,这时要特别注意if和else的配对问题。 例如:

if(表达式1) if(表达式2) 语句1; else 语句2;

其中的else究竟是与哪一个if配对呢? 应该理解为: if(表达式1)

if(表达式2) 语句1; else 语句2; 还是应理解为: if(表达式1) if(表达式2) 语句1; else 语句2;

为了避免这种二义性,C语言规定,else 总是与它前面最近的if配对,因此对上述例子应按前一种情况理解。

实例具体见ppt

3、学生容易出错的地方(4分钟)

if语句条件不用括号括起来 switch语句条件后之间加上分号

不能把关系运算符==混同于赋值运算符 多层if嵌套时,if和else匹配出错 在switch语句中,漏掉break语句

4、问题与讨论(4分钟)

switch语句中为什么要用break语句?

5、知识要点回顾(3分钟)

在if语句中又包含一个或多个if语句称为if语句的嵌套。一般形式如下:

if(表达式1)

if(表达式11) 语句11

else 语句12 else 语句2

应当注意if与else的配对关系。else总是与它上面的最近的if配对。 else-if比switch的条件控制更强大一些

 else-if可以依照各种逻辑运算的结果进行流程控制  switch只能进行==判断,并且只能是整数判断

switch比else-if更清晰

 两者都要尽量避免用得过多、过长,尤其不要嵌套得太多

 它们大大增加程序的分支,使逻辑关系显得混乱,不易维护,易出错

6、课后任务(2分钟)

整理课堂笔记 完成课后习题4.5,4.6,4.7,4.9(教材P152) 从键盘上任意输入四个数,按从小到大的顺序输出。 编写一个程序完成两个数的四则运算。 预习循环结构程序设计

第 5 次 课

日期 2016/3/27 周次 5 星期 一 学时 2

一、『学习目标』

应知循环、循环嵌套的实际应用。

应会分析实际问题,策划流程图,将之转换为循环语句实现。

二、『教学内容』

循环控制结构与循环语句 计数控制、条件控制的循环 嵌套循环

三、『教学要求』

要掌握循环语句的各种变体形式、执行的流程、循环次数的计算, 学会分析死循环或不循环的原因等。

四、『重点及难点』

循环结构的控制 循环嵌套的使用;

五、『学习方法』

个别指导,学生演演示,分析多种解法,指出错误点,记好笔记,鼓励多做快作算法设计 每个程序都争取用三种循环方式写出

六、『知识点』

switch配合使用 break 语句。continue语句; for 语句, while 和 do-while 语句。 流程、循环次数,死循环。

七、『教学设计』

以实例为基础扩张学习引出while语句和do while语句以及for语句 然后以提问:循环语句应该由哪些构成?

以前面所学的顺序结构为基础,求 1 至 100 之间数的累计和。以此为例讲解循环语句的意义。

编程用三种循环输出 1-10 的数据,在数据 7 时分别使 break 和 continue,引导学生观察程序结果,得出结论(熟练循环,并且引入break语句与continue 语句,分析两种语句对循环控制的影响)

要求同学在今后上机实践中千万要注意;;

教学内容介绍完毕,强调本次课学生容易出错的地方,提出问题并与同学们讨论。 总结本节课内容,重申学习目标,再次强调本课重点。

布置课后作业及上机任务,辅导答疑以及课后延伸阅读等课后任务。

八、『教学过程』 1导入课题(7分钟)

循环语句如何构成?如何求1到100之间整数的和?

2讲授内容(70分钟)

循环控制

循环结构是程序中一种很重要的结构。其特点是,在给定条件成立时,反复执行某程序段,直到条件不成立为止。给定的条件称为循环条件,反复执行的程序段称为循环体。C语言提供了多种循环语句,可以组成各种不同形式的循环结构。 用goto语句和if语句构成循环; 用while语句; 用do-while语句; 用for语句;

goto语句以及用goto语句构成循环

goto语句是一种无条件转移语句, 与BASIC中的goto语句相似。goto 语句的使用格式为: goto 语句标号;

其中标号是一个有效的标识符,这个标识符加上一个“:”一起出现在函数内某处, 执行goto语句后,程序将跳转到该标号处并执行其后的语句。另外标号必须与goto语句同处于一个函数中,但可以不在一个循环层中。通常goto语句与if条件语句连用, 当满足某一条件时, 程序跳到标号处运行。

goto语句通常不用,主要因为它将使程序层次不清,且不易读,但在多层嵌套退出时, 用goto语句则比较合理。 【例】用goto语句和if while语句

while语句的一般形式为: while(表达式)语句

其中表达式是循环条件,语句为循环体。

while语句的语义是:计算表达式的值,当值为真(非0)时, 执行循环体语句。其执行过程可用下图表示。

【例】用while语句求n1。

用传统流程图和N-S结构流程图表示算法,见图: main() {

int i,sum=0; i=1;

while(i<=100) {

sum=sum+i;

n100 i++; }

printf(\"%d\\n\}

do-while语句

do-while语句的一般形式为: do

语句

while(表达式);

这个循环与while循环的不同在于:它先执行循环中的语句,然后再判断表达式是否为真, 如果为真则继续循环;如果为假, 则终止循环。因此, do-while循环至少要执行一次循环语句。其执行过程可用下图表示。

【例】用do-while语句求n1。

用传统流程图和N-S结构流程图表示算法,见图:

n100

main() {

int i,sum=0; i=1; do {

sum=sum+i; i++; }

while(i<=100)

printf(\"%d\\n\

}

同样当有许多语句参加循环时, 要用\"{\"和\把它们括起来。

3、学生容易出错的地方(3分钟)

for语句的执行顺序 循环语句的执行次数

写循环语句时不知道怎样选取循环变量 写循环时不考虑结束,造成死循环。 循环语句执行顺序。

4、问题与讨论(10分钟)

while和do-while循环在循环执行过程有什么区别。

三种循环都能用break结束循环,用continue开始下一次循环。

while和do-while只判断循环条件。循环变量的初值化要放在循环语句之前,在循环体中还应包含修改循环条件的语句

5、知识要点回顾(7分钟)

构成结构化程序设计的三种基本结构:顺序结构、选择语句、循环语句,它们是程序设计的基础。 1、 while、do-while语句的语法结构 2、 while与do-while区别

do-while先执行一次循环体,后判断表达式: while先判断表达式,后执行循环体: 循环体有可能一次也不被执行。 3、 注意循环控制的范围

6、课后任务(3分钟)

1)整理课堂笔记。

2)完成老师布置的作业:习题5、6、7(教材P92)

3)完成老师布置的实验:将题四-7、四-8、四-9在VC环境下调试运行。 4)辅导答疑:http://jkx.swpu.edu.cn/tech/上进行辅导答疑。

第 6 次 课

日期 2016/4/3 周次 6 星期 一 学时 2

一、『学习目标』

熟练掌握break和continue语句用法 会编写循环结构程序

二、『教学内容』

循环的嵌套 几种循环的比较

break和continue语句 程序举例

三、『重点及难点』

循环辅助语句的使用 三种 循环语句的区别

四、『学习方法』

个别指导,学生演演示,分析多种解法,指出错误点,记好笔记,鼓励多做快作算法设计 每个程序都争取用三种循环方式写出

五、『知识点』

for 语句, while 和 do-while 语句。 流程、循环次数,死循环。

六、『教学设计』

以前面所学的求 1 至 100 之间数的累计和。以此为例讲解循环语句的意义。进一步深入,进行循环嵌套。 求出 10 至 100 之间的素数并输出,分析数据处理流程,讲解嵌套循环语句的用法。

编程用三种循环输出 1-10 的数据,在数据 7 时分别使 break 和 continue,引导学生观察程序结果,得出结论(熟练循环,并且引入break语句与continue 语句,分析两种语句对循环控制的影响)

要求同学在今后上机实践中千万要注意;

教学内容介绍完毕,强调本次课学生容易出错的地方,提出问题并与同学们讨论。 总结本节课内容,重申学习目标,再次强调本课重点。

布置课后作业及上机任务,辅导答疑以及课后延伸阅读等课后任务。

七、『教学过程』 1导入课题(7分钟)

从while和do-while语句中引入新的循环语句:for 语句

2讲授内容(70分钟:

for语句

在C语言中,for语句使用最为灵活,它完全可以取代 while 语句。它的一般形式为: for(表达式1;表达式2;表达式3) 语句 它的执行过程如下: 先求解表达式1。

求解表达式2,若其值为真(非0),则执行for语句中指定的内嵌语句,然后执行下面第3)步;若其值为假(0),则结束循环,转到第5)步。 求解表达式3。

转回上面第2)步继续执行。

循环结束,执行for语句下面的一个语句。 其执行过程可用下图表示。

for语句最简单的应用形式也是最容易理解的形式如下: for(循环变量赋初值;循环条件;循环变量增量) 语句

循环变量赋初值总是一个赋值语句, 它用来给循环控制变量赋初值; 循环条件是一个关系表达式,它决定什么时候退出循环;循环变量增量,定义循环控制变量每循环一次后 按什么方式变化。这三个部分之间用“;”分开。 例如:

for(i=1; i<=100; i++)sum=sum+i;

先给i赋初值1,判断i是否小于等于100, 若是则执行语句,之后值增加1。再重新判断, 直到条件为假,即i>100时,结束循环。 相当于: i=1;

while(i<=100) { sum=sum+i; i++;

}

对于for循环中语句的一般形式,就是如下的while循环形式: 表达式1;

while(表达式2) {语句

表达式3;

} 注意:

for循环中的“表达式1(循环变量赋初值)”、“表达式2(循环条件)”和“表达式3(循环变量增量)”都是选择项, 即可以缺省,但“;”不能缺省。

省略了“表达式1(循环变量赋初值)”, 表示不对循环控制变量赋初值。 省略了“表达式2(循环条件)”, 则不做其它处理时便成为死循环。 例如:

for(i=1;;i++)sum=sum+i; 相当于: i=1; while(1) {sum=sum+i; i++;}

省略了“表达式3(循环变量增量)”, 则不对循环控制变量进行操作,这时可在语句体中加入修改循环控制变量的语句。 例如:

for(i=1;i<=100;) {sum=sum+i; i++;}

省略了“表达式1(循环变量赋初值)”和“表达式3(循环变量增量)”。 例如:

for(;i<=100;) {sum=sum+i; i++;} 相当于: while(i<=100) {sum=sum+i; i++;}

3个表达式都可以省略。 例如: for(;;)语句 相当于: while(1)语句

表达式1可以是设置循环变量的初值的赋值表达式,也可以是其他表达式。 例如:

for(sum=0;i<=100;i++)sum=sum+i;

表达式1和表达式3可以是一个简单表达式也可以是逗号表达式。 for(sum=0,i=1;i<=100;i++)sum=sum+i; 或: for(i=0,j=100;i<=100;i++,j--)k=i+j;

表达式2一般是关系表达式或逻辑表达式,但也可是数值表达式或字符表达式,只要其值非零,就执行循环体。 例如:

for(i=0;(c=getchar())!=’\\n’;i+=c); 又如: for(;(c=getchar())!=’\\n’;) printf(“%c”,c); 循环的嵌套 【例6.7】 main() {

int i, j, k;

printf(\"i j k\\n\"); for (i=0; i<2; i++) for(j=0; j<2; j++)

for(k=0; k<2; k++)

printf(“%d %d %d\\n\ }

几种循环的比较

四种循环都可以用来处理同一个问题,一般可以互相代替。但一般不提倡用goto型循环。 while和do-while循环,循环体中应包括使循环趋于结束的语句。for语句功能最强。

用while和do-while循环时,循环变量初始化的操作应在while和do-while语句之前完成,而for语句可以在表达式1中实现循环变量的初始化。 break和continue语句 break语句

break语句通常用在循环语句和开关语句中。当break用于开关语句switch中时,可使程序跳出switch而执行switch以后的语句;如果没有break语句,则将成为一个死循环而无法退出。break在switch 中的用法已在前面介绍开关语句时的例子中碰到,这里不再举例。 当break语句用于do-while、for、while循环语句中时,可使程序终止循环而执行循环后面的语句, 通常break语句总是与if语句联在一起。即满足条件时便跳出循环。 【例6.8】 main() {

int i=0; char c;

while(1) /*设置循环*/ {

c='\\0'; /*变量赋初值*/

while(c!=13&&c!=27) /*键盘接收字符直到按回车或Esc键*/ {

c=getch();

printf(\"%c\\n\ }

if(c==27)

break; /*判断若按Esc键则退出循环*/ i++;

printf(\"The No. is %d\\n\ }

printf(\"The end\"); }

注意:

break语句对if-else的条件语句不起作用。

在多层循环中, 一个break语句只向外跳一层。 continue 语句

continue语句的作用是跳过循环本中剩余的语句而强行执行下一次循环。continue语句只用在for、while、do-while等循环体中,常与if条件语句一起使用,用来加速循环。其执行过程可用下图表示。 1) while(表达式1) { ……

if(表达式2)break; …… }

2) while(表达式1) { ……

if(表达式2)continue; …… }

程序举例

【例】用1111...357公式求π。N-S流程图:

#include

main() {

int s;

float n,t,pi;

t=1,pi=0;n=1.0;s=1;

while(fabs(t)>1e-6) { pi=pi+t; n=n+2; s=-s;

t=s/n;

}

pi=pi*4;

printf(\"pi=%10.6f\\n\ }

【例】判断m是否素数。 N-S流程图: #include main() {

int m,i,k;

scanf(“%d”,&m); k=sqrt(m);

for(i=2;i<=k;i++) if(m%i==0)break;

if(i>=k+1) printf(“%d is a prime number\\n”,m); else printf(“%d is not a prime number\\n”,m); }

【例】求100至200间的全部素数。 #include main() {

int m,i,k,n=0;

for(m=101;m<=200;m=m+2) {

k=sqrt(m);

for(i=2;i<=k;i++) if(m%i==0)break; if(i>=k+1)

{printf(“%d”,m); n=n+1;}

if(n%n==0)printf(“\\n”); }

printf(“\\n”);

3、学生容易出错的地方(3分钟)

使用 if 语句需要注意两点,其一, if 后面的表达式不只可以是关系表达式和逻辑表达式,还可以是任何一种其他的表达式,根据该表达式的值非零与否而决定转向;其二, if 和 else 之间只能有一条语句,但语句类型可以任意。

写循环时不考虑结束,造成死循环。 循环语句执行顺序。

4、问题与讨论(10分钟)

三种循环都可以用来处理同一类问题,一般情况下它们可以互相替代。 三种循环都能用break结束循环,用continue开始下一次循环。

while和do-while只判断循环条件。循环变量的初值化要放在循环语句之前,在循环体中还

应包含修改循环条件的语句

5、知识要点回顾(7分钟)

循环结构有三种语句。巩固for语句的执行顺序(学生易错) (1 ) 循环变量赋初值 (2 ) 判断循环条件是否满足

(3 ) 如果条件满足,执行循环体,否则退出循环 (4 ) 循环变量增量(正、负),以使循环趋于结束 一般已知循环次数用 for 语句,未知循环次数用 while 和 do-while 语句。 For 和 while 语句先判断后循环, do-while 先执行后判断。要掌握循环语句的各种变体形式、执行的流程、循环次数的计算,学会分析死循环或不循环的原因等。

6、课后任务(3分钟)

1)整理课堂笔记。

2)考虑打印9*9乘法表(二重循环)

3)完成老师布置的作业:习题9、10、11(教材P92)。 4)辅导答疑:http://jkx.swpu.edu.cn/tech/上进行辅导答疑。

第 7 次 课

日期 2016/4/11 周次 7 星期 一 学时 2

一、『教学目标』

通过本章的学习,理解函数的基本概念。 掌握函数的定义方法。

掌握函数的调用方法(传值、传地址、引用调用)。 掌握函数原型申明的意义和申明方法

二、『教学内容』

第五章 函数

5.1程序设计的艺术 5.2函数的定义与使用

三、 『重点及难点』

重点:

函数的定义和调用 函数的参数传送 难点:

函数的参数传递

四、 『学习方法』

C语言支持结构化的程序设计,结构化的程序就是由函数组成的,所以,要把函数掌握好。

本章内容和概念较多,有些内容有难度,需要多练、多体会和思考,才能完全掌握。 一定要把函数参数的传递过程搞清楚,这有助于对指针、引用及函数参数引用传递等概念的理解。

五、 『知识点』

函数定义;函数声明;函数调用;实参;形参;值传递;地址传递;

六、 『教学设计』

1导入课题

同学们之前遇到过哪些函数呢?——main函数、系统函数、用户自定义函数。 引例:已知五边形的各条边的长度,计算其面积

2函数——教学内容框架设计

函数的定义 函数首部、函数体 函数调用的基本形式 函数调用 函数 函数的嵌套调用 函数的递归调用 全局变量和局部变量 变量的作用域和存储类别 动态变量和静态变量:auto、static 内部函数和外部函数 3本次课教学内容展开

1. 由大家回顾遇到过的函数类型,引入C语言的函数;

2. 引例:求多边形面积,引出用户自定义函数的作用,从而导出如何定义函数; 3.函数的两个关键概念:函数参数和函数的返回值。

4.通过实例,详细讲解函数的不同形式的调用方法及不同调用形式对函数实参的影响; 5. 通过不同实例的讲解,引出函数申明的必要条件和申明的基本方法;

6.提问:在函数调用过程中,如果调用了自身,会有怎样的情况?引出函数的递归调用;通过典型例题:求阶乘和最大公约数两个程序,讲解函数的递归调用过程。

6.本次课的重点和难点:数组元素作为函数参数。对于初学者来说,这是学习的难点,而且对学习指针也是非常重要的基础,教师需要通过类似程序,将各类参数做为函数传递值,通过运行程序及演示结果,并通过教师带动学生总结的方式,让学生加深理解。并强调课后上机练习。

7. 教学内容介绍完毕,强调本次课学生容易出错的地方,提出问题并与同学们讨论。 8.总结本节课内容,重申教学目标,再次强调本课重点。

9.布置课后作业及上机任务,辅导答疑以及课后延伸阅读等课后任务。

4重难点处理——“典型案例分析”+“示意图”

难点1——函数调用过程:由于同学们习惯了程序中只有一个main函数的程序执行过程,刚开始不能熟练掌握函数之间的相互调用,教学中案例要典型,由浅入深,要多画程序执行流程的示意图辅助理解;

难点2——函数的参数传递:普通变量作为函数参数的传递时单向值传递,用数组名作为函数参数是地址传递,这两种传递方式会导致结果的截然不同,一定要通过典型案例及其示意图给同学们展示。

七、 『教学过程』 1、复习及导课(6’)

回顾:C语言的特点—结构化程序设计的基本思想。

模块化+基本结构。C程序的模块化就是通过函数来实现的。

问题1:C程序的基本结构是什么?C程序必不可少的函数是什么?——main函数! 问题2:请同学们在草稿纸上写出main函数的结构

void main( ) {

函数体; }

总结:C函数的基本结构:

函数类型 函数名(形参表) →函数首部 {

说明部分;

函数体

执行部分; }

问题3:除了主函数,我们还用到过哪些函数?——系统调用函数,如:printf;

问题4:除了main函数和系统调用函数外,我们用户还可以定义自己所需要的函数;

引例:计算多边形面积,可将多边形分解成若干个三角形

areac(cx)(cy)(cz)计算三角形面积的公式如下: 遇到的困难:按照我们以前的设计方法,需要编写三次计算三角形面积的代码。如果多边形能分出来的三角形更多,则编写代码的工作量越大!

解决的方法:能否仿照系统函数,把计算三角形面积的代码编写成一个函数,需要计算一个三角形面积的时候只需要调用该函数的就可以了,其思路如图1所示:

main() c1(xyz)2面积s1= my_area( ) 三角形面积的函数my_area( ) 面积s2= my_area( ) 面积s3= my_area( ) 总面积s=s1+s2+s3 main结束 图1

优点分析:这样只需要写一次该代码,从而减少编写代码的工作量。这两次课我们就一起来学习,如何定义自己需要的函数,这些函数该如何使用。

2、讲授内容(70’)

5.1 程序设计的艺术

在前面已经介绍过,C源程序是由函数组成的。虽然在前面各章的程序中大都只有一个主函数main(),但实用程序往往由多个函数组成。函数是C源程序的基本模块,通过对函数模块的调用实现特定的功能。C语言中的函数相当于其它高级语言的子程序。

由于采用了函数模块式的结构,C语言易于实现结构化程序设计。使程序的层次结构清晰,便于程序的编写、阅读、调试。

5.2 函数的定义与使用 5.2.1函数的分类

1、在C语言中可从不同的角度对函数分类。

从函数定义的角度看,函数可分为库函数和用户定义函数两种。

① 库函数:由C系统提供,用户无须定义,只需在程序前包含有该函数原型的头文件即可在程序中直接调用。在前面各章的例题中反复用到printf、scanf、getchar、putchar、gets、puts、strcat等函数均属此类。

② 用户定义函数:由用户按需要写的函数。对于用户自定义函数,不仅要在程序中定义函数本身,而且在主调函数模块中还必须对该被调函数进行类型说明,然后才能使用。

2、C语言的函数兼有其它语言中的函数和过程两种功能,从这个角度看,又可把函数分为有返回值函数和无返回值函数两种。

① 有返回值函数:此类函数被调用执行完后将向调用者返回一个执行结果,称为函数返回值。

② 无返回值函数:此类函数用于完成某项特定的处理任务,执行完成后不向调用者返回函数值。用户在定义此类函数时可指定它的返回为“空类型”, 空类型的说明符为“void”。 3、从主调函数和被调函数之间数据传送的角度看又可分为无参函数和有参函数两种。

① 无参函数:函数定义、函数说明及函数调用中均不带参数。

② 有参函数:也称为带参函数。在函数定义及函数说明时都有参数,称为形式参数(简称为形参)。在函数调用时也必须给出参数,称为实际参数(简称为实参)。

4、C语言提供了极为丰富的库函数,这些库函数又可从功能角度作以下分类。

① 字符类型分类函数:对字符按ASCII码分类:字母,数字,控制字符,分隔符,大小写字母等。

② 转换函数:用于字符或字符串的转换;在字符量和各类数字量(整型,实型等)之间进行转换;在大、小写之间进行转换。

③ 目录路径函数:用于文件目录和路径操作。 ④ 诊断函数:用于内部错误检测。

⑤ 图形函数:用于屏幕管理和各种图形功能。 ⑥ 输入输出函数:用于完成输入输出功能。

⑦ 接口函数:用于与DOS,BIOS和硬件的接口。 ⑧ 字符串函数:用于字符串操作和处理。 ⑨ 内存管理函数:用于内存管理。 ⑩ 数学函数:用于数学函数计算。 其它函数:用于其它各种功能。

以上各类函数不仅数量多,而且有的还需要硬件知识才会使用,因此要想全部掌握则需要一个较长的学习过程。应首先掌握一些最基本、最常用的函数,再逐步深入。由于课时关系,我们只介绍了很少一部分库函数,其余部分读者可根据需要查阅有关手册。

5.2.2函数的定义

函数定义的一般形式: 有参函数定义的一般形式 类型标识符 函数名() 类型标识符 函数名(形式参数表列) {声明部分 {声明部分 语句 语句 } }

有参函数比无参函数多了一个内容,即形式参数表列。在形参表中给出的参数称为形式参数,它们可以是各种类型的变量,各参数之间用逗号间隔。在进行函数调用时,主调函数将赋予这些形式参数实际的值。形参既然是变量,必须在形参表中给出形参的类型说明。

说明:

1、函数名前面的类型实际上是返回值的类型

• 当函数无返回值时,可用void 定义为“无类型”或“空类型”。

• 当函数有返回值时,必须定义函数类型,并一定有return语句

例:void printstar() int max(int x,int y) { { printf(“ *** ”); return(x+y); } }

2、若为无参函数,则形参列表为空,但括号不能省略。 3、若为有参函数,则必须有形参表及形参说明 4、形参说明的两种形式:

int max(int x,int y)或int max(x,y) int x,y; 如:下面对形式参数的说明都是错误的:

(1)max(x, y) int x; (2)main(int x, y)

5、形参说明与函数体内的说明一定要分别说明 int max(x,y) int max( int x, int y ) int x,y; { int z; { int z; if (x>y)z=x; if (x>y) z=x; else z=y; else z=y; return(z); return(z); } }

在C程序中,一个函数的定义可以放在任意位置,既可放在主函数main之前,也可放在main之后。 例如:

可把max 函数置在main之后,也可以把它放在main之前。

5.2.3 函数的调用、参数和返回值

(1)、形式参数和实际参数

形参出现在函数定义中,在整个函数体内都可以使用,离开该函数则不能使用。

实参出现在主调函数中,进入被调函数后,实参变量也不能使用。 发生函数调用时,主调函数把实参的值传送给被调函数的形参,实现主调函数向被调函数的数据传送。 函数的形参和实参具有以下特点:

形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只有在函数内部有效。函数调用结束返回主调函数后则不能再使用该形参变量。

实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使实参获得确定值。

实参和形参在数量上,类型上,顺序上应严格一致,否则会发生类型不匹配”的错误。

函数调用中发生的数据传送是单向的。即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。 因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。

【例】可下例以说明这个问题。 main() {

int n;

printf(\"input number\\n\"); scanf(\"%d\

s(n);

printf(\"n=%d\\n\}

int s(int n) {

int i; printf(\"n=%d\\n\ for(i=n-1;i>=1;i--) } n=n+i;

本程序中定义了一个函数s,该函数的功能是求∑ni的值。在主函数中输入n值,并作为实参,在调用时传送给s 函数的形参量n( 注意,本例的形参变量和实参变量的标识符都为n,但这是两个不同的量,各自的作用域不同)。在主函数中用printf 语句输出一次n值,这个n值是实参n的值。在函数s中也用printf 语句输出了一次n值,这个n值是形参最后取得的n值0。从运行情况看,输入n值为100。即实参n的值为100。把此值传给函数s时,形参n的初值也为100,在执行函数过程中,形参n的值变为5050。返回主函数之后,输出实参n的值仍为100。可见实参的值不随形参的变化而变化。 (2 )、函数的返回值

函数的值是指函数被调用之后,执行函数体中的程序段所取得的并返回给主调函数的值。如调用正弦函数取得正弦值,调用例8.1的max函数取得的最大数等。对函数的值(或称函数返回值)有以下一些说明:

函数的值只能通过return语句返回主调函数。 return 语句的一般形式为: return 表达式;

或者为:return (表达式);

该语句的功能是计算表达式的值,并返回给主调函数。在函数中允许有多个return语句,但每次调用只能有一个return 语句被执行,因此只能返回一个函数值。

函数值的类型和函数定义中函数的类型应保持一致。如果两者不一致,则以函数类型为准,自动进行类型转换。

如函数值为整型,在函数定义时可以省去类型说明。 不返回函数值的函数,可以明确定义为“空类型”,类型说明符为“void”。如例8.2中函数s并不向主函数返函数值,因此可定义为:

void s(int n) { …… }

一旦函数被定义为空类型后,就不能在主调函数中使用被调函数的函数值了。例如,在定义s为空类型后,在主函数中写下述语句

sum=s(n); 就是错误的。

为了使程序有良好的可读性并减少出错, 凡不要求返回值的函数都应定义为空类型。

(3)、 函数调用

如果一个函数调用另外一个函数,程序就转到另一个函数去执行,称为函数调用

1、函数调用格式

 函数名(表达式1, 表达式2, ……) ;

 调用一个函数之前,先要对其返回值类型、函数名和参数进行声明(declare)

 不对函数进行声明是非常危险的  函数定义也有声明函数的效果

 调用函数有关规定:

 多个实参间用逗号隔开

 实参与形参按顺序对应,一一传递数据  实参与形参间个数相等,类型应一致

 返回值可以按需处理

if(a>b)return a; 【例】

int max(int a,int b) else return b; { }

main() {

int max(int a,int b); int x,y,m;

printf(\"input two numbers:\\n\"); 改程序的执行流程如下图所示:

scanf(\"%d%d\ m=max(x,y);

printf(\"maxmum=%d\}

2、 函数的调用方式

在C语言中,可以用以下几种方式调用函数:

① 函数表达式:要求函数是有返回值的。例如:z=max(x,y)是一个赋值表达式,把max的返回值赋予变量z。

② 函数语句:函数调用的一般形式加上分号即构成函数语句。例如: printf (\"%d\(\"%d\都是以函数语句的方式调用函数。

③ 函数实参:函数作为另一个函数调用的实际参数出现。这种情况是把该函数的返回值作为实参进行传送,因此要求该函数必须是有返回值的。例如: printf(\"%d\即是把max调用的返回值又作为printf函数的实参来使用的。

4、函数原型

在主调函数中调用某函数之前应对该被调函数进行说明(声明),这与使用变量之前要先进行变量说明是一样的。在主调函数中对被调函数作说明的目的是使编译系统知道被调函数返回值的类型,以便在主调函数中按此种类型对返回值作相应的处理。

其一般形式为:

类型说明符 被调函数名(类型 形参,类型 形参…); 或为:

类型说明符 被调函数名(类型,类型…);

括号内给出了形参的类型和形参名,或只给出形参类型。这便于编译系统进行检错,以防止可能出现的错误。

上例中main函数中对max函数的说明为: int max(int a,int b); 或写为:

int max(int,int);

C语言中又规定在以下几种情况时可以省去主调函数中对被调函数的函数说明。

① 当被调函数的函数定义出现在主调函数之前时,在主调函数中也可以不对被调函数再作说明而直接调用。例如上一个例子中,函数max的定义放在main 函数之前,因此可在main函数中省去对max函数的函数说明int max(int a,int b)。

② 如在所有函数定义之前,在函数外预先说明了各个函数的类型,则在以后的各主调函数中,可不再对被调函数作说明。例如:

char str(int a); float f(float b);

main() {

…… }

char str(int a) {

…… }

float f(float b) {

…… }

其中第一,二行对str函数和f函数预先作了说明。因此在以后各函数中无须对str和f函数再作说明就可直接调用。

对库函数的调用不需要再作说明,但必须把该函数的头文件用include命令包含在源文件前部。

提问:前面我们讲的都是一个函数调用另一个函数的情况,那么能否在函数体重调用其自身??

3、学生易错点(4’)

 函数定义、函数申明和函数调用的区别;

 实参和形参的区别,及参数的传递方法和参数的传递形式的区别;  函数申明与函数定义的区别;

4、问题与讨论(8’)

1) 在何种情况下需要对函数进行申明,及什么情况下可以不申明? 2) 采用传地址调用,有什么好处和弊端?

3) 从一个被调用函数要获得多个计算值可如何解决?

5、课后任务(2’)

1)整理课堂笔记;

2)作业:教材P193:5.1-5.3 3)上机:详见实验报告

4)答疑:计算机基础教研室

5)课外延伸:程序的模块化设计实现 6)预习:5.3 变量的作用域和存储类别。

第 8 次 课

日期 2016/4/17 周次 8 星期 一 学时 2

一、『学习目标』

理解掌握变量的作用域和存储类型的概念。 了解模块化程序设计方法

了解预处理的功能,理解宏定义的意义

二、『教学内容』

变量的作用域与存储类型 模块化程序设计方法 预处理

三、『教学要求』

掌握全局变量与局部变量、静态变量的使用 理解模块化程序设计方法及其三大基本结构 重点理解带参数的宏定义

四、『重点及难点』

重点:全局和局部变量,静态和动态变量。带参的宏定义 难点:全局变量和静态变量、带参的宏定义

五、『学习方法』

本次课内容和概念较多,内容有难度,需要多练、多体会和思考,才能完全掌握。全局变量和局部变量要注重他们的作用范围和生存期;另要重点掌握自动变量和静态变量的特点,尤其是静态变量的特殊性

六、『知识点』

全局变量、局部变量、静态变量、动态变量

顺序结构、选择结构、循环结构、模块化、算法、函数 自顶向下、逐步求精、程序设计总原则 预处理、宏定义、文件包含、条件编译

七、『教学设计』

本次课介绍的内容涉及知识点多,讲解变量的作用域和存储类的概念,让学生了解全局变量与局部变量的区别,注意局部变量与全局变量同名情况下的作用域问题。了解变量的存储类别对数据处理的影响,特别是静态存储时的初始化问题。最后给出一个包含本章内容的综合例子,让学生对所讲内容有一个整体的印象。

用结构化模块设计的方法提出函数的问题。给出一个用函数解决的较为复杂问题的实例,让学生感觉到模块化设计的优势、益处,使之树立起结构化模块设计的思想。

先介绍预处理的功能,然后结合实例讲解带参数的宏定义知识点。

八、『教学过程』

1、导课(2分钟)

给出一个用函数解决的较为复杂问题的实例,让学生感觉到模块化设

计的优势、益处,使之树立起结构化模块设计的思想。并引出本次课讲解的内容

2、 讲授内容(80分钟)

综合算法实例见ppt(略)

3、学生易错点(4分钟)

全局变量与局部变量混为一谈,静态变量与动态变量的概念没有分清楚 带参数的宏定义,误以为是简单替换

4、问题与讨论(8分钟)

程序设计是一门艺术,主要体现在算法设计和结构设计上。讨论函数和模块在程序设计中的意义?

5、知识要点回顾(4分钟)

变量的作用域与存储类型 程序设计的方法 预处理的功能

6、课后任务(2分钟)

1)整理课堂笔记;预习第六章:数组。

2)答疑:C语言精品课程网站和教学互动社区

3)课外延伸:结构化程序设计和面向对象程序设计的风格

第 9 次 课

日期 2016/4/24 周次 9 星期 一 学时 2

一、『学习目标』

理解数组的基本概念;

掌握一维、二维数组的定义及访问方法; 掌握字符串的定义和访问方法; 掌握字符数组处理字符串的技巧。

采用数组解决一些常见的数学问题的基本算法。

二、『教学内容』

一维数组 二维数组 字符串

三、『教学要求』

掌握数组的定义和使用方法 掌握字符串的常见处理方法

了解C中常用的字符串处理函数

四、『重点及难点』

重点:一维、二维数组的定义和访问方法 难点:字符串的处理

五、『学习方法』

数组是一种常用的、重要的线性数据结构,一定要掌握好。学习中,要注意区分数组的赋值与初始化的方法不同之处。C++中没有定义字符串数据类型,而用字符数组存储字符串,要注意区分字符串数组与其它非字符串数组的不同之处。C++中有一些操作字符串的标准库函数,应该学会运用这些库函数。

六、『知识点』

数组;数组的定义;一维数组;一维数组的存储;一维数组的初始化; 二维数组,二维数组的存储;二维数组的初始化;字符数组; 字符串处理函数;数组作函数参数

七、『教学设计』

1.教学引入:

2.介绍数组的概念;

3.讲解数组(一维、二维)的定义方法;

4.通过实例讲解数组元素的引用和初始化方法; 5.详细讲解特殊数组(字符串)的处理方法。

6.教学内容介绍完毕,强调本次课学生容易出错的地方,提出问题并与同学们讨论。

7.总结本节课内容,重申学习目标,再次强调本课重点。

8.布置课后作业及上机任务,辅导答疑以及课后延伸阅读等课后任务。

八、『教学过程』 1、导课(4分钟)

1)上次课给大家留下的思考问题,大家完成的怎样?

2)要处理全班100名同学的C++期末考试成绩如何实现?

2、讲授内容(75分钟)

数组

在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。在C语言中,数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。本章介绍数值数组和字符数组,其余的在以后各章陆续介绍。 一维数组的定义和引用

一维数组的定义方式

在C语言中使用数组必须先进行定义。 一维数组的定义方式为:

类型说明符 数组名 [常量表达式]; 其中:

类型说明符是任一种基本数据类型或构造数据类型。 数组名是用户定义的数组标识符。

方括号中的常量表达式表示数据元素的个数,也称为数组的长度。 例如:

int a[10]; 说明整型数组a,有10个元素。

float b[10],c[20]; 说明实型数组b,有10个元素,实型数组c,有20个元素。 char ch[20]; 说明字符数组ch,有20个元素。 对于数组类型说明应注意以下几点:

数组的类型实际上是指数组元素的取值类型。对于同一个数组,其所有元素的数据类型都是相同的。

数组名的书写规则应符合标识符的书写规定。 数组名不能与其它变量名相同。 例如: main() {

int a;

float a[10]; …… }

是错误的。

方括号中常量表达式表示数组元素的个数,如a[5]表示数组a有 5个元素。但是其下标从0开始计算。因此5个元素分别为a[0],a[1],a[2],a[3],a[4]。

不能在方括号中用变量来表示元素的个数, 但是可以是符号常数或常量表达式。 例如:

#define FD 5 main() {

int a[3+2],b[7+FD]; ……

}

是合法的。

但是下述说明方式是错误的。 main() {

int n=5; int a[n]; …… }

允许在同一个类型说明中,说明多个数组和多个变量。 例如:

int a,b,c,d,k1[10],k2[20]; 一维数组元素的引用

数组元素是组成数组的基本单元。数组元素也是一种变量, 其标识方法为数组名后跟一个下标。下标表示了元素在数组中的顺序号。 数组元素的一般形式为: 数组名[下标]

其中下标只能为整型常量或整型表达式。如为小数时,C编译将自动取整。 例如:a[5],a[i+j],a[i++] 都是合法的数组元素。

数组元素通常也称为下标变量。必须先定义数组, 才能使用下标变量。在C语言中只能逐个地使用下标变量,而不能一次引用整个数组。

例如,输出有10个元素的数组必须使用循环语句逐个输出各下标变量: for(i=0; i<10; i++)

printf(\"%d\

而不能用一个语句输出整个数组。 下面的写法是错误的: printf(\"%d\ 【例】 main() {

int i,a[10];

for(i=0;i<=9;i++) a[i]=i;

for(i=9;i>=0;i--)

printf(\"%d \}

【例】 main() {

int i,a[10];

for(i=0;i<10;) a[i++]=i;

for(i=9;i>=0;i--) printf(\"%d\ }

【例】 main() {

int i,a[10];

for(i=0;i<10;) a[i++]=2*i+1; for(i=0;i<=9;i++) printf(\"%d \

printf(\"\\n%d %d\\n\}

本例中用一个循环语句给a数组各元素送入奇数值,然后用第二个循环语句输出各个奇数。在第一个 for语句中,表达式3省略了。在下标变量中使用了表达式i++,用以修改循环变量。当然第二个for语句也可以这样作,C语言允许用表达式表示下标。 程序中最后一个printf语句输出了两次a[5]的值,可以看出当下标不为整数时将自动取整。 一维数组的初始化

给数组赋值的方法除了用赋值语句对数组元素逐个赋值外, 还可采用初始化赋值和动态赋值的方法。

数组初始化赋值是指在数组定义时给数组元素赋予初值。数组初始化是在编译阶段进行的。这样将减少运行时间,提高效率。 初始化赋值的一般形式为:

类型说明符 数组名[常量表达式]={值,值……值};

其中在{ }中的各数据值即为各元素的初值,各值之间用逗号间隔。 例如:

int a[10]={ 0,1,2,3,4,5,6,7,8,9 }; 相当于a[0]=0;a[1]=1...a[9]=9;

C语言对数组的初始化赋值还有以下几点规定: 可以只给部分元素赋初值。

当{ }中值的个数少于元素个数时,只给前面部分元素赋值。 例如:

int a[10]={0,1,2,3,4};

表示只给a[0]~a[4]5个元素赋值,而后5个元素自动赋0值。 只能给元素逐个赋值,不能给数组整体赋值。

例如给十个元素全部赋1值,只能写为: int a[10]={1,1,1,1,1,1,1,1,1,1}; 而不能写为: int a[10]=1;

如给全部元素赋值,则在数组说明中, 可以不给出数组元素的个数。 例如:

int a[5]={1,2,3,4,5}; 可写为:

int a[]={1,2,3,4,5}; 一维数组程序举例

可以在程序执行过程中,对数组作动态赋值。这时可用循环语句配合scanf函数逐个对数组元素赋值。 【例】 main() {

int i,max,a[10];

printf(\"input 10 numbers:\\n\"); for(i=0;i<10;i++)

scanf(\"%d\ max=a[0];

for(i=1;i<10;i++)

if(a[i]>max) max=a[i]; printf(\"maxmum=%d\\n\}

本例程序中第一个for语句逐个输入10个数到数组a中。 然后把a[0]送入max中。在第二个for语句中,从a[1]到a[9]逐个与max中的内容比较,若比max的值大,则把该下标变量送入max中,因此max总是在已比较过的下标变量中为最大者。比较结束,输出max的值。 【例】 main() {

int i,j,p,q,s,a[10];

printf(\"\\n input 10 numbers:\\n\"); for(i=0;i<10;i++)

scanf(\"%d\ for(i=0;i<10;i++){ p=i;q=a[i];

for(j=i+1;j<10;j++) if(q} }

本例程序中用了两个并列的for循环语句,在第二个for 语句中又嵌套了一个循环语句。第一个for语句用于输入10个元素的初值。第二个for语句用于排序。本程序的排序采用逐个比较的方法进行。在i次循环时,把第一个元素的下标i赋于p,而把该下标变量值a[i]赋于q。然后进入小循环,从a[i+1]起到最后一个元素止逐个与a[i]作比较,有比a[i]大者则将其下标送p,元素值送q。一次循环结束后,p即为最大元素的下标,q则为该元素值。若此时i≠p,说明p,q值均已不是进入小循环之前所赋之值,则交换a[i]和a[p]之值。 此时a[i]为已排序完毕的元素。输出该值之后转入下一次循环。对i+1以后各个元素排序。

二维数组的定义和引用 二维数组的定义

前面介绍的数组只有一个下标,称为一维数组,其数组元素也称为单下标变量。在实际问题中有很多量是二维的或的,因此C语言允许构造数组。数组元素有多个下标,以标识它在数组中的位置,所以也称为多下标变量。本小节只介绍二维数组,数组可由二维数组类推而得到。

二维数组定义的一般形式是:

类型说明符 数组名[常量表达式1][常量表达式2]

其中常量表达式1表示第一维下标的长度,常量表达式2 表示第二维下标的长度。 例如:

int a[3][4];

说明了一个三行四列的数组,数组名为a,其下标变量的类型为整型。该数组的下标变量共有3×4个,即:

a[0][0],a[0][1],a[0][2],a[0][3] a[1][0],a[1][1],a[1][2],a[1][3] a[2][0],a[2][1],a[2][2],a[2][3] 二维数组在概念上是二维的,即是说其下标在两个方向上变化,下标变量在数组中的位置也处于一个平面之中,而不是象一维数组只是一个向量。但是,实际的硬件存储器却是连续编址的,也就是说存储器单元是按一维线性排列的。 如何在一维存储器中存放二维数组,可有两种方式:一种是按行排列, 即放完一行之后顺次放入第二行。另一种是按列排列, 即放完一列之后再顺次放入第二列。在C语言中,二维数组是按行排列的。 即:

先存放a[0]行,再存放a[1]行,最后存放a[2]行。每行中有四个元素也是依次存放。由于数组a说明为int类型,该类型占两个字节的内存空间,所以每个元素均占有两个字节)。 二维数组元素的引用

二维数组的元素也称为双下标变量,其表示的形式为: 数组名[下标][下标]

其中下标应为整型常量或整型表达式。 例如: a[3][4]

表示a数组三行四列的元素。

下标变量和数组说明在形式中有些相似,但这两者具有完全不同的含义。数组说明的方括号中给出的是某一维的长度,即可取下标的最大值;而数组元素中的下标是该元素在数组中的

位置标识。前者只能是常量,后者可以是常量,变量或表达式。

【例】一个学习小组有5个人,每个人有三门课的考试成绩。求全组分科的平均成绩和各科总平均成绩。 Math C Foxpro 张 80 75 92 王 61 65 71 李 59 63 70 赵 85 87 90 周 76 77 85 可设一个二维数组a[5][3]存放五个人三门课的成绩。再设一个一维数组v[3]存放所求得各分科平均成绩,设变量average 为全组各科总平均成绩。编程如下: main() {

int i,j,s=0,average,v[3],a[5][3]; printf(\"input score\\n\"); for(i=0;i<3;i++) {

for(j=0;j<5;j++) { scanf(\"%d\ s=s+a[j][i];} v[i]=s/5; s=0; }

average =(v[0]+v[1]+v[2])/3;

printf(\"math:%d\\nc languag:%d\\ndbase:%d\\n\ printf(\"total:%d\\n\}

程序中首先用了一个双重循环。在内循环中依次读入某一门课程的各个学生的成绩,并把这些成绩累加起来,退出内循环后再把该累加成绩除以5送入v[i]之中,这就是该门课程的平均成绩。外循环共循环三次,分别求出三门课各自的平均成绩并存放在v数组之中。退出外循环之后,把v[0],v[1],v[2]相加除以3即得到各科总平均成绩。最后按题意输出各个成绩。 二维数组的初始化

二维数组初始化也是在类型说明时给各下标变量赋以初值。二维数组可按行分段赋值,也可按行连续赋值。

例如对数组a[5][3]: 按行分段赋值可写为:

int a[5][3]={ {80,75,92},{61,65,71},{59,63,70},{85,87,90},{76,77,85} }; 按行连续赋值可写为:

int a[5][3]={ 80,75,92,61,65,71,59,63,70,85,87,90,76,77,85}; 这两种赋初值的结果是完全相同的。 【例】 main() {

int i,j,s=0, average,v[3];

int a[5][3]={{80,75,92},{61,65,71},{59,63,70},{85,87,90},{76,77,85}};

for(i=0;i<3;i++)

{ for(j=0;j<5;j++) s=s+a[j][i]; v[i]=s/5; s=0; }

average=(v[0]+v[1]+v[2])/3;

printf(\"math:%d\\nc languag:%d\\ndFoxpro:%d\\n\ printf(\"total:%d\\n\ }

对于二维数组初始化赋值还有以下说明:

可以只对部分元素赋初值,未赋初值的元素自动取0值。 例如:

int a[3][3]={{1},{2},{3}};

是对每一行的第一列元素赋值,未赋值的元素取0值。 赋值后各元素的值为: 1 0 0 2 0 0 3 0 0

int a [3][3]={{0,1},{0,0,2},{3}}; 赋值后的元素值为: 0 1 0 0 0 2 3 0 0

如对全部元素赋初值,则第一维的长度可以不给出。 例如:

int a[3][3]={1,2,3,4,5,6,7,8,9}; 可以写为:

int a[][3]={1,2,3,4,5,6,7,8,9}; 数组是一种构造类型的数据。二维数组可以看作是由一维数组的嵌套而构成的。设一维数组的每个元素都又是一个数组,就组成了二维数组。当然,前提是各元素类型必须相同。根据这样的分析,一个二维数组也可以分解为多个一维数组。C语言允许这种分解。 如二维数组a[3][4],可分解为三个一维数组,其数组名分别为:a[0]、a[1]、a[2]

对这三个一维数组不需另作说明即可使用。这三个一维数组都有4个元素,例如:一维数组a[0]的元素为a[0][0],a[0][1],a[0][2],a[0][3]。

必须强调的是,a[0],a[1],a[2]不能当作下标变量使用,它们是数组名,不是一个单纯的下标变量。

3、学生易错点(4分钟)

定义静态数组时,将数组元素个数定义为变量; 数组元素访问越界; 字符串的初始化不正确 字符串访问出错;

4、问题与讨论(10分钟)

字符串访问出错;静态数组定义必须使数组元素个数为常量有什么缺点? 对字符串数据输入时,cin方式和gets有何区别?

求字符串长度除可以用strlen()函数外,可用何方法求得?

5、知识要点回顾(5分钟)

数组的定义; 数组的初始化; 字符串的处理

6、课后任务(2分钟)

1)整理课堂笔记;预习第二节

2)作业:习题1、4、5、9(教材P126)

3)上机:将教材后面的习题在VC环境下调试运行。 4)答疑:论坛http://教学互动社区 5)课外延伸:两矩阵相乘的实现?

第 10 次 课

日期 2016/5/2 周次 10 星期 一 学时 2

一、『教学目标』

掌握字符数组与字符串 掌握字符数组的输入输出 掌握字符串出来函数的应用

二、『教学内容』

第六章 数组

6.4向函数传递二维数组 6.5字符数组与字符串 6.5.1字符数组输入与输出 6.5.2字符串处理函数

三、『重点及难点』

重点:

向函数传递二维数组 字符数组输入与输出 字符串处理函数 难点:

向函数传递二维数组 字符串处理函数

四、『学习方法』

理解二维数组的含义和元素的访问方法,是学习和掌握二维数组的定义、初始化及访问的关键; C++中没有定义字符串数据类型,而用字符数组存储字符串,要注意区分字符串数组与其它非字符串数组的不同之处。

C++中有一些操作字符串的标准库函数,应该学会运用这些库函数。

五、『知识点』

二维数组作为函数参数的传递方法; 字符数组;

字符串处理函数。

六、『教学设计』 1、问题引入

前面学习了一维数组作为函数参数的使用方法,提出二维数组可否作为函数的参数;通过此进行二维数组作为函数参数的讲解。

2、教学内容整体设计

定义、初始化 一维数组 多个 一维数组 二维数组 一维数组元素的引用 一维数组元素的应用举例 定义、初始化 二维数组元素的引用 二维数组的操作:如转置 定义、引用、初始化 数组 字符数组 字符串数组 字符数组的输入输出 看待成多个一维数组 数组元素为字符 以’\\0’结束 %c格式 %s格式 gets和puts函数 字符串处理函数 插入 数组的常用操作 查找 排序 顺序查找算法 折半查找算法 冒泡排序法

3、本次课教学内容展开

1、 复习:一维数组作为函数参数的几种方法,从而引出二维数组作为函数参数的学习。 2、 利用对一维数组的学习,假设该数组中存放的是字符,从而引入字符数组的学习。 3、 详细讲解字符数组与字符串; 4、 字符串处理函数

5、 教学内容介绍完毕,强调本次课学生容易出错的地方,提出问题并与同学们讨论。 6、 总结本节课内容,重申教学目标,再次强调本课重点

7、 布置课后作业及上机任务,辅导答疑以及课后延伸阅读等课后任务。

4、总结与巩固

基于(二)中的知识框架进行总结!

5、重难点处理——“知识类比教学”+“示意图辅助理解”

难点1——二维数组元素的作为参数的传递和地址作为参数的传递:强调把二维数组看出多个一维数组,每个二维数组的行下标a[i]就好比一个一个数组名!

难点2——字符数组和字符串数组的区别:通过画示意图的方式帮助理解,且一定要给学生分析两者的实质区别;

七、『教学过程』

(一)问题引入

前面学习一维数组作为函数参数传递时的两种形式:一种是数组元素作为函数实参;另一种是数组名作为函数形参和实参使用。

二维数组可以看成是一个复杂一维数组,二维数组作为函数参数又该如何传递?

2.讲授内容(76’)

6.4向函数传递二维数组

二维数组元素作为实参,与普通变量做实参传递方法相同,在此不再累述。下面主要学习二维数组名做实参或者形参的情况。

二维数组名作实参时,对应的形参也应该定义为一个二维数组形式。对形参数组定义时可以指定每一维的大小,也可以省略第一维的大小说明。

例:求二维数组中最大元素值

主要程序代码如下:

int max_value(int array[3][4]) { int i,j,k,max; max=array[0][0]; for(i=0;i<3;i++) for(j=0;j<4;j++)

if(array[i][j]>max) max=array[i][j];

return(max); } main()

{ int a[3][4]={{1,3,5,7},

{2,4,6,8},{15,17,34,12}};

printf(\"max value is %d\\n\}

模仿练习1:编程序,将矩阵转置。设转置前为a矩阵,转置后为b矩阵,如下所示:

模仿练习2:求二维数组中各行元素之和

主要代码如下:get_sum_row(int x[][3], int result[] ,int row, int col)

{ int i,j;

for(i=0;ifor(j=0;j} } main()

{ int a[2][3]={3,6,9,1,4,7}; int sum_row[2],row=2,col=3,i; get_sum_row(a,sum_row,row,col); for(i=0;iprintf(\"The sum of row[%d]=%d\\n\}

前面的例子中提到的数组都是存放的数值,可否在数组中存放字符?如果可以,这样的数组又叫什么?

6.5字符数组与字符串 6.5.1 字符数组的定义和引用

用来存放字符量的数组称为字符数组。

字符数组的定义形式和引用与前面介绍的数值数组相同。 例如: char c[10];

由于字符型和整型通用,也可以定义为int c[10]但这时每个数组元素占2个字节的内存单元。 字符数组也可以是二维或数组。

例如: char c[5][10]; 即为二维字符数组。

6.5.2 字符数组的初始化

1、用字符型数据对字符数组初始化

char rat[5]={‘T’,‘h’,‘e’,‘ ’}; T h e 空格 0 2、字符数组的引用 【例】 main() { { for(j=0;j<=4;j++) int i,j; printf(\"%c\ char printf(\"\\n\"); a[][5]={{'B','A','S','I','C',},{'d','B','A','S','E'}}; }

for(i=0;i<=1;i++) }

本例的二维字符数组由于在初始化时全部元素都赋以初值,因此一维下标的长度可以不加以说明。

6.5.3 字符串和字符串结束标志

在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。前面介绍字符串常量时,已说明字符串总是以'\\0'作为串的结束符。因此当把一个字符串存入一个数组时,也把结束符'\\0'存入数组,并以此作为该字符串是否结束的标志。有了'\\0'标志后,就不必再用字符数组的长度来判断字符串的长度了。

C语言允许用字符串的方式对数组作初始化赋值。 例如:

char c[]={'c', ' ','p','r','o','g','r','a','m'}; 可写为: char c[]={\"C program\

或去掉{}写为: char c[]=\"C program\";

用字符串方式赋值比用字符逐个赋值要多占一个字节, 用于存放字符串结束标志'\\0'。上面的数组c在内存中的实际存放情况为: C 格 空p r o g r a m 0 \\‘\\0'是由C编译系统自动加上的。由于采用了‘\\0'标志,所以在用字符串赋初值时一般无须指定数组的长度, 而由系统自行处理。

强调:字符数组和字符串数组的实质区别:是否有‘\\0'的结束标志!! 例如:

char rat[6]={‘H’, ‘E’, ‘L’, ‘L’,‘O’, ‘\\0’}; char rat[5]={‘H’,‘E’,‘L’,‘L’,‘O’};

 rat中存放的是单个字符,不是字符串!!

 以单个字符形式为数组各元素赋初值  产生的数组没有结束符‘\\0’

 

rat中存放的是字符串!! 等价于char rat[]=“hello”;

6.5.4 字符数组的输入输出

1、按C格式符一个字符一个字符地单独输入输出

for(i=1;i<10;i++) 例: main()

{ int i, str[10]={“Morning”}; printf(“%c”,str[i]); for(i=1;i<10;i++) } scanf(“%c”,&str[i]);

2、按S格式符将字符串作为一个整体输入输出 例如: char str[10]; scanf(\"%s\ printf(\"%s\注意:

(1)输入的字符串中不能有空格、回车或跳格符(Tab),因为系统遇到这些分隔符会认为输入结束。 上例中若输入:hello world 则实际存入str的只有\"hello \" (2) 要保证字符数组的长度足够大。

(3) 数组名前不用加&符号,因为数组名本身代表该数组的首地址。 3、用字符串处理函数 gets 或 puts 输入输出一个字符串

前面两种方式我们在前面的章节已经学习过了,下面我们学习字符串处理函数

6.5.5 字符串处理函数

用于输入输出的字符串函数,在使用前应包含头文件\"stdio.h\",使用其它字符串函数则应包含头文件\"string.h\"。

下面介绍几个最常用的字符串函数。 1、 gets( )函数——专门用于输入字符串

一般形式是: gets(字符数组名);

其中:函数参数只能使用数组名而不能是字符串常量 例:

#include /* 必须加上*/ printf(\"你好,请输入姓名:\\n\"); #define LATH 80 gets(name); main() printf(\"真是个好名字:%s\\n\{ } char name[LATH];

2、puts()函数——专门用于输出字符串

一般形式是: puts(字符串);

其中:函数参数可以是字符串常量,也可以 是字符串变量。  与printf()的不同:Puts()函数打印字符串的全部内容,直至遇到'\\0'为止,然后自动多打印一个'\\n',起到换行的作用。而printf函数无此功能 #include char str[]=“这是初始化字符串”; #define PREDEF \"这是预定义字符串\" puts(\"这是直接使用字符串常量\"); main() puts(PREDEF); { puts(str);} 建议:

• 当多种类型的混合输入输出时,选用 scanf 和 printf; • 当大量文字信息输入输出时,使用 gets 和 puts。

3、字符串连接函数strcat

格式: strcat (字符数组名1,字符数组名2) 功能:把字符数组2中的字符串连接到字符数组1 中字符串的后面,并删去字符串1后的串标志“\\0”。本函数返回值是字符数组1的首地址。

printf(\"input your name:\\n\"); 【例】

#include\"string.h\" gets(st2); main() strcat(st1,st2); { puts(st1); static char st1[30]=\"My name is \"; } int st2[10];

本程序把初始化赋值的字符数组与动态赋值的字符串连接起来。要注意的是,字符数组1应定义足够的长度,否则不能全部装入被连接的字符串。 4、字符串拷贝函数strcpy

格式: strcpy (字符数组名1,字符数组名2)

功能:把字符数组2中的字符串拷贝到字符数组1中。串结束标志“\\0”也一同拷贝。字符数名2,也可以是一个字符串常量。这时相当于把一个字符串赋予一个字符数组。

char st1[15],st2[]=\"C Language\"; 【例】

#include\"string.h\" strcpy(st1,st2); main() puts(st1);printf(\"\\n\"); { }

本函数要求字符数组1应有足够的长度,否则不能全部装入所拷贝的字符串。 5、字符串比较函数strcmp

格式: strcmp(字符数组名1,字符数组名2)

功能:按照ASCII码顺序比较两个数组中的字符串,并由函数返回值返回比较结果。 字符串1=字符串2,返回值=0; 字符串2〉字符串2,返回值〉0; 字符串1〈字符串2,返回值〈0。

本函数也可用于比较两个字符串常量,或比较数组和字符串常量。 【例】

#include\"string.h\" k=strcmp(st1,st2); main() if(k==0) printf(\"st1=st2\\n\"); { int k; if(k>0) printf(\"st1>st2\\n\"); static char st1[15],st2[]=\"C Language\"; if(k<0) printf(\"st1本程序中把输入的字符串和数组st2中的串比较,比较结果返回到k中,根据k值再输出结果提示串。当输入为dbase时,由ASCII 码可知“dBASE”大于“C Language”故k〉0,输出结果“st1>st2”。 6、测字符串长度函数strlen

格式: strlen(字符数组名)

功能:测字符串的实际长度(不含字符串结束标志‘\\0’) 并作为函数返回值。

3、学生易错点(3’)

 字符数组和字符串数组;  字符串处理函数的使用

4、问题与讨论(7’)

5、课后任务(2’)

1)作业:P242 6.6、6.11、6.13

2)课外上机:将教材P109-111页的相关例题在vc环境下调试运行3)辅导答疑:计算机基础教研室

4)课外延伸:自己动手编写字符串处理函数。

第 11 次 课

日期 2016/5/9 周次 11 星期 一 学时 2

一、『教学目标』

了解变量地址和指针的概念,掌握变量在内存中存储的方式; 理解指针变量的含义以及如何定义指针变量;

掌握指针变量的引用,着重掌握取地址运算符&和间接运算符*的使用; 重点掌握数组与指针的使用。

二、『教学内容』

地址指针的基本概念

变量的指针和指向变量的指针变量 数组指针和指向数组的指针变量 1指向数组元素的指针 2通过指针引用数组元素 3数组名作函数参数

4指向数组的指针和指针变量

三、『重点及难点』

指针的概念; 指针变量的定义;

通过指针引用变量的意义

四、『学习方法』

指针操作相对来说比较难以理解,同学们要多上机练习,加深理解

五、『知识点』

指针、地址指针、指针变量的定义和引用 数组指针、指针引用数组 单个变量的指针应用

六、『教学设计』

详细讲解通过指针来实现对数组(一维、二维)元素的引用,并对比下标法和指针法对数组元素访问的各自优缺点;

将前面所讲数组实例由下标法引用改为指针法引用方法。要求同学必须深刻理解指针方式访问数组的原理。

用2个实例进行直观教学法,将指针的内容在程序中直接打印输出进行观察,去除指针的神秘性。

首先介绍数据在内存中的存储方式,由此引出指针的概念,并结合一定的课堂练习以帮助学生消化、理解指针的含义;

详细讲解如何定义和引用指针变量,着重介绍取地址运算符&和间接运算符*,此处应结合较多示例及课堂练习,加深学术对该知识点的理解;

举例说明指针变量作为函数参数,再次强调函数参数传递采用“传值”的方式; 介绍指向数组元素的指针,举例说明如何通过指针引用数组元素; 以程序为例讲解如何用数组名作函数参数;

介绍数组元素的地址,指向数组元素的指针变量,用指向数组的指针作函数参数,并举例说明;

七、『教学过程』 1、导课(5’)

用2个实例进行直观教学法,将指针的内容在程序中直接打印输出进行观察,去除指针的神秘性。

第1例:定义两个整型变量a 、b 从键盘输入,并且输出a 、b 的值及a 、b 的地址(澄清变量的地址和变量的值的概念)。

第2例:定义两个整型指针变量 p 、p ,分别指向变量 a、b从键盘输入数据并输出p 、p(观察结果,并与第一步的结果对比,引入指针的概念,定义、赋值、引用方式)。

2、讲授内容(75’)

指针

指针是C语言中广泛使用的一种数据类型。运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构;能很方便地使用数组和字符串;并能象汇编语言一样处理内存地址,从而编出精练而高效的程序。指针极大地丰富了C语言的功能。学习指针是学习C语言中最重要的一环,能否正确理解和使用指针是我们是否掌握C语言的一个标志。同时,指针也是C语言中最为困难的一部分,在学习中除了要正确理解基本概念,还必须要多编程,上机调试。只要作到这些,指针也是不难掌握的。

7.1 指针和指针变量

7.1.1 地址指针的基本概念

在计算机中,所有的数据都是存放在存储器中的。一般把存储器中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数不等,如整型量占2个单元,字符量占1个单元等,在前面已有详细的介绍。为了正确地访问这些内存单元,必须为每个内存单元编上号。根据一个内存单元的编号即可准确地找到该内存单元。内存单元的编号也叫做地址。 既然根据内存单元的编号或地址就可以找到所需的内存单元,所以通常也把这个地址称为指针。 内存单元的指针和内存单元的内容是两个不同的概念。

7.1.2 指针变量的定义及初始化

(1)其一般形式为:

其中,*表示这是一个指针变量,变量名即为定义的指针变量名,类型说明符表示本指针变量所指向的变量的数据类型。

 定义指针变量  int *p;

 定义了一个指针变量p,简称指针p

 p是变量,int*是类型

 p里保存一个地址。此时这个地址是哪呢(p指向哪呢)?

 指针变量初始化

 p = &a;

 *p就像普通的变量一样使用,其值是p指向的内存的内容(在上例和a等价,但寻

址方式不同)

 p可以动态(任意)地指向不同内存,从而使*p代表不同的变量 (2)指针变量的引用

两个有关的运算符: &:取地址运算符。

*:指针运算符(或称“间接访问” 运算符)。

C语言中提供了地址运算符&来表示变量的地址。 其一般形式为: &变量名;

如&a表示变量a的地址,&b表示变量b的地址。变量本身必须预先说明。 设有指向整型变量的指针变量p,如要把整型变量a 的地址赋予p可以有以下两种方式:

指针变量初始化的方法 int a;

int *p=&a; 赋值语句的方法 int a; int *p;

【例】举例说明所讲内容 main() { int a,b;

int *pointer_1, *pointer_2; a=100;b=10; pointer_1=&a; pointer_2=&b;

printf(\"%d,%d\\n\

printf(\"%d,%d\\n\}

延伸:对下面再的关于“&”和“*”的问题进行考虑:

如果已经执行了“pointer_1=&a;”语句,则&*pointer_1是什么含义? *&a含义是什么?

(pointer_1)++和pointer_1++的区别?

(3)指针变量作为函数参数

函数的参数不仅可以是整型、实型、字符型等数据,还可以是指针类型。它的作用是将一个变量的地址传送到另一个函数中。

【例】题目同上例,即输入的两个整数按大小顺序输出。今用函数处理,而且用指针类型的数据作函数参数。

swap(int *p1,int *p2) {int temp; temp=*p1; *p1=*p2; *p2=temp; }

main() { int a,b;

int *pointer_1,*pointer_2; scanf(\"%d,%d\

pointer_1=&a;pointer_2=&b;

if(a接着执行执行swap函数的函数体使*p1和*p2的值互换,也就是使a和b的值互换。

函数调用结束后,p1和p2不复存在(已释放)如图。

最后在main函数中输出的a和b的值是已经过交换的值。

请注意交换*p1和*p2的值是如何实现的。请找出下列程序段的错误: swap(int *p1,int *p2) {int *temp;

*temp=*p1; /*此语句有问题*/ *p1=*p2; *p2=temp; }

请考虑下面的函数能否实现实现a和b互换。 swap(int x,int y) {int temp; temp=x; x=y; y=temp; }

如果在main函数中用“swap(a,b);”调用swap函数,会有什么结果呢?请看下图所示。

【例】请注意,不能企图通过改变指针形参的值而使指针实参的值改变。 swap(int *p1,int *p2) {int *p; p=p1; p1=p2; p2=p; }

main() { int a,b;

int *pointer_1,*pointer_2; scanf(\"%d,%d\

pointer_1=&a;pointer_2=&b;

if(aprintf(\"\\n%d,%d\\n\ }

其中的问题在于不能实现如图所示的第四步(d)。

(4)指针变量几个问题的进一步说明

指针变量可以进行某些运算,但其运算的种类是有限的。它只能进行赋值运算和部分算术运算及关系运算。 指针运算符

取地址运算符&:取地址运算符&是单目运算符,其结合性为自右至左,其功能是取变量的地址。在scanf函数及前面介绍指针变量赋值中,我们已经了解并使用了&运算符。

取内容运算符*:取内容运算符*是单目运算符,其结合性为自右至左,用来表示指针变量所指的变量。在*运算符之后跟的变量必须是指针变量。

需要注意的是指针运算符*和指针变量说明中的指针说明符*不是一回事。在指针变量说明中,“*”是类型说明符,表示其后的变量是指针类型。而表达式中出现的“*”则是一个运算符用以表示指针变量所指的变量。 加减算术运算

对于指向数组的指针变量,可以加上或减去一个整数n。设pa是指向数组a的指针变量,则pa+n,pa-n,pa++,++pa,pa--,--pa运算都是合法的。指针变量加或减一个整数n的意义是把指针指向的当前位置(指向某数组元素)向前或向后移动n个位置。应该注意,数组指针变量向前或向后移动一个位置和地址加1或减1在概念上是不同的。因为数组可以有不同的类型,各种类型的数组元素所占的字节长度是不同的。如指针变量加1,即向后移动1 个位置表示指针变量指向下一个数据元素的首地址。而不是在原地址基础上加1。例如: int a[5],*pa;

pa=a; /*pa指向数组a,也是指向a[0]*/ pa=pa+2; /*pa指向a[2],即pa的值为&pa[2]*/

指针变量的加减运算只能对数组指针变量进行,对指向其它类型变量的指针变量作加减运算是毫无意义的。

两个指针变量之间的运算:只有指向同一数组的两个指针变量之间才能进行运算,否则运算毫无意义。

3、问题与讨论(8’)

a) 指针定义后为什么一定要复制才能使用? b) 如果不赋值直接使用可能会发生什么后果?

c) 为什么指向某个变量的指针一定要同变量的类型一致?

4、知识要点回顾(4’)

a) 变量的存取方式有直接访问(通过变量的名称访问变量)和间接访问(通过变量的 b) 指针访问变量)两种

i. 1变量的指针是变量的首地址 ii. 2指针变量用来存放变量的地址

c) 指针变量的定义也必须要指定类型,表示指针所要指向的变量数据类型 d) 在使用指针变量之前,必须为其赋值,即使指针变量指向某一个确定的值 e) &为取地址运算符,*为指针运算符(也叫取值运算符)

6、课后任务(2’)

a) 整理课堂笔记;预习指针数组和指针函数部分知识。 b) 作业:

i. 1输入3个数,按由小到大的顺序输出,用指针方法处理。 ii. 2有N个人围成一圈,顺序排号,从第一个人开始报数(从1到3),凡报到3的人退出 圈子,问最后留下的是原来的几号? c) 3)上机:教材上讲过的例题在VC环境下调试运行。 d) 课外延伸:迷宫问题、汉诺塔问题

第 12 次 课

日期 2016/5/15 周次 12 星期 一 学时 2

一、『学习目标』

掌握指针变量的引用,着重掌握取地址运算符&和间接运算符*的使用; 重点掌握数组与指针的使用。

二、『教学内容』

数组指针和指向数组的指针变量

1指向数组元素的指针 2通过指针引用数组元素 3数组名作函数参数

4指向数组的指针和指针变量

三、『重点及难点』

重点:

指针的基本运算

利用指针处理变量、数组和函数 难点: 指针的操作 指针的应用

四、『学习方法』

本次课内容和概念较多,有些内容有难度,需要多练、多体会和思考,才能完全掌握。全局变量和局部变量要注重他们的作用范围和生存期;另要重点掌握自动变量和静态变量的特点,尤其是静态变量的特殊性

五、『知识点』

指针、地址指针、指针变量的定义和引用 数组指针、指针引用数组 单个变量的指针应用

六、『教学设计』

用2个实例进行直观教学法,将指针的内容在程序中直接打印输出进行观察,去除指针的神秘性。

首先介绍数据在内存中的存储方式,由此引出指针的概念,并结合一定的课堂练习以帮助学生消化、理解指针的含义;

详细讲解如何定义和引用指针变量,着重介绍取地址运算符&和间接运算符*,此处应结合较多示例及课堂练习,加深学术对该知识点的理解;

举例说明指针变量作为函数参数,再次强调函数参数传递采用“传值”的方式; 介绍指向数组元素的指针,举例说明如何通过指针引用数组元素; 以程序为例讲解如何用数组名作函数参数;

介绍数组元素的地址,指向数组元素的指针变量,用指向数组的指针作函数参数,并

举例说明;

七、『教学过程』 1、导课(5分钟)

用2个实例进行直观教学法,将指针的内容在程序中直接打印输出进行观察,去除指针的神秘性。

第1例:定义两个整型变量a 、b 从键盘输入,并且输出a 、b 的值及a 、b 的地址(澄清变量的地址和变量的值的概念)。

第2例:定义两个整型指针变量 p 、p ,分别指向变量 a、b从键盘输入数据并输出p 、p(观察结果,并与第一步的结果对比,引入指针的概念,定义、赋值、引用方式)。

2、讲授内容(75分钟) 教学详案略(见ppt) 3、学生易错点(6分钟)

函数递归执行机理的理解,递归的实现; 构成函数重载的要点和方法; 函数模板的实现;

默认值参数的给定的顺序和对带默认值参数函数的正确调用方法及参数个数的确定

4、问题与讨论(8分钟)

指针定义后为什么一定要复制才能使用? 如果不赋值直接使用可能会发生什么后果?

为什么指向某个变量的指针一定要同变量的类型一致?

5、知识要点回顾(4分钟)

变量的存取方式有直接访问(通过变量的名称访问变量)和间接访问(通过变量的 指针访问变量)两种

1变量的指针是变量的首地址 2指针变量用来存放变量的地址

指针变量的定义也必须要指定类型,表示指针所要指向的变量数据类型 在使用指针变量之前,必须为其赋值,即使指针变量指向某一个确定的值 &为取地址运算符,*为指针运算符(也叫取值运算符)

6、课后任务(2分钟)

整理课堂笔记;预习指针数组和指针函数部分知识。 作业:习题11、15(教材P153) 上机:指针程序设计

课外延伸:迷宫问题、汉诺塔问题

第 13 次 课

日期 2016/5/21 周次 13 星期 一 学时 2

一、『学习目标』

了解结构体变量的定义,成员的引用、初始化操作; 掌握定义结构体类型、变量,并引用;

二、『教学内容』

为什么定义结构体类型

结构体变量的定义、初始化和引用 共用体

三、『重点及难点』

重难点:用typedef 定义数据类型,结构体变量及结构体数组的定义、初始化和成员的引用

四、『学习方法』

本次课内容和概念较多,内容有难度,需要多练、多体会和思考,才能完全掌握。结构体的关键字是struct,共用体的关键字是union,结构体变量与结构体类型不同;共用体的使用格式与结构体相类似

五、『知识点』

基本数据类型,构造数据类型。

整型、实型、指针、空类型、字符型和布尔型。 结构体类型、共用体(联合)类型、类。typedef

六、『教学设计』

以学生成绩管理中的实际问题为例,阐述结构体类型和共用体类型产生的必要性,其各自的有缺点是什么。

引出共用体的概念,及其与结构体的区别 对本节知识进行小结。

七、『教学过程』 教学详案略(见ppt) 1导课(5分钟)

学习过几种数据类型?分别是那些?分别如何操作(定义、初始化、引用、输入输出)? 考虑一个学生的信息,(考虑家长通知书上的成绩单问题),求该同学的平均分数,从键盘输入,并且输出结果(不使用结构的情形)

2讲授内容(77分钟)

教学详案略(见ppt)

3学生容易出错的地方(5分钟)

定义结构体变量前不先定义类型 定义类型时大括号后不加分号 结构体变量与结构体类型区别

4问题与讨论(6分钟)

为什么使用结构体类型?

如果定义一个日期类型的结构体,应包含哪些成员? 如果在结构体中再包含结构体,将如何引用?

5 小结(可由问题与讨论方式给出)(5分钟)

结构体变量中的成员类型可以各不相同

必须先定义结构体类型,再用该类型定义结构体变量 对于结构变量的使用必须通过引用成员实现,使用符号

结构变量的初始化时注意数据的顺序、类型要与结构类型定义时相匹配, 可以对部分数据初始化

6 课后任务(2分钟)

用指向结构体成员的指针进行数据的输入输出和运算:日期类型的结构体 计算某一日是星期几

定义一个图书结构体类型,包含书名、书价信息,定义用户函数进行数据的输入输出。 课后习题:习题8.1,8.2(教材P350)

第 14 次 课

日期 2016/5/29 周次 14 星期 一 学时 2

一、『学习目标』

了解在函数中使用结构体变量作函数参数; 了解采用指针引用结构体变量及数组; 理解结构体指针变量与其所指变量的关系; 掌握使用指针引用结构体数组。

二、『教学内容』

结构数组的定义

结构指针变量的说明和使用 结构体与函数 共用体

三、『重点及难点』

结构体变量作函数参数 指向结构体的指针

结构指针变量作函数参数

四、『学习方法』

由于本节内容语法点比较多,所以在教学中结合多个小程序,在练习中掌握各知识点。链表是由一个结点所构成的,一个结点就是一个结构体变量 通过实例操作,体会语法点,由教师与同学共同总结。

五、『知识点』

基本数据类型,构造数据类型。

整型、实型、指针、空类型、字符型和布尔型。

数组类型、结构体类型、共用体(联合)类型、类。

六、『教学设计』

以学生成绩问题为实例,定义一个结构体类型变量,使学生形象地理解结构体变量的含义; 在上述问题基础上,初始化已定义的结构体数组,并举例说明;

简要介绍指向结构体类型数据的指针,并通过程序实例讲授结构体变量指针的应用。

以程序示例讲解指向结构体数组的指针,此处注意引导学生思考该类型与指向指针的指针的区别与联系;

举例讲解用结构体变量和指向结构体的指针作函数参数;

布置课后作业及上机任务,辅导答疑以及课后延伸阅读等课后任务。

七、『教学过程』 1导课(5分钟)

学习过几种数据类型?分别是那些?分别如何操作(定义、初始化、引用、输入输出)?

考虑一个学生的信息,(考虑家长通知书上的成绩单问题),求该同学的平均分数,从键盘输入,并且输出结果(不使用结构的情形)

2讲授内容(77分钟)

上次课复习 多重指针 动态内存分配 讲授新课

定义一个结构的一般形式

在实际问题中,一组数据往往具有不同的数据类型。例如,在学生登记表中,姓名应为字符型;学号可为整型或字符型;年龄应为整型;性别应为字符型;成绩可为整型或实型。 显然不能用一个数组来存放这一组数据。因为数组中各元素的类型和长度都必须一致,以便于编译系统处理。为了解决这个问题,C语言中给出了另一种构造数据类型——“结构(structure)”或叫“结构体”。 它相当于其它高级语言中的记录。“结构”是一种构造类型,它是由若干“成员”组成的。每一个成员可以是一个基本数据类型或者又是一个构造类型。结构既是一种“构造”而成的数据类型,那么在说明和使用之前必须先定义它,也就是构造它。如同在说明和调用函数之前要先定义函数一样。 定义一个结构的一般形式为: struct 结构名 {成员表列};

成员表列由若干个成员组成,每个成员都是该结构的一个组成部分。对每个成员也必须作类型说明,其形式为:

类型说明符 成员名;

成员名的命名应符合标识符的书写规定。例如: struct stu {

int num;

char name[20]; char sex; float score; };

在这个结构定义中,结构名为stu,该结构由4个成员组成。第一个成员为num,整型变量;第二个成员为name,字符数组;第三个成员为sex,字符变量;第四个成员为score,实型变量。应注意在括号后的分号是不可少的。结构定义之后,即可进行变量说明。凡说明为结构stu的变量都由上述4个成员组成。由此可见, 结构是一种复杂的数据类型,是数目固定,类型不同的若干有序变量的集合。

结构类型变量的说明

说明结构变量有以下三种方法。以上面定义的stu为例来加以说明。 先定义结构,再说明结构变量。 如: struct stu {

int num;

char name[20];

char sex; float score; };

struct stu boy1,boy2;

说明了两个变量boy1和boy2为stu结构类型。也可以用宏定义使一个符号常量来表示一个结构类型。 例如:

#define STU struct stu STU {

int num;

char name[20]; char sex; float score; };

STU boy1,boy2;

在定义结构类型的同时说明结构变量。 例如: struct stu {

int num;

char name[20]; char sex; float score; }boy1,boy2;

这种形式的说明的一般形式为: struct 结构名 { 成员表列 }变量名表列;

直接说明结构变量。 例如: struct {

int num;

char name[20]; char sex; float score; }boy1,boy2;

这种形式的说明的一般形式为: struct { 成员表列 }变量名表列;

第三种方法与第二种方法的区别在于第三种方法中省去了结构名,而直接给出结构变量。三种方法

中说明的boy1,boy2变量都具有下图所示的结构。

说明了boy1,boy2变量为stu类型后,即可向这两个变量中的各个成员赋值。在上述stu结构定义中,所有的成员都是基本数据类型或数组类型。

成员也可以又是一个结构,即构成了嵌套的结构。例如,下图给出了另一个数据结构。

按图可给出以下结构定义: struct date {

int month; int day; int year; }; struct{

int num;

char name[20]; char sex;

struct date birthday; float score; }boy1,boy2;

首先定义一个结构date,由month(月)、day(日)、year(年) 三个成员组成。 在定义并说明变量 boy1 和 boy2 时,其中的成员birthday被说明为data结构类型。成员名可与程序中其它变量同名,互不干扰。

结构变量成员的表示方法

在程序中使用结构变量时,往往不把它作为一个整体来使用。在ANSI C中除了允许具有相同类型的结构变量相互赋值以外,一般对结构变量的使用,包括赋值、输入、输出、运算等都是通过结构变量的成员来实现的。

表示结构变量成员的一般形式是: 结构变量名.成员名 例如:

boy1.num 即第一个人的学号 boy2.sex 即第二个人的性别

如果成员本身又是一个结构则必须逐级找到最低级的成员才能使用。 例如:

boy1.birthday.month

即第一个人出生的月份成员可以在程序中单独使用,与普通变量完全相同。 结构变量的赋值

结构变量的赋值就是给各成员赋值。可用输入语句或赋值语句来完成。

结构指针变量的说明和使用 指向结构变量的指针

一个指针变量当用来指向一个结构变量时,称之为结构指针变量。结构指针变量中的值是所指向的结构变量的首地址。通过结构指针即可访问该结构变量,这与数组指针和函数指针的情况是相同的。 结构指针变量说明的一般形式为: struct 结构名 *结构指针变量名

例如,在前面的例题中定义了stu这个结构,如要说明一个指向stu的指针变量pstu,可写为: struct stu *pstu;

当然也可在定义stu结构时同时说明pstu。与前面讨论的各类指针变量相同,结构指针变量也必须要先赋值后才能使用。

赋值是把结构变量的首地址赋予该指针变量,不能把结构名赋予该指针变量。如果boy是被说明为stu类型的结构变量,则: pstu=&boy 是正确的,而: pstu=&stu 是错误的。

结构名和结构变量是两个不同的概念,不能混淆。结构名只能表示一个结构形式,编译系统并不对它分配内存空间。只有当某变量被说明为这种类型的结构时,才对该变量分配存储空间。因此上面&stu这种写法是错误的,不可能去取一个结构名的首地址。有了结构指针变量,就能更方便地访问结构变量的各个成员。 其访问的一般形式为:

(*结构指针变量).成员名 或为:

结构指针变量->成员名 例如: (*pstu).num 或者:

pstu->num

应该注意(*pstu)两侧的括号不可少,因为成员符“.”的优先级高于“*”。如去掉括号写作*pstu.num则等效于*(pstu.num),这样,意义就完全不对了。

下面通过例子来说明结构指针变量的具体说明和使用方法。 指向结构数组的指针

指针变量可以指向一个结构数组,这时结构指针变量的值是整个结构数组的首地址。结构指针变量也可指向结构数组的一个元素,这时结构指针变量的值是该结构数组元素的首地址。

设ps为指向结构数组的指针变量,则ps也指向该结构数组的0号元素,ps+1指向1号元素,ps+i则指向i号元素。这与普通数组的情况是一致的。

应该注意的是,一个结构指针变量虽然可以用来访问结构变量或结构数组元素的成员,但是,不能使它指向一个成员。也就是说不允许取一个成员的地址来赋予它。因此,下面的赋值是错误的。 ps=&boy[1].sex; 而只能是:

ps=boy;(赋予数组首地址) 或者是:

ps=&boy[0];(赋予0号元素首地址) 结构指针变量作函数参数

在ANSI C标准中允许用结构变量作函数参数进行整体传送。但是这种传送要将全部成员逐个传送,特别是成员为数组时将会使传送的时间和空间开销很大,严重地降低了程序的效率。因此最好的办法就是使用指针,即用指针变量作函数参数进行传送。这时由实参传向形参的只是地址,从而减少了时间和空间的开销。 动态存储分配

在数组一章中,曾介绍过数组的长度是预先定义好的,在整个程序中固定不变。C语言中不允许动态数组类型。 例如: int n;

scanf(\"%d\int a[n];

用变量表示长度,想对数组的大小作动态说明,这是错误的。但是在实际的编程中,往往会发生这种情况,即所需的内存空间取决于实际输入的数据,而无法预先确定。对于这种问题,用数组的办法很难解决。为了解决上述问题,C语言提供了一些内存管理函数,这些内存管理函数可以按需要动态地分配内存空间,也可把不再使用的空间回收待用,为有效地利用内存资源提供了手段。 常用的内存管理函数有以下三个: 分配内存空间函数malloc 调用形式:

(类型说明符*)malloc(size)

功能:在内存的动态存储区中分配一块长度为\"size\"字节的连续区域。函数的返回值为该区域的首地址。

“类型说明符”表示把该区域用于何种数据类型。 (类型说明符*)表示把返回值强制转换为该类型指针。 “size”是一个无符号数。 例如:

pc=(char *)malloc(100);

表示分配100个字节的内存空间,并强制转换为字符数组类型,函数的返回值为指向该字符数组的指针,把该指针赋予指针变量pc。 分配内存空间函数 calloc

calloc 也用于分配内存空间。 调用形式:

(类型说明符*)calloc(n,size) 功能:在内存动态存储区中分配n块长度为“size”字节的连续区域。函数的返回值为该区域的首地址。 (类型说明符*)用于强制类型转换。

calloc函数与malloc 函数的区别仅在于一次可以分配n块区域。 例如:

ps=(struet stu*)calloc(2,sizeof(struct stu)); 其中的sizeof(struct stu)是求stu的结构长度。因此该语句的意思是:按stu的长度分配2块连续区域,强制转换为stu类型,并把其首地址赋予指针变量ps。 释放内存空间函数free 调用形式: free(void*ptr);

功能:释放ptr所指向的一块内存空间,ptr是一个任意类型的指针变量,它指向被释放区域的首地址。被释放区应是由malloc或calloc函数所分配的区域。

类型定义符typedef

C语言不仅提供了丰富的数据类型,而且还允许由用户自己定义类型说明符,也就是说允许由用户为数据类型取“别名”。类型定义符typedef即可用来完成此功能。例如,有整型量a,b,其说明如下:

int a,b;

其中int是整型变量的类型说明符。int的完整写法为integer,为了增加程序的可读性,可把整型说明符用typedef定义为: typedef int INTEGER

这以后就可用INTEGER来代替int作整型变量的类型说明了。 例如:

INTEGER a,b; 它等效于: int a,b;

用typedef定义数组、指针、结构等类型将带来很大的方便,不仅使程序书写简单而且使意义更为明确,因而增强了可读性。 例如:

typedef char NAME[20]; 表示NAME是字符数组类型,数组长度为20。然后可用NAME 说明变量,如:

NAME a1,a2,s1,s2; 完全等效于:

char a1[20],a2[20],s1[20],s2[20] typedef定义的一般形式为: typedef 原类型名 新类型名

其中原类型名中含有定义部分,新类型名一般用大写表示,以便于区别。

有时也可用宏定义来代替typedef的功能,但是宏定义是由预处理完成的,而typedef则是在编译时完成的,后者更为灵活方便。 课堂小结:

结构体的定义及使用方法、结构体数组的定义及使用方法、结构体数组的定义及使用方法 链表的思想、建立/输出

3学生容易出错的地方(5分钟)

链表是由一个结点所构成的,一个结点就是一个结构体变量 结构体数组知考虑数组不考虑结构体特性

结构体数组的成员在输入输出时经常出错,比如&经常误用

4问题与讨论(6分钟)

如果在结构体中再包含数组成员,将如何引用? 如果在结构体中再包含结构体,将如何引用?

5 小结(可由问题与讨论方式给出)(5分钟)

结构体变量中的成员类型可以各不相同

必须先定义结构体类型,再用该类型定义结构体变量 对于结构变量的使用必须通过引用成员实现,使用符号

结构变量的初始化时注意数据的顺序、类型要与结构类型定义时相匹配, 可以对部分数据初始化

结构变量作函数参数时同简单变量作函数参数时一样,是单向“值传递”方式,形参数据改变不影响实参

结构体数组的每一个数组元素,都是一个结构体类型数据,均包含结构体类型数据的所有成员 结构数组元素的引用需要考虑数组与成员两方面,数组名[下标]. 成员 结构数组初始化类似于数组初始化,可用{}分开各个元素

结构数组作函数参数同数组名作函数参数一样,是地址传递方式,形参结构变量中

6 课后任务(2分钟)

用指向结构体成员的指针进行数据的输入输出和运算:日期类型的结构体 计算某一日是星期几

定义一个图书结构体类型,包含书名、书价信息,定义用户函数进行数据的输入输出。 课后习题:习题6、8、14(教材P292)

第 15 次 课

日期 2016/6/5 周次 15 星期 一 学时 2

一、『学习目标』

掌握文件系统和分类,文件名、文件的分类、文件读写的基本概念 ; 文件操作步骤 文本文件的读写

能够将单个字符、字符串进行文件读写 进行文件复制等程序的编写 文件的写入读出

能够对数据块进行操作 进行文件打开的出错检测 数据块的读写

文件中位置指针的概念 文件定位操作的意义

二、『教学内容』

文本文件的操作 二进制文件的操作

文件的定位操作和随即读写

三、『重点及难点』 重点:

能够将单个字符、字符串进行文件读写 文件定位操作的意义

难点:

文件的写入读出 数据块的读写 文件的随机读写

四、『学习方法』

引导进行,对每一步的完成检查实现情况,引导学生学会使用帮助信息,培养学习能力,在练习中掌握各知识点。

通过实例操作,体会语法点,由教师与同学共同总结。

五、『知识点』

文件类型指针(FILE类型指针)。

文件的打开与关闭(FOPEN,FCLOSE)。

文件的读写(FPUTC,FGETC,FPUTS,FGETS,FREAD,FWRITE,FPRINT,FSCANF函数) 文件的定位(REWIND,FSEEK函数)。

六、『教学设计』

提问同学们自己了解的文件的概念、使用文件的经历 引入C 语言中的文件

对文件进行操作:将一个字符写入文件,查看文件内容(文件操作四部曲)

采用对比的方法,将二进制文件操作同文本文件的操作对比进行,通过项目推进集合几种数据块读写操作。对每一步的完成检查实现情况,引导学生学会使用帮助信息,培养学习能力 布置课后作业及上机任务,辅导答疑以及课后延伸阅读等课后任务。

七、『教学过程』

1导课(2分钟)

C语言中使用的是什么文件系统 什么是文件指针

文件操作需要哪些步骤?。

2讲授内容(78分钟)

文件概述

所谓“文件”是指一组相关数据的有序集合。这个数据集有一个名称,叫做文件名。实际上在前面的各章中我们已经多次使用了文件,例如源程序文件、目标文件、可执行文件、库文件 (头文件)等。 文件通常是驻留在外部介质(如磁盘等)上的,在使用时才调入内存中来。从不同的角度可对文件作不同的分类。从用户的角度看,文件可分为普通文件和设备文件两种。

普通文件是指驻留在磁盘或其它外部介质上的一个有序数据集,可以是源文件、目标文件、可执行程序;也可以是一组待输入处理的原始数据,或者是一组输出的结果。对于源文件、目标文件、可执行程序可以称作程序文件,对输入输出数据可称作数据文件。

设备文件是指与主机相联的各种外部设备,如显示器、打印机、键盘等。在操作系统中,把外部设备也看作是一个文件来进行管理,把它们的输入、输出等同于对磁盘文件的读和写。

通常把显示器定义为标准输出文件,一般情况下在屏幕上显示有关信息就是向标准输出文件输出。如前面经常使用的printf,putchar函数就是这类输出。

键盘通常被指定标准的输入文件,从键盘上输入就意味着从标准输入文件上输入数据。scanf,getchar函数就属于这类输入。

从文件编码的方式来看,文件可分为ASCII码文件和二进制码文件两种。ASCII文件也称为文本文件,这种文件在磁盘中存放时每个字符对应一个字节,用于存放对应的ASCII码。 例如,数5678的存储形式为:

ASCII码: 00110101 00110110 00110111 00111000 ↓ ↓ ↓ ↓

十进制码: 5 6 7 8 共占用4个字节。

ASCII码文件可在屏幕上按字符显示,例如源程序文件就是ASCII文件,用DOS命令TYPE可显示文件的内容。由于是按字符显示,因此能读懂文件内容。 二进制文件是按二进制的编码方式来存放文件的。 例如, 数5678的存储形式为: 00010110 00101110 只占二个字节。二进制文件虽然也可在屏幕上显示,但其内容无法读懂。C系统在处理这些文件时,

并不区分类型,都看成是字符流,按字节进行处理。

输入输出字符流的开始和结束只由程序控制而不受物理符号(如回车符)的控制。 因此也把这种文件称作“流式文件”。

本章讨论流式文件的打开、关闭、读、写、 定位等各种操作。 文件指针

在C语言中用一个指针变量指向一个文件,这个指针称为文件指针。通过文件指针就可对它所指的文件进行各种操作。

定义说明文件指针的一般形式为: FILE *指针变量标识符;

其中FILE应为大写,它实际上是由系统定义的一个结构,该结构中含有文件名、文件状态和文件当前位置等信息。在编写源程序时不必关心FILE结构的细节。 例如: FILE *fp;

表示fp是指向FILE结构的指针变量,通过fp即可找存放某个文件信息的结构变量,然后按结构变量提供的信息找到该文件,实施对文件的操作。习惯上也笼统地把fp称为指向一个文件的指针。 文件的打开与关闭

文件在进行读写操作之前要先打开,使用完毕要关闭。所谓打开文件,实际上是建立文件的各种有关信息,并使文件指针指向该文件,以便进行其它操作。关闭文件则断开指针与文件之间的联系,也就禁止再对该文件进行操作。

在C语言中,文件操作都是由库函数来完成的。在本章内将介绍主要的文件操作函数。 文件的打开(fopen函数)

fopen函数用来打开一个文件,其调用的一般形式为: 文件指针名=fopen(文件名,使用文件方式); 其中,

“文件指针名”必须是被说明为FILE 类型的指针变量; “文件名”是被打开文件的文件名;

“使用文件方式”是指文件的类型和操作要求。 “文件名”是字符串常量或字符串数组。 例如:

FILE *fp; fp=(\"file a\

其意义是在当前目录下打开文件file a,只允许进行“读”操作,并使fp指向该文件。 又如:

FILE *fphzk

fphzk=(\"c:\\\\hzk16\

其意义是打开C驱动器磁盘的根目录下的文件hzk16,这是一个二进制文件,只允许按二进制方式进行读操作。两个反斜线“\\\\ ”中的第一个表示转义字符,第二个表示根目录。 使用文件的方式共有12种,下面给出了它们的符号和意义。 文件使用方式 “rt” “wt” “at” “rb” “wb” 意义 只读打开一个文本文件,只允许读数据 只写打开或建立一个文本文件,只允许写数据 追加打开一个文本文件,并在文件末尾写数据 只读打开一个二进制文件,只允许读数据 只写打开或建立一个二进制文件,只允许写数据 “ab” “rt+” “wt+” “at+” “rb+” “wb+” “ab+” 追加打开一个二进制文件,并在文件末尾写数据 读写打开一个文本文件,允许读和写 读写打开或建立一个文本文件,允许读写 读写打开一个文本文件,允许读,或在文件末追加数据 读写打开一个二进制文件,允许读和写 读写打开或建立一个二进制文件,允许读和写 读写打开一个二进制文件,允许读,或在文件末追加数据 对于文件使用方式有以下几点说明:

文件使用方式由r,w,a,t,b,+六个字符拼成,各字符的含义是: r(read): 读 w(write): 写 a(append): 追加

t(text): 文本文件,可省略不写 b(banary): 二进制文件 +: 读和写

凡用“r”打开一个文件时,该文件必须已经存在,且只能从该文件读出。

用“w”打开的文件只能向该文件写入。若打开的文件不存在,则以指定的文件名建立该文件,若打开的文件已经存在,则将该文件删去,重建一个新文件。

若要向一个已存在的文件追加新的信息,只能用“a”方式打开文件。但此时该文件必须是存在的,否则将会出错。

在打开一个文件时,如果出错,fopen将返回一个空指针值NULL。在程序中可以用这一信息来判别是否完成打开文件的工作,并作相应的处理。因此常用以下程序段打开文件: if((fp=fopen(\"c:\\\\hzk16\ {

printf(\"\\nerror on open c:\\\\hzk16 file!\"); getch(); exit(1); }

这段程序的意义是,如果返回的指针为空,表示不能打开C盘根目录下的hzk16文件,则给出提示信息“error on open c:\\ hzk16 file!”,下一行getch()的功能是从键盘输入一个字符,但不在屏幕上显示。在这里,该行的作用是等待,只有当用户从键盘敲任一键时,程序才继续执行,因此用户可利用这个等待时间阅读出错提示。敲键后执行exit(1)退出程序。

把一个文本文件读入内存时,要将ASCII码转换成二进制码,而把文件以文本方式写入磁盘时,也要把二进制码转换成ASCII码,因此文本文件的读写要花费较多的转换时间。对二进制文件的读写不存在这种转换。

标准输入文件(键盘),标准输出文件(显示器),标准出错输出(出错信息)是由系统打开的,可直接使用。

文件关闭函数(fclose函数)

文件一旦使用完毕,应用关闭文件函数把文件关闭,以避免文件的数据丢失等错误。 fclose函数调用的一般形式是: fclose(文件指针); 例如:

fclose(fp);

正常完成关闭文件操作时,fclose函数返回值为0。如返回非零值则表示有错误发生。

文件的读写

对文件的读和写是最常用的文件操作。在C语言中提供了多种文件读写的函数: ·字符读写函数 :fgetc和fputc ·字符串读写函数:fgets和fputs ·数据块读写函数:freed和fwrite ·格式化读写函数:fscanf和fprinf

下面分别予以介绍。使用以上函数都要求包含头文件stdio.h。 字符读写函数fgetc和fputc

字符读写函数是以字符(字节)为单位的读写函数。 每次可从文件读出或向文件写入一个字符。 读字符函数fgetc

fgetc函数的功能是从指定的文件中读一个字符,函数调用的形式为: 字符变量=fgetc(文件指针); 例如:

ch=fgetc(fp);

其意义是从打开的文件fp中读取一个字符并送入ch中。 对于fgetc函数的使用有以下几点说明:

在fgetc函数调用中,读取的文件必须是以读或读写方式打开的。 读取字符的结果也可以不向字符变量赋值, 例如: fgetc(fp);

但是读出的字符不能保存。

在文件内部有一个位置指针。用来指向文件的当前读写字节。在文件打开时,该指针总是指向文件的第一个字节。使用fgetc 函数后,该位置指针将向后移动一个字节。 因此可连续多次使用fgetc函数,读取多个字符。应注意文件指针和文件内部的位置指针不是一回事。文件指针是指向整个文件的,须在程序中定义说明,只要不重新赋值,文件指针的值是不变的。文件内部的位置指针用以指示文件内部的当前读写位置,每读写一次,该指针均向后移动,它不需在程序中定义说明,而是由系统自动设置的。

【例】读入文件c1.doc,在屏幕上输出。 #include main() {

FILE *fp; char ch;

if((fp=fopen(\"d:\\\\jrzh\\\\example\\\\c1.txt\ {

printf(\"\\nCannot open file strike any key exit!\"); getch(); exit(1); }

ch=fgetc(fp); while(ch!=EOF) {

putchar(ch); ch=fgetc(fp);

}

fclose(fp); }

本例程序的功能是从文件中逐个读取字符,在屏幕上显示。程序定义了文件指针fp,以读文本文件方式打开文件“d:\\\\jrzh\\\\example\\\\ex1_1.c”,并使fp指向该文件。如打开文件出错,给出提示并退出程序。程序第12行先读出一个字符,然后进入循环,只要读出的字符不是文件结束标志(每个文件末有一结束标志EOF)就把该字符显示在屏幕上,再读入下一字符。每读一次,文件内部的位置指针向后移动一个字符,文件结束时,该指针指向EOF。执行本程序将显示整个文件。 写字符函数fputc

fputc函数的功能是把一个字符写入指定的文件中,函数调用的形式为: fputc(字符量,文件指针);

其中,待写入的字符量可以是字符常量或变量,例如: fputc('a',fp);

其意义是把字符a写入fp所指向的文件中。 对于fputc函数的使用也要说明几点:

被写入的文件可以用写、读写、追加方式打开,用写或读写方式打开一个已存在的文件时将清除原有的文件内容,写入字符从文件首开始。如需保留原有文件内容,希望写入的字符以文件末开始存放,必须以追加方式打开文件。被写入的文件若不存在,则创建该文件。 每写入一个字符,文件内部位置指针向后移动一个字节。

fputc函数有一个返回值,如写入成功则返回写入的字符,否则返回一个EOF。可用此来判断写入是否成功。

数据块读写函数fread和fwtrite

C语言还提供了用于整块数据的读写函数。可用来读写一组数据,如一个数组元素,一个结构变量的值等。

读数据块函数调用的一般形式为: fread(buffer,size,count,fp);

写数据块函数调用的一般形式为: fwrite(buffer,size,count,fp); 其中:

buffer 是一个指针,在fread函数中,它表示存放输入数据的首地址。在fwrite函数中,它表示存放输出数据的首地址。

size 表示数据块的字节数。

count 表示要读写的数据块块数。 fp 表示文件指针。 例如:

fread(fa,4,5,fp);

其意义是从fp所指的文件中,每次读4个字节(一个实数)送入实数组fa中,连续读5次,即读5个实数到fa中。 【例】(综合实验将会用到)从键盘输入两个学生数据,写入一个文件中,再读出这两个学生的数据显示在屏幕上。 #include struct stu {

char name[10];

int num; int age;

char addr[15];

}boya[2],boyb[2],*pp,*qq; main() {

FILE *fp; char ch; int i; pp=boya; qq=boyb;

if((fp=fopen(\"d:\\\\jrzh\\\\example\\\\stu_list\ {

printf(\"Cannot open file strike any key exit!\"); getch(); exit(1); }

printf(\"\\ninput data\\n\"); for(i=0;i<2;i++,pp++)

scanf(\"%s%d%d%s\ pp=boya;

fwrite(pp,sizeof(struct stu),2,fp); rewind(fp);

fread(qq,sizeof(struct stu),2,fp);

printf(\"\\n\\nname\number age addr\\n\"); for(i=0;i<2;i++,qq++)

printf(\"%s\%5d%7d %s\\n\ fclose(fp); }

本例程序定义了一个结构stu,说明了两个结构数组boya和boyb以及两个结构指针变量pp和qq。pp指向boya,qq指向boyb。程序第16行以读写方式打开二进制文件“stu_list”,输入二个学生数据之后,写入该文件中,然后把文件内部位置指针移到文件首,读出两块学生数据后,在屏幕上显示。 格式化读写函数fscanf和fprintf

fscanf函数,fprintf函数与前面使用的scanf和printf 函数的功能相似,都是格式化读写函数。两者的区别在于fscanf函数和fprintf函数的读写对象不是键盘和显示器,而是磁盘文件。 这两个函数的调用格式为:

fscanf(文件指针,格式字符串,输入表列); fprintf(文件指针,格式字符串,输出表列); 例如:

fscanf(fp,\"%d%s\fprintf(fp,\"%d%c\文件的随机读写

前面介绍的对文件的读写方式都是顺序读写,即读写文件只能从头开始,顺序读写各个数据。 但在

实际问题中常要求只读写文件中某一指定的部分。为了解决这个问题可移动文件内部的位置指针到需要读写的位置,再进行读写,这种读写称为随机读写。

实现随机读写的关键是要按要求移动位置指针,这称为文件的定位。 文件定位

移动文件内部位置指针的函数主要有两个,即 rewind 函数和fseek函数。 rewind函数前面已多次使用过,其调用形式为: rewind(文件指针);

它的功能是把文件内部的位置指针移到文件首。 下面主要介绍fseek函数。

fseek函数用来移动文件内部位置指针,其调用形式为: fseek(文件指针,位移量,起始点); 其中:

“文件指针”指向被移动的文件。 “位移量”表示移动的字节数,要求位移量是long型数据,以便在文件长度大于KB 时不会出错。当用常量表示位移量时,要求加后缀“L”。

“起始点”表示从何处开始计算位移量,规定的起始点有三种:文件首,当前位置和文件尾。 其表示方法如下表。 起始点 文件首 当前位置 文件末尾 表示符号 SEEK_SET SEEK_CUR SEEK_END 数字表示 0 1 2 例如:

fseek(fp,100L,0);

其意义是把位置指针移到离文件首100个字节处。 还要说明的是fseek函数一般用于二进制文件。在文本文件中由于要进行转换,故往往计算的位置会出现错误。 文件的随机读写

在移动位置指针之后,即可用前面介绍的任一种读写函数进行读写。由于一般是读写一个数据据块,因此常用fread和fwrite函数。

下面用例题来说明文件的随机读写。 【例】(综合实验将会用到)在学生文件stu_list中读出第二个学生的数据。 #include struct stu

{ char name[10]; int num; int age;

char addr[15]; }boy,*qq; main() {

FILE *fp; char ch; int i=1; qq=&boy;

if((fp=fopen(\"stu_list\

{ printf(\"Cannot open file strike any key exit!\"); getch(); exit(1); }

rewind(fp);

fseek(fp,i*sizeof(struct stu),0); fread(qq,sizeof(struct stu),1,fp);

printf(\"\\n\\nname\number age addr\\n\");

printf(\"%s\%5d %7d %s\\n\ qq->addr); }

文件stu_list已由例6的程序建立,本程序用随机读出的方法读出第二个学生的数据。程序中定义boy为stu类型变量,qq为指向boy的指针。以读二进制文件方式打开文件,程序第22行移动文件位置指针。其中的i值为1,表示从文件头开始,移动一个stu类型的长度,然后再读出的数据即为第二个学生的数据。 文件检测函数

C语言中常用的文件检测函数有以下几个。 文件结束检测函数feof函数 调用格式: feof(文件指针);

功能:判断文件是否处于文件结束位置,如文件结束,则返回值为1,否则为0。 读写文件出错检测函数 ferror函数调用格式: ferror(文件指针);

功能:检查文件在用各种输入输出函数进行读写时是否出错。如ferror返回值为0表示未出错,否则表示有错。

文件出错标志和文件结束标志置0函数 clearerr函数调用格式: clearerr(文件指针);

功能:本函数用于清除出错标志和文件结束标志,使它们为0值。

3学生容易出错的地方 (8分钟)

文件操作完毕不关文件

文件打开时没有赋值给一个文件指针 打开文件后没有使用文件指针 对不存在的文件进行读操作 操作方式不熟悉

4问题与讨论 (5分钟)

什么是缓冲文件系统,有什么优点

二进制文件和文本文件各有什么优缺点? 怎样检测二进制文件的结束?

5 小结(可由问题与讨论方式给出) (5分钟)

文件操作三步曲:

1打开文件fopen();2读\ 写操作;3关闭文件fclose(); 文件打开三步曲

1打开那个文件;2准备进行什么操作;3用哪一个文件指针; 熟悉文件操作函数,成对出现的

6 课后任务 (2分钟)

完成文本文件拷贝的程序

优化文本文件拷的程序,对文件打开、读写等操作进行返回值检测 将课上的操作全部用函数实现,完成实训项目单的前三项 课后习题:习题1、3(教材P257)

实验一 简单程序设计(一)

日期 周次 2 星期 3 学时 2

一【实验目的】

(1)了解使用VC++6.0的开发环境;

(2)掌握在该系统上如何编辑、编译、连接和运行一个C程序; (3)通过运行简单的C程序,初步了解C源程序的特点;

二【实验内容】

【实验1—1】编写一个程序,在屏幕上显示“I am a student.” 1)输入下面的程序 include void main( ) {

printf(\" I am a student\\n \"); }

2).仔细观察屏幕的输入程序,检查有无错误。

3).对该程序进行编译,查看编译输出窗口,检查是否有错误,有错误需要改正错误。无错误就可以运行程序。

【实验1—2】已知矩形的边长为3.2和1.5,求矩形的面积。

【实验1—3】求4和6的和,并在显示器输出结果:“4+6=10”。然后修改程序从键盘上任意输入2个整数,并将二者的和输出。

【实验1—4选做题】编写一个程序,其功能是:将两个两位数的正整数a、b合并形成一个整数放在c中。合并的方式是:将a数的十位和个位数依次放在c数的千位和十位上, b数的十位和个位数依次放在c数的百位和个位上。例如,当a=45,b=12时,执行程序后,c=4152。

实验一 简单程序设计(二)

周次 3 星期 3 学时 2

一【实验目的】

(1)掌握C语言数据类型及其定义,以及对变量赋值的方法; (2)学会使用C语言的有关运算符号以及相应的表达式的使用;

(3)掌握各种类型数据的输入输出方法,能正确使用各种格式转换符; (4)进一步熟悉C程序的编辑、连接和运行的过程;

二【实验内容】

【实验2—1】请编写程序,完成功能:已知x的值为118,要求x的值输出显示一行按照十进制、八进制、十六进制输出,另一行按照十进制、八进制(带有0)、十六进制输出(带有0x)。 【实验2—2】编程序,从屏幕输入圆柱体的底面圆的半径r和高h,求圆柱体的表面积和体积,并在屏幕上输出(输出时要求有必要的文字说明)。 【实验2—3】分别用getchar()和putchar()函数,实现“ab“三个字符从键盘输入,并且按照字符和ASCII值各输出显示一次;以及用scanf函数实现将10a20b30c输入,并用printf函数实现输出x=10,y=20,z=30,c1=’a’,c2=’b’,c3=’c’。

【实验2—4】任意输入四位学生的成绩并求平均,要求保留2位小数位。

【实验2—5选做题】编写一个程序,其功能是:使实型数保留2位小数,并对第三位进行四舍五入 (规定实型数为正数)。例如:实型数为 1234.567, 则输出 1234.57; 实型数为 1234.5, 则输出 1234.56。

实验二 控制结构程序设计(一)

周次 4 星期 3 学时 2

一【实验目的】

(1)掌握C语言数据类型及其定义,以及对变量赋值的方法; (2)学会使用C语言的有关运算符号以及相应的表达式的使用;

(3)掌握各种类型数据的输入输出方法,能正确使用各种格式转换符; (4)进一步熟悉C程序的编辑、连接和运行的过程;

二【实验内容】

【实验2—1】请编写程序,完成功能:已知x的值为118,要求x的值输出显示一行按照十进制、八进制、十六进制输出,另一行按照十进制、八进制(带有0)、十六进制输出(带有0x)。 【实验2—2】编程序,从屏幕输入圆柱体的底面圆的半径r和高h,求圆柱体的表面积和体积,并在屏幕上输出(输出时要求有必要的文字说明)。 【实验2—3】分别用getchar()和putchar()函数,实现“ab“三个字符从键盘输入,并且按照字符和ASCII值各输出显示一次;以及用scanf函数实现将10a20b30c输入,并用printf函数实现输出x=10,y=20,z=30,c1=’a’,c2=’b’,c3=’c’。

【实验2—4】任意输入四位学生的成绩并求平均,要求保留2位小数位。

【实验2—5选做题】编写一个程序,其功能是:使实型数保留2位小数,并对第三位进行四舍五入 (规定实型数为正数)。例如:实型数为 1234.567, 则输出 1234.57; 实型数为 1234.5, 则输出 1234.56。

实验二 控制结构程序设计(二)

周次 5 星期 3 学时 2

一【实验目的】

(1)学会正确使用逻辑运算符和逻辑表达式、关系运算符和关系表达式; (2)熟练掌握if语句和switch语句; (3)结合程序掌握一些简单的算法。

二【实验内容】

【实验3-1】从键盘输入三个数,找出最大数并输出。 【实验3-2】从键盘任意输入成绩在0~100的分数,要求用if语句和switch语句实现五级制的评定,评定条件如右图,并要求:

① 输入一个负分数以及超过100分以上,不应该得到成绩,

需要给出错误提示;

② 程序运行时,需要必要的提示语句。 【实验3-3】编写计算器程序,要求如下:

① 从屏幕获取两个变量的值和一个算术运算符(+、-、*、/、%),对这两个变量进行相应的算术运算,输出计算结果,对于其他运算符给出错误信息。

② 用switch语句实现

【实验3-4】从键盘输入一个年份,判断该年是否是闰年,要求有必要的提示语句。 闰年的条件: 能被4整除但不能被100整除,或者能被400整除

【实验3—5选做题】请编写一个多分支程序,w 是一个的无符号整数(10≤w<70000),若 w 是 n (n ≥ 2)位的整数,函数求出w的低 n-1位的数作为函数值返回。

例如:w 值为 5923,则函数返回 923; w 值为 923 则函数返回 23。(上机真题第16套)

实验三 函数程序设计(一)

周次 7 星期 3 学时 2

一【实验目的】

(1)了解当型循环和直到型循环的执行机理。

(2)熟练掌握三种循环语句:while、do-while和for的使用。 (3)掌握break和continue语句在循环中的控制作用。 (4)掌握利用循环语句求解一些常用算法的方法。

二【实验内容】

【实验4-1】鸡兔共笼有30个头,90只脚,求鸡兔各有多少?。

【实验4-2】编写一程序,显示所有的水仙花数。所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数字本身。例如: 153=13+53+33 。

【实验4-3】编写程序,它的功能是:求100到200之间的所有素数,并统计素数个数。 【实验4-4】请编写程序实现:计算3到100之间所有素数的平方根之和,并输出。s=148.874270。 【实验4-5】编写程序实现:求出能整除x(如x=35)且不是偶数的各整数,并按照由小到大的顺序输出,并统计个数。

【实验4-6选作】编写程序,它的功能是: 计算sln(1)ln(2)ln(3)ln(m)。在C语言中可以调用log(n)函数求ln(n)。log函数的引用说明是:double log(double x) 。例如,若m的值为20,则s值为6.506583。

实验三 函数程序设计(二)

周次 8 星期 3 学时 2

一【实验目的】

(1)掌握定义函数的方法;

(2)掌握函数实参与形参的对应关系以及“值传递”的方式; (3)掌握函数的嵌套调用和递归调用的方法;

(4)掌握动态变量、静态局部变量与全局变量之间的概念和使用方法;

二【实验内容】

【实验5-1】从键盘输入6个同学计算机课程期末考试成绩,函数功能:要求实现统计出平均分,实现正确输出。

【实验5-2】main函数给出10个学生的计算机课程的成绩,函数功能:要求按照从大到小的顺序排序,分别显示排序前和排序后的结果。

【实验5-3】请编写程序,用函数实现功能:使数组左下三角元素中的值乘以n 。例如:若n的值为3,a数组中的值为1249357397则返回主程序后a数组中的值为 86981215186【实验5-4】请编写程序,用函数实现功能:把s所指字符串中的内容逆置。例如:字符串中原有的

字符串为:abcdefg,则执行后, 串s中的内容为:gfedcba。

【实验5-5】请编写程序,用函数实现:将s所指字符串中下标为偶数的字符删除,串中剩余字符形成的新串放在t所指数组中。例如,当s所指字符串中的内容为:\"ABCDEFGHIJK\",在t所指数组中的内容应是:\"BDFHJ\"。

实验四 数组程序设计(一)

周次9 星期 3 学时2

一【实验目的】

(1)掌握一维数组、二维数组的概念及元素的各种表示方法 (2)正确掌握数组输入输出等的基本操作。 (3)掌握数组中的一些常用算法。

二【实验内容】

【实验6-1】从键盘输入6个同学计算机课程期末考试成绩,并统计出平均分、最高分、最低分,以及统计超过平均分的人数,并实现正确输出。

【实验6-2】随机产生10个学生的计算机课程的成绩(30~100),按照从大到小的顺序排序,分别显示排序前和排序后的结果。提示:#include ,包含实用工具函数后,可以使用随机函数产生成绩如:for(i=0;i<45;i++) score[i]=rand( )%71+30;

【实验6-3】请编写程序实现功能:使数组左下三角元素中的值乘以n 。例如:若n的值为3,a数组中的值为1249357397则返回主程序后a数组中的值为 86981215186

实验四 数组程序设计(二)

周次10 星期 3 学时2

一【实验目的】

(1)掌握数组和指针的关系和有关操作 (2)掌握数组掌握字符串的处理方法 (3)掌握数组中的一些常用算法。

二【实验内容】

【实验7-1】请编写程序实现功能:把s所指字符串中的内容逆置。例如:字符串中原有的字符串为:abcdefg,则执行后, 串s中的内容为:gfedcba。

【实验7-2】请编写程序实现,将s所指字符串中下标为偶数的字符删除,串中剩余字符形成的新串放在t所指数组中。例如,当s所指字符串中的内容为:\"ABCDEFGHIJK\",在t所指数组中的内容应是:\"BDFHJ\"。

【实验7-3】请编写程序实现学生信息管理功能,要求从键盘输入学生姓名、年龄、学号等信息,然后通过姓名进行排序,输出排序后的学生信息。

实验五 指针程序设计(一)

周次 11 星期 3 学时 2

一【实验目的】

(1)掌握指针的概念,会定义和使用指针;

(2)能正确使用数组的指针和指向数组的指针变量;

(3)能正确使用指向字符串的指针和指向字符串的指针变量; (4)能正确使用函数的指针变量;

二【实验内容】

【实验7-1】编写函数用指针实现两个数的交换。

【实验7-2】用指针以及函数实现字符串的倒序输出。

【实验7-3】假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:删除字符串中所有的*号。在编写函数时,不得使用C语言提供的字符串函数。例如,字符串中的内容为:****A*BC*DEF*G*******,删除后,字符串中的内容应当是:ABCDEFG。 #include void fun( ) { }

main()

{ char s[81];

printf(\"Enter a string:\\n\");gets(s); fun( s );

printf(\"The string after deleted:\\n\"); puts(s); }

【实验7-4】请编写一个函数fun, 其功能是: 将ss所指字符串中所有下标为奇数位置上的字母转换为大写(若该位置上不是字母, 则不转换)。 例如, 若输入\"abc4EFg\",则应输出\"aBc4EFg\"。 #include #include void fun( ) { }

void main( ) { char tt[51];

printf( \"\\nPlease enter an character string within 50 characters:\\n\" );

gets( tt );

printf( \"\\n\\nAfter changing, the string\\n \\\"%s\\\"\ fun(tt) ;

printf( \"\\nbecomes\\n \\\"%s\\\"\ }

实验五 结构体程序设计

日期 周次 12 星期 学时 2

一【实验目的】

(1)掌握结构体类型的概念、定义和使用;

(2)掌握结构体数组、结构体指针的定义和使用; (3)理解共同体的概念和使用;

二【实验内容】

【实验8-1】请把程序补充完整。定义一个结构体变量date(包括年、月、日)。输入一个日期,计算该日在本年中是第几天?注意闰年问题。 #include

/*定义一个date结构体*/

补充代码1

int leap_year(int a);//声明判断闰年函数

int cal_day(struct date a);//声明计算该日在全年中的天数函数

/*判断闰年*/ int leap_year(int a) {

if(a%400==0||(a%4==0&&a%100!=0)) return 1; else return 0; }

/*计算一年中的第几天*/ int cal_day(struct date a) {

int sum=0,b[]={31,28,31,30,31,30,31,31,30,31,30,31} ; for(int i=0;iif(a.month>2) sum=sum+a.day+leap_year( 补充代码 else sum=sum+a.day; return sum; }

void main() {

struct date a; int n;

2 );

printf(\"\\n请输入日期(年 月 日)\\n\"); scanf(\"%d%d%d\ 补充代码3 );

n=cal_day(a);

printf(\"%d年%d月%d日在本年中是第%d天\\n\}

【实验8-2】已知学生的记录由学号和学习成绩构成,N名学生的数据已存入a结构体数组中。请编写函数 fun,函数的功能是:找出成绩最低的学生记录,通过形参返回主函数(规定只有一个最低分)。

#include #include #define N 10 typedef struct ss { char num[10]; int s; } STU;

void fun( STU a[], STU *s ) { }

main ( )

{ STU a[N]={ {\"A01\

{\"A06\ ; int i;

printf(\"***** The original data *****\\n\");

for ( i=0; i< N; i++ )printf(\"No = %s Mark = %d\\n\ fun ( a, &m );

printf (\"***** THE RESULT *****\\n\");

printf (\"The lowest : %s , %d\\n\}

【实验8-3】某学生的记录由学号、8门课程成绩和平均分组成,学号和8门课程的成绩已在主函数中给出。请编写函数fun,它的功能是:求出该学生的平均分放在记录的ave成员中。

例如学生的成绩是:85.5,76,69.5,85,91,72,.5,87.5,他的平均分应当是:78.875。 #include #define N 8 typedef struct { char num[10]; double s[N]; double ave; } STREC;

void fun(STREC *a)

{ }

main()

{ STREC s={\"GA005\ int i; fun( &s );

printf(\"The %s's student data:\\n\ for(i=0;iprintf(\"%4.1f\\n\ printf(\"\\nave=%7.3f\\n\}

实验六 综合练习

周次 13~15 星期 3 学时 6

一【实验目的】

以C语言程序设计语言为基础,完成具有一定难度的综合程序设计。通过编写、调试、运行程序,进一步掌握C语言程序设计的基本方法和编程技巧,巩固所学知识,提高分析问题和解决问题的能力。

二【实验内容】

某班有最多不超过30人(具体人数由键盘输入)参加期末考试,最多不超过6门(具体门数由键盘输入)。定义结构体类型描述学生信息,每个学生信息包括:学号、姓名、多门课的成绩、总成绩和平均成绩。用结构体数组作为函数参数,编程实现如下菜单驱动的学生成绩管理系统。 (1) 录入每个学生的学号、姓名和各科考试成绩。 (2) 计算每门课程的总分和平均分。 (3) 计算每个学生的总分和平均分。

(4) 按每个学生的总分由高到低排出名次表。 (5) 按学号由小到大排出成绩表。 (6) 按姓名的字典顺序排出成绩表。 (7) 按学号查询学生排名极其考试成绩。 (8) 按姓名查询学生排名极其考试成绩。 (9) 按优秀(90~100)、良好(80~90)、中等(70~80)、及格(60~70)、不及格(0~59)5个类

别,对每门课程分别统计每个类别的人数以及所占的百分比。

(10) 输出每个学生的学号、姓名、各科考试成绩以及每门课程的总分和平均分。

要求程序运行后先显示如下菜单,并提示用户输入选项: 1. Input record

2. Caculate total and average score of every course 3. Caculate total and average score of every student

4. Sort in descending order by total score of every student 5. Sort in ascending order by number 6. Sort in dictionary order by name 7. Search by number 8. Search by name

9. Statistic analysis for every course 10. List record 0. Exit

Please input your choice:

三【题目分析】

该题主要考查数组、指针、结构体、函数调用相关操作,以及C语言算法的掌握,所以完成该题要求具有较强的程序设计能力,如何调试程序也非常关键,通过这个程序可以学到以前调试短程序没

有的经验。系统中的每一功能几乎都对应一个子程序。

四【实验结果】

五【实验总结】

本次实验/上机获得的知识或认识总结

本次实验/上机过程中遇到的问题分析与解决办法 本次实验/上机的心得体会及改进意见等

授课总结

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- axer.cn 版权所有 湘ICP备2023022495号-12

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务