教 案
课程名称 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 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 使用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语句求n1。 用传统流程图和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语句求n1。 用传统流程图和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; …… } 程序举例 【例】用1111...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 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 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函数和系统调用函数外,我们用户还可以定义自己所需要的函数; 引例:计算多边形面积,可将多边形分解成若干个三角形 areac(cx)(cy)(cz)计算三角形面积的公式如下: 遇到的困难:按照我们以前的设计方法,需要编写三次计算三角形面积的代码。如果多边形能分出来的三角形更多,则编写代码的工作量越大! 解决的方法:能否仿照系统函数,把计算三角形面积的代码编写成一个函数,需要计算一个三角形面积的时候只需要调用该函数的就可以了,其思路如图1所示: main() c1(xyz)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];
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- axer.cn 版权所有 湘ICP备2023022495号-12
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务