第一篇:C语言程序设计教案
C语言程序设计教案
课程名称:C语言程序设计
总 学 时:51(其中讲课学时:36,上机学时:15)课程类型:必修课程 专业:06气候
教 材:《C程序设计》(第三版),谭浩强,清华大学出版社,2005.教学参考书:
1.C语言程序设计教程,谭浩强,高等教育出版社 2.C高级实用程序设计,王士元,清华大学出版社
教学目的和要求:
本课程作为非计算机专业的基础课,旨在使学生通过本课程的学习不仅要掌握C语言的基础知识,而且更重要的是掌握进行程序设计的基本方法,提高学生编程的能力。具体要求如下:
1.熟悉并理解程序设计的基本概念和基本方法。理解程序设计的基本思想和思维方法,了解 C程序的基本结构,各种语法成分的作用、语法结构及运用方式。
2. 培养运用C语言基本知识编写简单的程序,解决问题的基本能力。
3. 综合运用多个知识点的内容进行简单的应用程序开发,考察综合解决问题的能力。
总第一讲
第一章 C语言概述(2学时,共一讲)
本讲教学目的:
1.了解C语言程序特点和产生的历史背景。
2.熟悉C语言程序的结构、编译环境和上机调试的过程。
内容纲要:
1. C语言出现的历史背景 2. C语言的特点 3. C语言程序介绍
4. C语言的上机步骤
本讲教学重点与难点:
1.C语言的特点与格式
2. C语言的上机调试的步骤
教学方法、实施步骤及时间分配:
采用多媒体进行教学,具体教学步骤安排如下:
1.引入新课————————————————————————————5’
自我介绍、课程安排与要求。
2.新课教学———————————————————————————90’
介绍C语言发展的历史
介绍C语言的特点 介绍简单C语言程序的结构
介绍C语言上机调试的步骤
3.总结、布置作业及预习内容————————————————————5’
总第二讲
第二章 程序的灵魂——算法(2学时,共一讲)
本讲教学目的:
1.掌握算法的内涵、特性与表示方法。
2.熟悉结构化程序设计方法。
内容纲要:
1.算法的概念 2.算法的特性 3.算法的表示
4.结构化程序设计方法
本讲教学重点与难点:
1.算法的内涵 2.结构化程序设计方法
教学方法、实施步骤及时间分配:
采用多媒体进行教学,具体教学步骤安排如下:
1.回顾上一节课主要内容,引入新课—————————————————5’ 2.新课教学———————————————————————————90’ 3.总结、布置作业及预习内容—————————————————————5’
总第三讲
第三章 数据的类型、运算符与表达式(4学时,共二讲)
第一讲
本讲教学目的:
1.使学生了解数据类型的概念
2. 使学生掌握整型数据,实型数据,字符型数据的数据存储形式和定义、使用方法
内容纲要:
1.C的数据类型
数据类型的概念、C语言中数据类型的分类。2.常量和变量
各种表示形式的整数、实数、字符和字符(串)常量,符号常量的定义和使用。
变量的定义和初始化。
本讲教学重点与难点:
1.C语言的数据类型
2.不同数据类型的使用范围 3.数据的隐式转换问题
教学方法、实施步骤及时间分配:
由于本节内容语法点比较多,所以在教学中结合多个小程序,在练习中掌握各知识点。采用多媒体进行教学,具体教学步骤和时间分配安排如下:
1.回顾上一节课主要内容,引入新课—————————————————5’ 2.新课教学———————————————————————————90’ 3.总结、布置作业及预习内容————————————————————5’
总第四讲
第三章 数据的类型、运算符与表达式
第二讲
本讲教学目的:
1.使学生掌握算术运算符与表达式的使用,赋值、逗号运算符和表达式的使用
2.使学生掌握各类数据类型间的混合运算的规则 3.使学生了解几种位运算符的运算规则
内容纲要:
1.运算符与表达式
运算符的优先级和结合性,表达式的运算规则,包括:算术运算符和算术表达式,赋值运算符和赋值表达式,逗号运算符和逗号表达式,不同类型的数据在计算和赋值时的类型转换规则。
2.位运算
按位与、按位或、按位异或、取反、左移、右移,位运算赋值,不同长度的数据进行位运算的原则。
本讲教学重点与难点:
1.C语言中的运算符和表达式 2.位运算
3.赋值运算符和赋值表达式 教学方法、实施步骤及时间分配:
由于本节内容语法点比较多,所以在教学中结合多个小程序,在练习中掌握各知识点。
采用多媒体进行教学,具体教学步骤和时间分配安排如下:
1.回顾上一节课主要内容,引入新课—————————————————5’ 2.新课教学—————————————————————————-——90’
(1)运算符与表达式(2)位运算
3.总结、布置作业及预习内容———————————————————5’
总第五讲
第四章 顺序程序设计(2学时,共一讲)
本讲教学目的:
1.使学生掌握程序的三种基本结构; 2.使学生掌握格式控制符的含义和作用;
3.使学生会运用赋值语句、输出、输入函数编制简单的程序。
内容纲要:
1.三种基本的程序结构
顺序结构的特点,选择结构的特点,循环结构的特点。2.C语句概述 C语言的语句分类。3.赋值语句
4.字符数据的输入输出 5.格式输入输出
格式输入/输出函数的调用方法和功能,格式控制符的含义和作用。6.顺序结构程序设计举例
本讲教学重点与难点:
1.顺序结构的程序流程
2.格式化输入输出在实际编程中的正确应用
教学方法、实施步骤及时间分配: 通过程序设计操练,熟悉编程基础。通过程序扩展,进行对比学习。采用多媒体进行教学,具体教学步骤和时间分配安排如下:
1.回顾上一节课主要内容,引入新课—————————————————5’ 2.新课教学———————————————————————————90’ 3.总结、布置作业及预习内容 ———————————————————5’
总第六讲
第五章 选择结构程序设计(2学时,共一讲)
本讲教学目的:
1.使学生掌握关系运算符的优先级顺序、关系表达式的值的计算; 2.使学生掌握逻辑运算符的优先级顺序、逻辑表达式的值的计算; 3.使学生掌握条件运算符的使用方法;掌握利用if语句和switch语句进行选择结构程序设计的基本方法。
内容纲要:
1.关系运算符和关系表达式
关系运算符及其优先级,关系表达式的构成和运算规则。2.逻辑运算符和逻辑表达式
逻辑运算符及其优先级,逻辑表达式的构成和运算规则。3.if 语句
if语句的三种形式,if语句的嵌套,条件运算符和条件表达式。4.switch语句
用switch语句实现多分支选择结构。5.选择结构程序举例
本讲教学重点与难点:
1.关系运算符和关系表达式
2.在程序中正确使用if语句构成条件判断 3.条件语句的嵌套
教学方法、实施步骤及时间分配:
从简单的问题着手,先要求学生自己编写简单程序。引入条件语句,同时在程序中讲解相关的语法知识点,提升高度。
采用多媒体进行教学,具体教学步骤和时间分配安排如下:
1.回顾上一节课主要内容,引入新课—————————————————5’ 2.新课教学———————————————————————————90’ 3.总结、布置作业及预习内容—————————————————————5’
总第七讲
第六章 循环控制(3学时,共1.5讲)
本讲教学目的:
1.使学生掌握while语句,do-while语句,for语句的特点和循环结构程序设计的基本方法;
2.使学生熟悉循环的嵌套使用。
内容纲要:
1.while 语句
使用while 语句实现当型循环的程序设计方法。2.do-while语句
使用do-while语句实现直到型循环的程序设计方法。3.for语句
使用for语句实现次数型循环结构的程序设计。4.循环嵌套
本讲教学重点与难点:
1.for 语句在循环结构中的应用
2.While、do while语句在循环结构中的应用 3.多层循环嵌套
教学方法、实施步骤及时间分配:
从简单的问题着手,先要求学生自己编写简单程序。引入循环语句,同时在程序中讲解相关的语法知识点,提升高度。
采用多媒体进行教学,具体教学步骤和时间分配安排如下:
1.回顾上一节课主要内容,引入新课—————————————————5’ 2.新课教学———————————————————————————90’ 3.总结、布置作业及预习内容—————————————————————5’
第七章 数组(4学时,共二讲)
总第八讲
第六章 循环控制(1学时)、第七章 数组(1学时)
本讲教学目的:
1.掌握break语句和continue语句用法; 2.使学生掌握循环编程的方法;
内容纲要:
1.break语句和continue语句
break和continue语句功能和使用方法。2.循环结构程序举例 3.一维数组的定义和引用
一维数组的定义和初始化,,一维数组元素的引用,一维数组的程序举例。
本讲教学重点与难点:
1.break语句和continue语句 2.循环结构程序编程方法 3.一维数组的定义和引用
教学方法、实施步骤及时间分配:
从简单的问题着手,先要求学生自己编写简单程序。引入循环语句,同时在程序中讲解相关的语法知识点,提升高度。
采用多媒体进行教学,具体教学步骤和时间分配安排如下:
1.回顾上一节课主要内容,引入新课—————————————————5’ 2.新课教学———————————————————————————90’ 3.总结、布置作业及预习内容—————————————————————5’
第七章 数组(4学时,共二讲)
总第九讲
第七章 数组(2学时)
本讲教学目的:
1.使学生掌握一维数组、二维数组的定义和引用 2.使学生掌握一维数组、二维数组的初始化 3.使学生掌握字符数组的定义,引用和初始化 4.使学生熟悉字符数组的输入输出
内容纲要:
二维数组的定义和引用:
1. 二维数组的定义和初始化; 2.二维数组元素的引用; 3.二维数组的程序举例。
本讲教学重点与难点:
1.数组的排序; 2.二维数组概念的理解 3.“冒泡法”排序
教学方法、实施步骤及时间分配:
采用实例引入和编程半成品法。通过一个简单的实例引入数组的应用,示范数组的定义、输入操作之后,引导学生自己作出输出解,从中讲解有关数组的知识点,培养学生的编程能力。
采用多媒体进行教学,具体教学步骤和时间分配安排如下:
1.回顾上一节课主要内容,引入新课—————————————————5’ 2.新课教学———————————————————————————90’ 3.总结、布置作业及预习内容—————————————————————5’
第八章 函数(4学时,共二讲)
总第十讲
第七章 数组(1学时)、第八章 函数(1学时)
本讲教学目的:
1.使学生掌握掌握字符处理函数puts, gets, strcat, strcpy, strcmp, strlen 的使用;
2.使学生了解函数strlwr,strupr的功能; 3.使学生了解函数的概念和分类;
4.使学生掌握函数定义的形式,函数的形参和实参的概念,函数的返回值和函数的调用。
内容纲要:
1.字符数组的定义和初始化,字符数组元素的引用,字符串和字符串结束标志,字符数组的输入输出,字符串处理函数,字符数组应用举例; 2.函数的定义方法; 3.函数参数和函数的值
形式参数与实在参数,函数的返回值。4.函数调用——函数的一般调用方式; 5.函数的嵌套调用;
本讲教学重点与难点:
1.字符数组的运算; 2.函数的定义与调用; 3.形参与实参的意义与作用
教学方法、实施步骤及时间分配:
采用实例引入和编程半成品法。通过一个简单的实例引入数组的应用,示范数组的定义、输入操作之后,引导学生自己作出输出解,从中讲解有关数组的知识点,培养学生的编程能力。
通过程序的改造,将程序中的功能模块独立出来而引入函数的介绍。采用多媒体进行教学,具体教学步骤和时间分配安排如下:
1.回顾上一节课主要内容,引入新课—————————————————5’ 2.新课教学———————————————————————————90’ 3.总结、布置作业及预习内容—————————————————————5’
第八章 函数(4学时,共二讲)
总第十一讲 第八章 函数(2学时)
本讲教学目的:
1.使学生掌握函数的调用方法; 2.使学生熟悉函数的嵌套调用; 3.使学生掌握简单的函数递归调用; 4.使学生熟悉数组作为函数参数;
5.使学生掌握局部变量和全局变量的作用范围。
内容纲要:
1.函数的递归调用;
2.函数调用时数据传递方法;
函数调用时的值传递,函数调用时的地址传递,函数调用时的返回值传递方式。
3.局部变量和全局变量。4.变量的存储类别
变量的存储类别(自动、静态、寄存器、外部),局部变量和全局变量的作用域和生存期。
本讲教学重点与难点:
1.函数的定义与调用; 2.形参与实参的意义与作用; 3.参数的两种传递方式。
教学方法、实施步骤及时间分配:
采用多媒体进行教学,具体教学步骤和时间分配安排如下:
1.回顾上一节课主要内容,引入新课—————————————————5’ 2.新课教学———————————————————————————90’ 3.总结、布置作业及预习内容—————————————————————5’
第九章 预处理命令(1学时)
总第十二讲
第八章 函数(1学时)、第九章 预处理命令(1学时)
本讲教学目的:
1.使学生了解内部函数和外部函数的定义和作用范围; 2.使学生熟悉带参数的宏定义,和不带参数的宏定义; 3.使学生了解“文件包含”处理; 4.使学生了解条件编译。
内容纲要:
1.内部函数和外部函数
2.如何运行一个多文件的程序 3.宏定义;
4.“文件包含”处理; 5.条件编译。
本讲教学重点与难点: 1. 内部函数和外部函数;
2.条件编译。
教学方法、实施步骤及时间分配:
采用多媒体进行教学,具体教学步骤和时间分配安排如下: 1.回顾上一节课主要内容,引入新课—————————————————5’ 2.新课教学———————————————————————————90’ 3.总结、布置作业及预习内容—————————————————————5’
第十章 指针(4学时,共二讲)
总第十三讲
本讲教学目的:
1.使学生了解地址和指针的概念;
2.使学生掌握指针变量的定义,引用,指针变量作为函数参数的使用; 3.使学生掌握指向数组元素的指针的含义,通过指针引用数组元素的方法; 4.使学生掌握数组名,指针作为函数参数的使用方法; 5.使学生掌握多维数组中指针的移动规则;
6.使学生掌握字符串不同的表示方式,字符串指针和字符数组作函数参数的比较。
内容纲要:
1.地址、指针和指针变量的概念
指针与地址,指针变量的概念与作用。2.变量的指针和指向变量的指针变量;
3.指向变量的指针变量的定义、初始化、赋值、引用方法,指针变量作为函数的参数;
4.数组的指针和指向数组的指针变量
指向数组的指针变量的定义、初始化、赋值、引用方法;指向多维数组的指针变量的定义、初始化、赋值、引用方法。5.字符串的指针和指向字符串的指针变量 6.指针数组
指针数组的定义、初始化和引用;main函数的参数。
本讲教学重点与难点:
1. 指针变量以及指向数组的指针变量的应用; 2.指针引用数组时指针的定位;
教学方法、实施步骤及时间分配: 结合实例进行教学
采用多媒体进行教学,具体教学步骤和时间分配安排如下:
1.回顾上一节课主要内容,引入新课—————————————————5’ 2.新课教学———————————————————————————90’ 3.总结、布置作业及预习内容—————————————————————5’
第十章 指针(4学时,共二讲)
总第十四讲
本讲教学目的:
1.使学生熟悉指向函数的指针; 2.使学生掌握返回指针值的函数; 3.使学生熟悉指向数组和指向指针的指针。
内容纲要:
1.指向指针的指针变量; 2.返回指针值的函数; 3.指针变量作函数参数;
4.函数的指针和指向函数的指针变量。
本讲教学重点与难点:
1.函数的指针和指向函数的指针变量的区别;
2.指针变量作函数参数和普通变量作函数参数的异同。
教学方法、实施步骤及时间分配: 结合实例进行教学
采用多媒体进行教学,具体教学步骤和时间分配安排如下:
1.回顾上一节课主要内容,引入新课—————————————————5’ 2.新课教学———————————————————————————90’ 3.总结、布置作业及预习内容—————————————————————5’ 第十一章 结构体与共同体(4学时,共二讲,第一讲)
总第十五讲
本讲教学目的:
(1)掌握定义结构体类型的定义方法(2)掌握结构体变量的定义和引用方法(3)掌握结构体数组的定义和初始化(4)掌握指向结构体变量的指针
(5)了解指向结构体的指针作函数的参数的使用方法
内容纲要:
(1)声明一个结构体的一般形式(2)定义结构体类型变量的方法(3)结构体变量的引用(4)结构体变量的初始化(5)结构体数组的定义和初始化(6)指向结构体类型数据的指针
本讲教学重点与难点:.结构体的概念与引用 2.指向结构体类型数据的指针
教学方法、实施步骤及时间分配: 结合实例进行教学
采用多媒体进行教学,具体教学步骤和时间分配安排如下: 1.回顾上一节课主要内容,引入新课—————————————————5’ 2.新课教学———————————————————————————90’ 3.总结、布置作业及预习内容—————————————————————5’
第十一章 结构体与共同体(4学时,共二讲,第二讲)
总第十六讲
本讲教学目的:
(1)使学生了解指向结构体的指针作函数的参数的使用方法(2)掌握链表的建立,输出,删除,插入等操作(3)了解共同体的概念,共同体类型数据的特点(4)熟悉共同体变量的引用方式(5)了解枚举类型的声明方法
内容纲要:
(1)用指针处理链表
链表的概念,处理动态链表所需的函数,链表的建立,输出,删除,插入等操作。(2)共用体的概念
共同体变量的引用方式,共同体类型数据的特点。(3)枚举类型
枚举类型的概念和定义,枚举型变量的定义和引用。
本讲教学重点与难点:.用指针处理链表
教学方法、实施步骤及时间分配: 结合实例进行教学
采用多媒体进行教学,具体教学步骤和时间分配安排如下:
1.回顾上一节课主要内容,引入新课—————————————————5’ 2.新课教学———————————————————————————90’ 3.总结、布置作业及预习内容—————————————————————5’
第十章 文件(2学时,共一讲)
总第十七讲
本讲教学目的:
1.使学生了解文件类型的指针; 2.掌握文件的打开关闭的方法; 3.掌握文件的读写和定位。
内容纲要:
1.文件概述; 2.文件类型指针; 3.文件的打开和关闭; 4.文件的读写;
5.字符的读写函数,字符串的读写函数,数据块的读写函数,格式读写函数;
6.文件的定位;
rewind函数,fseek函数和随机读写。7.文件应用举例。
本讲教学重点与难点:
1.文件概念的内涵; 2.文件的定位。
教学方法、实施步骤及时间分配: 结合实例进行教学
采用多媒体进行教学,具体教学步骤和时间分配安排如下:
1.回顾上一节课主要内容,引入新课—————————————————5’ 2.新课教学———————————————————————————90’ 3.总结、布置作业及预习内容—————————————————————5’
第二篇:C语言程序设计教案
C语言程序设计教案
C语言程序设计教案
C 语言程序设计教案 C 语言概述 【教学目的】 1)了解 C 的发展 教学目的】 2)熟悉 C 的特点 教学重点】 【教学重点】 C 语言的特点 难点)(难点)教学方法】 【教学方法】 例举法,推导法,归纳法 课时计划】 【课时计划】2 课时 【授课时间】2005-11-1 授课时间】 教学过程】 【教学过程】 导 言 程序的目的是处理数据,所以设计程序首先的知道这门语言可以处理什么样的数据 新课内容 一,C 语言的历史及其特征 二,简单 C 语言的程序实例 # include “stdio.h” main(){int a,b,sum;printf(“enter two numbers:”);scanf(“%d%d”,&a,&b);sum=a+b+6;printf(“%d”,sum);} 三,编辑,编译,连接,运行一个 C 语言程序 四,C 语言的特点 课堂练习】 【课堂练习】 1.C 语言规定,必须以()作为主函数名..A.stdio B.function C.include D.main 2.C 程序的基本构成单位是().A.子程序 B.函数 C.过程 D.函数和过程 函数和过程 【小 结】 总结:C 语言特点 课后作业】 【课后作业】7 页 2 【板书设计 板书设计】 板书设计 一,C 语言的历史及其特征 二,简单 C 语言的程序实例 # include “stdio.h” main()1 C 语言程序设计教案 {int a,b,sum;printf(“enter two numbers:”);scanf(“%d%d”,&a,&b);sum=a+b+6;printf(“%d”,sum);} 三,编辑,编译,连接,运行一个 C 语言程序 四,C 语言的特点 教学后记】 【教学后记】 学生听课认真,积极回答老师提出的问题.课堂教学效果很好,能够按时完成课堂练习题.对软件开发这个专业很有信心.2 C 语言程序设计教案 数 据 类 型 【教学目的】 1)常量.变量概念简要介绍 教学目的】 2)详细介绍,三种类型的常量.变量的使用规则,占内存大小及范围 教学重点】 【教学重点】 变量的使用 教学难点】 【教学难点】 变量占内存空间大小 授课时间】 【授课时间】2005-11-2 课时计划】 【课时计划】2 课时 【教学方法】举例法 教学方法】 方法 教学过程】 【教学过程】 导 言 程序 = 数据结构 + 算法 + 程设方法 + 语言工具 新课内容 一, 数据类型分类 1.基本类型 2.构选类型 3.指针类型 4.空类型 二, 常量,变量 1, 常量,符号常量(1)定义:其值不改变(2)分类 a.整型: 2,0,-1 b.实型: 2.2 ,-3.4 c.字符: 'a','c' 2,变量(1)定义:值可以改变(2)组成因素 int a=20;变量名:a 变量值:20(3)标识符 a.定义:标识符,变量名,函数名,数组名等;b.规则: 已字母下划线打头 c.长度:ANSIC 不限 TURBOC 限 32 个字符(4)使用:先定义后使用 三, 数据 1,整型数据 3 C 语言程序设计教案.整型常量表示方法 a.十进制 123 ,-123 b.八进制 o35,o27 c.十六进制 oxA3,ox12.整型变量 a.形式: 2 进制 a.分类: int 2b short int 2b long int 4b b.定义 int a, b unsigned int c,d;long e, f,.整型,常量类型 2, 实型数据.表示方法 123, 123.0 ,0.0.实型变量 float 4b double 8b long double 16b double 类型.类型 float a;double b;b=1234.789 a=123456.789 3,字符数据.字符常量.一般字符 例子:“b”,“c”,“1”,'!'.特殊字符常量 说明: 以 开头的 :.字符变量.定义 char c1, c2;c1='A';c2='b'.举例 输出: a,A 4 C 语言程序设计教案 97,65.字符串变量 1.定义:例 “123”“A” , 2.以字符' ' 结束标志.变量赋值 1.定义变量 同时赋值 例: int a=978;float=b=98.67;char=c='c';2.定义变量 一部分赋值 例: int a,b,c=91;3.几个变量 同时赋值 例: int a=b=c=d=97;课堂练习】 【课堂练习】 1, main(){float a, b;a=123456.789e+6;b=a+30 printf(“%f”,b)} 2, main(){ char c1, c2;c1=97;c2=65;printf(“%c,%cn”,c1,c2);printf(“%d,%c/n”,c1,c2);【课后作业】 26 页 3,9,10 课后作业】 作业 , , 【小 结】 注意特殊字符常量,符号常量,变量在内存的存储形式 【板书设计】 板书设计】 一, 数据类型分类 二, 常量,变量 1, 常量,符号常量 2, 变量 三, 数据 1,整型数据 2, 实型数据 3,字符数据 5 C 语言程序设计教案.字符串变量.变量赋值 【教学后记】 教学后记】 后记 本次课内容充实,知识点多,所讲内容,学生都能听懂,但运用不够熟练,需要多做练习, 以巩固加深.6 C 语言程序设计教案 运 算 符 与 表 达 式 【教学目的】 1.了解理解运算符 教学目的】 2.运用算术运算符及使用 授课重点】 【授课重点】 表达式的使用 授课难点】 【授课难点】 I++与++I 的区别 教学方法】 【教学方法】 举例法,分析法 授课时间】 【授课时间】 2005-11-3 课时计划】 【课时计划】 2 课时 【教学过程】 教学过程】 导 言 运算量+ 运算量 1 + 2 新课内容 一 各数值数据的混合运算 1.总则: 自动转换同类型 2.规则:.(1)float->double char,shor->int(2)可直/间转换 int->ussigned->long->double 二 算术运算符,表达式 1.运算符(1)算术(2)位 &!~ ^(3)条件 ? :(4)指针 & * 2.算术运算符,表达式(1)基本算术运算符 + — * /(2)运算符优先级 a.* /-> + b.同级,运算符结合 c.强制类型转换 形式:(类型名)(表达式)例子: main(){ float x;int y;x=8.56;7 C 语言程序设计教案 y=(int)x;printf(“x=%f,y=%d”,x,y);d.自增,自减运算 I++=>1)I, 2)I=I+1;++I=>1)I=I+1, 2)I 三,数据输入和数据输出 a)数据输出: 命令格式:printf(控制字符串,参数 1,参数 2,……)例如:main(){float x=1234.565;int y=234;char c='a';printf(“%f,%d,%c”,x,y,c);} 数据输入: 命令个是:scanf(控制字符串,参数 1,参数 2,……)例如:main(){float x int y;char c;scanf(“%f,%d,%c”,x,y,c);} 课堂练习】 【课堂练习】 分析程序的输出结果: main(){ int i=2;i+=i-=i+i;printf(“%dn”,i);} 【小 结】 数据类型必须掌握整型,浮点型,字符型,还要掌握各种运算符之间的区别与联系.课后总结】 【课后总结】 提纲 一,各种数据数据类型自动转换规则 二,算术运算符及表达式 1,自增 i++与++i 区别 , 1, 运算符优先级结合性 b)8 C 语言程序设计教案 2, 强制类型转换运算符 课后作业】 【课后作业】26 页 3 教学后记】 【教学后记】 学生听课认真,没有人开小差.能跟上老师的思路,积极思考问题.所讲内容都能听懂, 但个别容易出错的地方还有待加强.9 C 语言程序设计教案 顺序结构(数据的输入和输出)顺序结构(数据的输入和输出)【教学目的】 使学生明白现实世界程序的顺序处理 教学目的】 教学重点】 【教学重点】 理解顺序结构 教学难点】 【教学难点】 变量占内存空间大小 教学方法】 【教学方法】 讲授课 教学日期】 【教学日期】 2005-11-7 课时计划】 【课时计划】 2 课时 【教学过程】 教学过程】 导 言: 举例引出程序思想 新课内容: 一, 基本结构 1.顺序结构 A->B 2.选择结构 A->B 或 A->C 之中选择 3.循环结构 WHILE()~~ DO ~~WHILE()二, 数据输入输出语句 1.输入输出:用函数实现 2.使用库函数 “I#INCLUDE” 3.常用函数(I/0)(1)字符数据的 I/0 A.putchar(c)字符输出 putchar('')putchar('r')B.getchra()字符输入(2)格式输入/输出 A.printf(格式控制,输出列表)(1)%d 十进制 例:int I=123;printf(“%d”,I)123 printf(“%2d,%4d”,I,I)(2)%0 八进制 例:int I=-2;printf(“%d,%0”,I,I);(3)%x 十六进制 ffff(4)%u 输出无符号整型 123, 123 I=-2 I=177776 10 C 语言程序设计教案 unsigned ing a=65535(5)%c 输出一个字符 printf(“%c”,c)printf(“%d”,c);(6)%s 输出字符串 printf(“%s”,“hello”);printf(“%s”,“you are goods”)(7)%f 输出实数 float I,j printf(“%f”,11111.1111+33333.3333)(8)%e 指数输出 int I I=123.456;Printf(“%e”,I)l.234560e+002 B scanf 输入函数(1)形式:scanf(格式控制,地址列表)(2)例子: int I scanf(“%d”,&I);请你输入整性数据 44444.4444 三,C 语句 1.控制语句(1)if()~~else 条件语句(2)for()~~~循环语句(3)while()~~循环语句(4)do~while()循环语句(5)cotinue 循环语句(6)break 终止语句(7)switch 分支语句(8)goto 转向语句(9)return 返回语句 2.函数调用 printf()scanf()3.表达式语句 4.空语句;5.复合语句 {} 课堂练习】 【课堂练习】 1.输入三角形边求三角形的面积 2.从键盘输入一小写字符转化成大写字符 11 C 语言程序设计教案 【小 3.求: ax+bx+c=0 的根 结】 一,各种数据数据类型自动转换规则 二,算术运算符及表达式 1,自增 i++与++i 区别 , 3, 运算符优先级结合性 4, 强制类型转换运算符 课后作业】 【课后作业】34 页 10,11,12 , , 【教学后记】 教学后记】 上课纪律很好,所有学生都能认真听课.所讲知识都能听懂,练习能按时完成且正确率高.对于自加,自减的综合运用,还有些学生容易出错.下次课再强调一下.12 C 语言程序设计教案 语句)分 支 结 构(if switch 语句)【教学目的】 1)使学生能熟练运用简单的语句进行顺序结构程序设计 教学目的】 2)运用单分支条件语句进行判定结构程序设计 3)运用双分支条件语句进行判定结构程序设计 4)运用多分支条件语句进行判定结构程序设计 教学重点】 【教学重点】 条件语句的应用 教学难点】 【教学难点】 条件语句的熟练使用 教学方法】 【教学方法】 讲授课 【教学日期】 2005-11-8 教学日期】 时计划】 【课时计划】 4 课时 教学过程】 【教学过程】 导 言: 我们利用简单语句可以进行程序设计, 但只是简单程序设计.在设计程序时经常会遇到根 据某些情况进行选择操作,这样就得用判断语句.新课内容: 一,语句的分类 1.表达式语句 2.空语句 3.复合语句 4.函数调用语句 5.控制语句 二,if 语句 1.If 语句的一般形式 命令格式:if(条件)语句 1 [else 语句 2] 例如:#include“stdio.h” main(){int a,b,s1,s2;printf(“请输入两个整数 a,b:”);scanf(“%d,%d”,&a,&b);s1=a+b;s2=a*b;if(s1>s2)printf(“a 与 b 的和大于 a 与 b 的积”);else printf(“a 与 b 的积大于等于 a 与 b 的和”);} 2.If 语句中的复合语句 13 C 语言程序设计教案 如果两个分支中需要执行的语句不止一条,必须用“{}”括起来.例如:#include“stdio.h” main(){float a,b,u,v,s,r;printf(“请输入两个整数 a,b:”);scanf(“%d,%d”,&a,&b);if(s1>s2){r=a*a-b*b;s=a/b;} else {r=b*b-a*a;s=a/b+4;} u=(r+s)*(r+s);v=u*(r+s);printf(“u=%f,v=%f”,u,v);} 3.较复杂的条件表达式 4.If 语句的嵌套 了解 if 语句的嵌套规则 例如:输入 a, b 两个数,比较并输出结果.Main(){int a,b;printf(“please input two integer”;)scanf(“%d,%d” ,&a, &b);if(a)b)printf(“a)b”;)else if(a=0;I--)printf(“%d”,a[I]);} 例 2:从键盘输入字符,记下“a”到“z”这些小写字母出现的次数,当输入!号 时结束输入.Main(){int I,a[26];char ch;for(I=0;I<26;I++)a[I]=0;while(ch!='!')22 C 语言程序设计教案 {scanf(“%c”,&ch);if(ch>='a'&&ch<='z')a[I]=a[ch-97]+1;} for(I=0;I<26;I++)printf(“%d,a[I])} 四,二维数组的定义 类型名 数组名[常量表达式 1] [常量表达式 2] 特点:可以定义多个分量,但这些分量只能存储同一个类型的数据.五,数组分量的引用 例如:int a[3] [4]-----定义一个有 12 个分量的数组 我们可以把他们看成三个一维数组,数组名分别为 a[0] a[1] a[2]分量的引用 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][0] a[2][0] a[2][0] 六,二维数组的应用 建立一个 3*4 的矩阵,初始值来源于键盘的输入,并且输出 课堂练习】 【课堂练习】输入一个有序序列,在输入一个新数,将此数插入在此序列中.【小 结】一维数组,二维数组的定义 一维数组的分量引用,二维数组的分量的引用 一维数组和二维数组的应用 课后作业】 【课后作业】84 页 1 教学后记】 【教学后记】 一维数组的应用学生能理解,且应用得较好.二维数一开始在理解上有些困难,通过在黑 板上演示程序的执行过程,学生掌握了二维数组的内容.涉及较复杂,抽象内容最好的方法是 以直观的方式给学生展示,这样便于学生理解和掌握.23 C 语言程序设计教案 字符数组与字符串 【教学目的】 1)理解字符数组的定义.教学目的】 2)掌握数组定义的格式及数组的应用方法 3)综合运用数组.教学重点】 【教学重点】综合运用字符数组.教学难点】 【教学难点】综合运用字符数组.教学日期】 【教学日期】2005-11-22 【课程类型】 讲授课 课程类型】 课时计划】 【课时计划】 4 课时 教学过程】 【教学过程】 导 言:我们应用每一个变量都的一一定义如果想一次定已多个变量这时就的使用数组.新课内容: 一,字符数组类型的定义 char 数组名[常量表达式] 特点:可以定义多个分量,但这些分量只能存储一个字符.二,字符数组的初始化: 1,static char c[10]={'I',' ' 'a',' 'm ','h' 'a ''p' 'p ''y' };把 10 个字符分别付给 c[0]到 c[9]的 10 个元素 三,字符数组的引用 例 1:输出一个字符串 例 2:输出水晶石 四,字符串 1, 字符串和字符串结束标志 2, 用字符串常量给字符串初始化 3, 通过赋初值隐含确定数组长度 4, 字符串的输入输出 5, 字符串处理函数 四,字符数组的应用: 某单位的工作证号码的最后一位是用来表示性别的, 如 f 表示男,m 表示女,今输 入 10 个人的工作证号码,请统计出其中的男女人数 课堂练习】 【课堂练习】84 页 6,7 , 【小 结】字符数组,字符串的定义及两者之间的关系 字符数组的应用 课后作业】 【课后作业】84 页 3,8 , 教学后记】 【教学后记】 字符数组的定义和应用学生能很快理解并掌握.24 C 语言程序设计教案 指 针 【教学目的】 1)掌握指针的定义 教学目的】 2)掌握指针的引用方式 3)掌握字符指针与字符串指针之间的关系 教学重点】 【教学重点】指针的概念,指针的正确引用 教学难点】 【教学难点】指针的正确引用 课程类型】 【课程类型】 讲授课 教学日期】 【教学日期】 2005-11-24 【课时计划】 2 课时 课时计划】 教学过程】 【教学过程】 导言:指针是 c 语言中重要的数据类型,是 c 语言的精华,灵活的运用指针可以处理 各种复杂的数据结构,可以使程序简洁,紧凑,高效.一,指针的定义与引用 1,指针的概念:就是专门又来存放某种变量的地址 2,指针变量的定义:格式:类型表示符 *标识符 int i, j;int *p1,*p2;p1=&i;p2=&j;1, 指针变量的引用: 例:输入两个整数,按先大后小的的顺序输出 main(){int *p1,*p2,*p,a,b;scanf(”%d,%d“,&a,&b);p1=&a;p2=&b;if(a第三篇:《C语言程序设计》教案.
《C语言程序设计》教案
使用教材:谭浩强,《C程序设计》,清华大学出版社,2005年7月第3版
任课教师:王琪
授课班级:信息科学与技术学院06(1)
授课时间:06年秋学期
课时安排:第一学期每周5课时,其中上机每周2课时,讲授至第9章。第二学期每周4课时,其中上机每周2课时,讲授至第13章。
盐城师范学院信息科学与技术学院
第四篇:C 语言程序设计教案(清华)
第1章 C 语言概述
学习内容
1.1 C语言出现的历史背景 1.2 C语言的特点
1.3 简单的C语言程序介绍 1.4 运行C程序的步骤与方法
目的要求:
掌握C语言格式特点
熟悉C语言的编辑环境
重点难点:
C语言格式特点
TC编辑器的运行、操作
重点难点详解:
【例1.3】通过调用子函数求两个数的和。main()/* 主函数 */
{int a,b,sum;/* 定义变量 */ a=3;b=4;/* 变量赋值 */ sum=add(a,b);/* 调用add函数*/ printf(“sum=a+b=%d.n”,sum);} int add(int x,int y){int z;z=x+y;return(z);/* 将z的值返回 */ } C程序的组成规则:
1、C 程序是由函数构成的。
C语言是函数的语言,一个程序是由一个或多个函数构成的。
2、一个函数有两部分组成:
(1)函数的首部(函数的第一行)。
(2)函数体 即函数首部下面的大括弧内的部分。
(3)一个C 程序总是从main 主函数开始执行。无论位置如何。(4)每个语句和数据定义的最后必须有一个分号“;”。
(5)C语言本身没有输入/输出语句,是库函数scanf 和 printf 等函数来完成的。(6)用/* */ 作注释,以用于增加可读性。TC编辑器的运行、操作
1.编辑源文件——2.源文件的编译——3.目标程序的连接——4.执行程序—— 查看结果 操作步骤 Alt+F9 Ctr+F9 Alt+F5
第二章 程序的灵魂—————算法
学习内容
2.1算法的概念
2.2简单算法举例 2.3算法的特征 2.4算法的表示方法
2.5结构化程序设计方法
目的要求:
掌握算法的各种表示方法 熟悉N-S流程图
重点难点:
N-S流程图 重点难点详解:
用N-S流程图描述算法
传统的流程图用流程线和流程元素表示各个处理的执行顺序,但对流程线的使用没有严格的规定,因此,使用者可以不受限制地使流程转来转去,这样的流程图使人难以理解算法的逻辑。为了解决这个问题,规定了算法的三种基本结构:顺序结构、分支结构和循环结构。用这些基本结构按一定的规律组成一个算法,这样的算法称为结构化算法。按照结构化算法编写的程序称为结构化程序。为了设计结构化算法,1973年,美国学者I.Nassi和B.Shneiderman提出提出一种新的流程图,称为N-S流程图。
条件p当条件p成立 操作A操作A 成立不成立
操作A 操作B操作A操作B直到条件p成立
当型循环直到型循环
顺序结构分支结构循环结构
N-S流程图基本符号 0=>s
1=>i例如例2.3.1节的计算1+2+3+„+1000
s+i=>s的算法用N-S流程图
i+1=>i
直到i>1000
输出s
计算1+2+3+„+1000算法的N-S图 第三章
数据类型、运算符与表达式
学习内容
3.1 C语言的数据结构 3.2常量与变量 3.3整数类型 3.4浮点型数据 3.5字符型数据 3.6变量赋初值
3.7各类数值型数据间的混合运算 3.8算术运算符和算术表达式 3.9赋值运算符和赋值表达式 3.10逗号运算符及表达式
目的要求:
掌握整数类型与浮点型数据类型
掌握标识符的命名规则
数据的储存方式
字符型数据
标识符、常量、变量及初始化
掌握运算符及其表达式
掌握赋值运算符和赋值表达式
重点难点:
整数类型与浮点型数据类型
标识符的命名规则
复合赋值运算符
运算符及其表达式
重点难点详解:
整型数据
1.整型数据的在内存中的存放形式 2.整型变量的分类
1)基本整型 一般为2字节 2)短整型 一般为2字节 3)长整型 一般为4字节 3.整型数据的溢出
如何判断整型常量的类型。
① 若在-32768—32767之间,可认为是普通整型int型或短整型(short型)。
② 若超出了-32768—32767,而在-2147483648—+2147483647之间,则认为是长整型(long型)。若认为是int类型的,系统不做检查,但数据会丢失。4.整型常量的类型
(1)十进制整型常量:289、-183 等。每个数位都可以是(0 ~ 9)十个代码。(2)八进制整型常量:以o开头,如(128)10 =o200。(3)十六进制整型常量:以ox开头,如(128)16 =ox80。如何判断整型常量的类型。
① 若在-32768—32767之间,可认为是普通整型int型或短整型(short型)。② 若超出了-32768—32767,而在-2147483648—+2147483647之间,则认为是长整型(long型)。若认为是int类型的,系统不做检查,但数据会丢失。③ 若常量是无符号型(unsigned型),那么一个非负值的整数可以赋值给unsigned型变量,但要注意其范围。50000可赋给unsigned int型,70000却不可以。(无符号整型变量最大值 65535.)
④ 如一整型常量后有L或l则表示为long int型的。常用于函数的调用中。5.整型变量的定义
① 变量定义的一般格式
[存储类型] 数据类型 变量名[, 变量名2„„];
例如,int d, l, a;
定义变量时指定变量的类型,在编译时好为其分配相应的存储单元。另外,还可在编译时检查该变量所做运算是否合法。
一般称在定义变量的同时进行赋初值的操作为变量初始化。
② 变量初始化的一般格式
[存储类型] 数据类型 变量名[=初值][,变量名2[=初值2,„„]];
例如,int d=2, l=6, a;
浮点型数据类型 浮点型常量的表示方法
(1)十进制小数形式:由整数部分、小数点和小数部分组成。
(2)指数形式:由实数部分、E(e)和整数部分组成。2.浮点型数据的在内存中的存放形式 3.浮点型变量的分类
① 单精度型:关键字float,一般占4字节(32位),提供7位有效数字。② 双精度型:关键字double,一般占8个字节、提供15~16位有效数字。③ 长双精度型:关键字long double,3.实型数据的舍入误差
请注意有效为数。4.浮点型常量的类型
一个实型常量赋值给一个实型变量时,只根据实型变量表示的有效数字的位数,在实型常量中按从左向右的方向截取数据。Float型的变量只能保存七位有效数字,double型的变量只能保存15~16位有效数字。5.浮点型变量的定义
和前面整型变量的定义的方法一样。标识符的命名规则
标识符是一个字符序列,用来标识C语言程序中一个对象的名字。命名时应注意以下几点:
1)标识符是一串英文字母或下划线开头的由字母、数字和下划线组成的字符串。例如:a aBC x2z y_1 _A n0都是合法的标识符;而3d #asd 110 A*C ∏ ∑ π 都是非法标识符。
2)C语言本身并没有要求标识符的长度,不同的C编译系统允许包含的字符个数有所不同,通常标识符的长度可识别的标识符长度常限制为8个字符。
3)标识符大小字母含义不同。比如abc Abc ABC 代表三个不同标识符,这一点一定要牢记。复合赋值运算符
合赋值运算符是由赋值运算符之前再加一个双目运算符构成的。
复合赋值运算的一般格式为:
变量 双目运算符 = 表达式 └──┬──┘ 复合赋值运算符
它等价于:变量 = 变量 双目运算符(表达式)。
当表达式为简单表达式时,表达式外的一对圆括号才可缺省,否则可能出错。例如:x += 3 /* 等价于x=x+3 */ y *= x + 6 /* 等价于y=y*(x+6),而不是y=y*x+6 */ C语言规定的10种复合赋值运算符如下:
+=,-=,*=,/=,%=;/*复合算术运算符(5个)*/ &=,^=,|=,<<=,>>=;/*复合位运算符(5个)*/ 其中后五种是位运算的运算符,在位运算那章介绍。运算符及其表达式
算术运算符和算术表达式 1.基本的算术表达式
+ 加法运算符或正值运算符-减法运算符或负值运算符 * 乘法运算符
/ 除法运算符 TC2.0采取“向零取整”法
% 模运算符或称求余运算符 该运算符的两边只能是整型数据。2.算术表达式和运算符的优先级与结合性 左结合性、右结合性 3.强制类型转换运算符
除自动转换外,C语言也允许强制转换。
数据类型强制转换的一般格式为:(要转换成的数据类型)(被转换的表达式)(类型)(表达式)
例如:(int)(x+y)/*将x+y的结果转换成int型*/(float)5/2(等价于(float)(5)/2)/*将5转换成实型,再除以2(=2.5)*/(float)(5/2)/*将5整除2的结果(2)转换成实型(2.0)*/ 注意:强制转换类型得到的是一个所需类型的中间量,原表达式类型并不发生变化。例如,(double)a 只是将变量a的值转换成一个double型的中间量,其数据类型并未转换成double型。
4.自增、自减运算符(++、--)
(1)作用
自增运算使单个变量的值增1,自减运算使单个变量的值减1。
(2)用法与运算规则
自增、自减运算符都有两种用法。
a)前置运算——运算符放在变量之前:++变量、--变量
先使变量的值增(或减)1,然后再以变化后的值参与其它运算,即先增减,后运算。
b)后置运算——运算符放在变量之后:变量++、变量--
变量先参与其它运算,然后再使变量的值增(或减)1,即先运算,后增减。
例如: k=1;k=1;
演示1-9
j=++k;j=k++;左边: k先变成2,j=2 右边: k为1,j=1然后k为2。
使用中的问题说明:
(1)这两种、运算符只能用于变量,而不能用于常量或表达式。(2)++、--运算符的优先相同,但比算术运算符优先级要高。其结合性是“从右至左”的。
i=3;j=-(i++);i=3;j=+(++i);
printf(“%d,%d”,i,j);printf(“%d,%d”,i,j);
结果是:4,-3 结果是:4,4
第四章 顺序结构程序设计
学习内容:
4.1 C语句概述 4.2赋值语句
4.3数据输入输出
4.4字符数据的输入输出 4.5格式输入和输出
4.6顺序结构程序设计举例
目的要求:
掌握顺序结构程序设计方法
掌握数据的输入输出
重点难点:
数据的输入输出
重点难点详解:
数据的输入输出
1.printf函数(格式输出函数)
printf()函数的作用:向计算机系统默认的输出设备(一般指终端或显示器)输出一个或多个任意类型的数据。
(1)printf函数调用的一般形式为: printf(“格式字符串”,输出表列);例如:printf(“radius=%fnlength=%7.2f,area=%7.2fn”, r, l, a);格式字符串也称格式控制字符串或格式转换字符串,其中可以包含下列三种字符:
① 格式指示符:由“%”和格式字符组成,例如“%f”、“%7.2f”等,这总是由“%”字符开始,到格式字符终止。它的作用是将输出的数据项转换为指定的格式输出。输出表列中的每个数据项对应一个格式指示符。② 转义字符:这些字符通常用来控制光标的位置。
③ 普通字符:除格式指示符和转义字符之外的其他字符,这些字符输出时原样输出,例如上面例子中的“radius=”等。
(2)类型字符:
%d 十进制整数 int a=567;printf(“%d”,a);567 %o 八进制无符号整数 int a=65;printf(“%o”,a);101 %x或X 十六进制无符号整数 int a=65;printf(“%x”,a);ff %u 不带符号十进制整数 int a=567;printf(“%u”,a);567 %c 单一字符 char a=65;printf(“%c”,a);A %f 小数形式浮点小数 float a=456.789;printf(“%f”,a);456.789000 %s 字符串 printf(“%s”,“ABC”);ABC %e或E 指数形式浮点小数 float a=456.789;printf(“%e”,a);4.567890e+02 %g或G e和f中较短一种 float a=456.789;printf(“%g”,a);456.789 说明:
格式字符要用小写
格式字符与输出项个数应相同,按先后顺序一一对应
输出转换:格式字符与输出项类型不一致,自动按指定格式输出
2.scanf函数(格式输入函数)(1).scanf函数的一般形式
格式:scanf(“格式控制字符串”,地址表列);功能:按指定格式从键盘读入数据,存入地址表
指定的存储单元中,并按回车键结束 返值:正常,返回输入数据个数
地址表列:变量的地址,常用取地址运算符& 格式字符:d,i,o,x,u,c,s,f,e 使用scanf()时应注意的一些问题:
①scanf函数中没有精度控制,不能企图用格式控制符来规定输入数据的精度scanf(“%5.2f”,&a)×
②scanf中要求给出变量地址,如给出变量名则会出错。如 scanf(“%d”,a);是非法的,应改为scnaf(“%d”,&a);才是合法的。
③在输入字符数据时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符。
④在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔则可用空格,TAB或回车作间隔。在输入数据时遇到以下情况之一认为一个数据输入结束 字符数据的输入输出
1.putchar 函数(字符输出函数)
putchar 函数是字符输出函数,其功能是在显示器上输出单个字符。其一般形式为:putchar(字符变量)例如:
putchar('A');(输出大写字母A)putchar(x);(输出字符变量x的值)putchar('n');(换行)
2.getchar函数(键盘输入函数)
getchar函数的功能是从键盘上输入一个字符。其一般形式为: getchar();通常把输入的字符赋予一个字符变量,构成赋值语句,如: char c;c=getchar();
第五章 选择结构程序设计
学习内容:
5.1关系运算符和关系表达式 5.2逻辑运算符和逻辑表达式 5.3if语句
5.4switch 语句
目的要求:
掌握关系运算符逻辑、条件运算符及其它们的表达式 掌握if语句 掌握switch语句
重点难点:
If语句 Switch语句
重点难点详解:
If语句
用if语句可以构成分支结构。它根据给定的条件进行判断,以决定执行某个分支程序段。C语言的if语句有三种基本形式。
1.第一种形式为基本形式
if(表达式)语句;
其语义是:如果表达式的值为真,则执行其后的语句,否则不执行该语句。
2.第二种形式为if-else形式 if(表达式)语句1; else 语句2; 其语义是:如果表达式的值为真,则执行语句1,否则执行语句2。3.第三种形式为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所示。4.在使用if语句中还应注意以下问题
(1)在三种形式的if语句中,在if关键字之后均为表达式。该表达式通常是逻辑表达式或关系表达式,但也可以是其它表达式,如赋值表达式等,甚至也可以是一个变量。例如:
if(a=5)语句;
if(b)语句;
都是允许的。只要表达式的值为非0,即为“真”。如在if(a=5)„;中表达式的值永远为非0,所以其后的语句总是要执行的,当然这种情况在程序中不一定会出现,但在语法上是合法的。
(2)在if语句中,条件判断表达式必须用括号括起来,在语句之后必须加分号。
(3)在if语句的三种形式中,所有的语句应为单个语句,如果要想在满足条件时执行一组(多个)语句,则必须把这一组语句用{} 括起来组成一个复合语句。但要注意的是在}之后不能再加分号。Switch语句
C语言还提供了另一种用于多分支选择的switch语句,其一般形式为:
switch(表达式){
case常量表达式1: 语句1;
case常量表达式2: 语句2;
„
case常量表达式n: 语句n;
default
: 语句n+1;
}
其语义是:计算表达式的值。并逐个与其后的常量表达式值相比较,当表达式的值与某个常量表达式的值相等时,即执行其后的语句,然后不再进行判断,继续执行后面所有case后的语句。如表达式的值与所有case后的常量表达式均不相同时,则执行default后的语句。
在使用switch语句时还应注意以下几点:
1.在case后的各常量表达式的值不能相同,否则会出现错误。2.在case后,允许有多个语句,可以不用{}括起来。
3.各case和default子句的先后顺序可以变动,而不会影响程序执行结果。4.default子句可以省略不用。
第六章 循环结构程序设计
学习内容:
6.1概述
6.2goto 语句以及用goto 语句构成循环 6.3while 语句
6.4do„while语句
6.5for语句 6.6循环的嵌套 6.7几中循环的比较
6.8break 语句和continue语句
目的要求: 掌握while语句、do-while语句、for语句 掌握循环的嵌套
重点难点:
for语句
Break和continue语句
重点难点详解:
for语句
for语句是C语言中所提供的功能最强、使用最为灵活的一种循环语句。特别适用于循环次数固定而循环条件不确定的情况。
for语句的一般形式如下:
for(表达式1;表达式2;表达式3)
{ ……
}
(1)表达式1通常是用来给循环变量赋初值,一般是赋值表达式。也允许在for语句之外给循环变量赋初值,此时可省略该表达式;
(2)表达式2通常是循环条件,一般为关系表达式或逻辑表达式,也可以是其它表达式;
(3)表达式3通常可用来修改循环变量的值,一般是赋值表达式。
三个表达式都是可选项,都可以省略。但特别提请注意的是,表达式1和表达式2后的分号“;”不能省略。
for语句的执行过程如下:
(1)首先计算表达式1的值;
(2)再计算表达式2的值,若值为真(非0)则执行循环体语句一次,否则跳出循环;(3)循环体语句执行完后,再计算表达式3的值,转(2)步去执行。在整个for循环过程中,表达式1只计算一次,表达式2和表达式3则可能计算多次。
for语句的流程图
for语句最主要的特点是:特别适合已知循环次数的循环语句,下面介绍一下for语句中循环次数的计算方法。根据for循环的循环变量的变化情况。循环次数的计算可以用公式进行计算:
n=(int)((终值-初值+步长)/步长)
其中,初值指循环变量的初始值,终值指循环变量满足条件的最终值,步长指循环变量每循环一次所变化的量。
例如:循环语句for(n=1;n<=100;n++)(设n为整形变量)控制循环体反复执行的次数为
n=(int)((100-1+1)/1)=100
又如:循环语句for(n=100;n<0;n=n-2)(设n为整形变量)控制循环体反复执行的次数为
n=(int)((1-100-2)/(-2))=50
在使用for语句中要注意以下几点:
(1)for语句中的各表达式都可省略,但分号间隔符不能少; 如:for(;表达式;表达式)省去了表达式1; for(表达式;;表达式)省去了表达式2; for(表达式;表达式;)省去了表达式3; for(;;)省去了全部表达式。
(2)在循环变量已赋初值时,可省去表达式1。如省去表达式2或表达式3则将造成无限循环,这时应在循环体内设法结束循环。
(3)循环体可以是空语句。例如:从键盘输入一行字符然后逐个输出每一个字符。
(4)for语句也可与while,do-while语句相互嵌套,构成多重循环。
Break和continue语句
break语句有两种用法。第一种用法是在switch语句中,跳出switch结构,转去执行后面的程序,其用法在第三章中已经介绍;第二种用法是,绕过一般的循环条件检验,立即强制地中止一个循环。下面介绍第二种用法:
break语句的一般形式如下:
break;
当一个循环体内的break语句被执行时,循环立即中断,并转向循环体外的下一条语句.Continue语句有点像break语句。continue语句只能用在循环体内,不能用在其他位置。
其一般形式如下:
continue;
其功能是:结束本次循环,即不再执行该循环体中continue语句之后的语句,转入下一次循环条件的判断与执行,所以有时又称短路语句。应当注意的是:break语句在循环体中的作用是结束整个循环,而continue语句只结束本次循环,继续下一次循环,即并不退出循环。
计算机等级考试试题讲解
熟练掌握程序设计的三种方法。怎么样求解完全数、完备数 求解同构数、求解素数的方法
求解Fibonacci数列、自然数的阶乘
第七章 数组
学习内容:
7.1 一维数组的定义和引用 7.2二维数组的定义和引用 7.3 字符数组和字符串 目的要求:
掌握一维数组定义初始化
掌握选择排序、气泡排序、插入排序的解题方法 掌握二维数组定义初始化 掌握字符数组和字符串的区别 如何利用字符数组来存放字符串
重点难点:
二维数组使用 字符数组的应用 字符串的存放
重点难点详解:
二维数组使用
二维字符数组的每一行可以看作一维字符数组,即二维字符数组的每一行可以存放一个字符串,于是二维字符数组又称为字符串数组.#include
一、字符数组的定义:char a[19], a[10][10];二.初始化:
1、将逐个字符赋给数组中个元素。
static char a[4]={„h‟,‟o‟,‟w‟,‟!‟}
2.可直接将一C字符串赋予某一字符数组。
static char str[8]=”program”;三.字符数组的引用。
可以引用字符数组中每一个元素,得到一个字符。%c 可以对整体处理。%s
四、字符串和字符串结束标志 字符串的结束标志是‘ ’,这是系统自动加上的。
在初始化时,注意: static char c[4]={„b‟,‟o‟,‟y‟};与 static char c[4]=“boy”; 有区别。字符串的存放
1、puts()函数:输出字符串(以' '结尾)。例、static char c[6]=“China”;printf、puts均以' '结尾.printf(“%sn”,c);printf需要格式控制符%s puts(c);puts不需要格式控制符,且自动换行
2、gets()函数:输入字符串到数组。例、static char str[12];gets(str);注意:gets()、puts()一次只能输入输出一个字符串。而scanf()、printf()可以输入输出几个字符串。例:#include “stdio.h” main(){ char str[80];gets(str);puts(str);} 注意:scanf():输入字符串使用“%s”,输入的字符串中不能包含„ ‟字符(空格),否则输入结束,输入的字符数组名不要加入“&”,一个scanf()语句一次可以输入多个字符串。
Printf(): 输出字符串使用“%s”,输出的字符串中不能包含„ ‟字符,否则输出结束,一个prinft()语句一次可以输出多个字符串。gets():使用gets(字符数组名)形式,输入字符串中可以包含„ ‟字符,但一个gets()一次只可以输入一个字符串。
puts():使用puts(字符数组名)形式,输出字符串可以包含„ ‟字符,但一个gets()一次只可以输出一个字符串。
3、strcat():连接字符串。strcat(字符串1,字符串2);把“字符串2”连接到“字符串1”的后面。
4、strcpy():字符串拷贝。strcpy(字符串1,字符串2);把“字符串2”的值拷贝到“字符串1”中
不能用赋值语句将一个字符串常量直接赋给一个字符数组,应使用strcpy()函数。
5、strcmp():字符串比较。
比较“字符串1”、“字符串2”,例、strcmp(str1,str2);strcmp(“China”, “Korea”);strcmp(str1, “Beijing”);比较规则:逐个字符比较ASCII码,直到遇到不同字符或„ ‟,比较结果是该函数的返回值。
6、strlwr():将字符串中的大写字母转换为小写字母(lwr:lowercase小写)。
7、strupr():将字符串中的小写字母转换为大写字母(upr:uppercase大写)。
注意:以上函数均是库函数,使用时必须用#include语句包含头文件。#include “string.h”
第八章 函数
学习内容:
8.1概述
8.2函数的定义
8.3函数参数和函数的值 8.4函数的调用 8.5函数的嵌套 8.6函数的递归
8.8局部变量和全局变量 8.9变量的存储类型
8.10外部函数和内部函数
目的要求:
怎么定义函数 函数怎么样调用 掌握函数的嵌套 掌握函数的递归调用 熟悉c中四种存储类别 熟悉外部函数和内部函数
重点难点:
函数的定义 函数的调用 函数的嵌套 四种存储类别
重点难点详解:
函数的定义: 1.函数定义的形式
根据前面函数的分类,我们知道函数中各种各样的函数形式是有区别的,函数是存在有、无返回值,有、无参数之分的。我们这里研究最复杂的形式,然后通过简化得到其它简单形式。根据使用方式一般有二种定义形式。(1)传统的定义形式
[类型标识符] 函数名([形参列表])形参说明 { 声明部分
语句 /* 功能实现部分 */ [return 表达式;] }(2)现代的定义形式
[类型标识符] 函数名([数据类型 形式参数,数据类型 形式参数,……]){ 声明部分
语句 /* 功能实现部分 */ [return 表达式;] } 函数的传统定义形式和现代定义形式主要的区别是在形式参数的定义形式上,当没有形式参数的时候是一致的。例如一个求2个数最大值的函数定义如下: /* 传统定义形式 */ int max(x,y)int x,y;{ if(x>y)return x;else return y;} /*现代的定义形式*/ int max(int x,int y){ if(x>y)return x;else return y;} 现在各种书中一般都采用现代的定义形式,以后例子中我们都是采用现代的定义形式,针对现代定义形式,进行说明:
(1)定义形式中最上面的一行是函数的头。函数的头一般描述了这个函数的返回值类型、函数名和形式参数。由一对花括号“{ }”括起来的部分称为函数
体,函数体是书写语句的地方,是函数的功能实现部分,在这里语句的书写方式和以前所讲过的main函数的书写方式是一样的。
(2)函数名是唯一标识一个函数的名字,它的命名规则与变量的命名规则相同。在一个程序中,除main函数外,其它的自定义函数的名字都是由用户指定的,命名时除了不要与系统的关键字、库函数的名字相同外,用户要同变量命名一样做到“见名知义”。(3)当函数名前的类型标识符指定为“void”时,这样的函数是一个无返回值的函数,对应的函数体中是不需要return语句的。当函数名前的类型标识符为一种类型的关键字或未指定(默认为int)时,函数体中的return语句是需要的,这就说明这个函数是一个有返回值的函数,当函数执行完毕时将带回一个类型为所指定(未指定时默认为int)的值给主调函数。
当定义了返回值类型,而在函数体中不用return语句,这样函数会带回一个不确定的值,这样的值是没有用的,所以当不需要一个函数的返回值时,最好定义成无返回值的类型(用void指定)。
(4)函数名后面的一对圆括号中为函数的形式参数定义,当括号为空的时候,表示这个函数是一个无参数的函数,调用时不需要提供参数。当括号内为非空时,则代表调用这个函数时需要提供参数,参数的定义形式同定义一个变量是一样的。当有多个参数时,各参数之间用逗号分割。函数的调用
1.函数的调用方式
当函数定义好后,就可以在主函数中调用了,这是最简单的调用形式了。C语言中,函数调用的一般形式为:
函数名([实际参数列表])在函数调用中,对于无参函数调用时是没有实际参数列表。实际参数列表中的参数可以是常数,变量或其它构造类型数据及表达式,各实际参数之间用逗号分隔。
(1)函数表达式:函数作为表达式中的一项出现在表达式中,这种形式是使用函数的返回值参与了表达式的运算,这种方式要求函数是有返回值的。当是无参数函数调用时实际参数列表是空的,但后面的一对圆括号是不能缺少的,当有参数时要在圆括号中提供实际参数。例如:z=max(x,y)是一个赋值表达式,把调用max函数的返回值赋给变量z。
(2)函数语句:函数调用的一般形式加上分号即构成函数语句,这种调用形式可以是无返回值的函数调用形式,或有返回值的并不使用这个函数返回值也可以这样调用。例如:printf(“%d”,a);、print_star();都是以函数语句的方式调用函数的。
(3)函数实参:一个函数调用作为另一个函数调用的实际参数出现。这种情况是把该函数的返回值作为另外一个函数的实际参数进行使用,因此要求该函数必须是有返回值的。函数的嵌套
C语言中不允许嵌套的函数定义。因此各函数之间是平行的,不存在上一级函数和下一级函数的问题。但是C语言允许在一个函数的定义中出现对另一个函数的调用。这样就出现了函数的嵌套调用。即在被调函数中又调用其它函数。函数的嵌套调用为自顶向下、逐步求精及模块化的结构化程序设计提供了最基本的支持。其关系可表示如图。
main(){……① a();……⑤}
a(){……② b();……④ }
函数嵌套调用的执行过程
b(){ ……③ }
图表示了两层嵌套的情形。main函数中调用a函数,在a函数中又调用b 函数,嵌套调用程序的执行是一个逐层深入,然后再逐层退出的过程,具体过程如下:(1)程序开始执行main函数,顺序执行main函数中的语句,即第①步。(2)当执行到调用a函数时,main函数停止执行,转而去执行a函数。(3)顺序执行a函数中的语句,即第②步。
(4)在a函数中遇到调用b函数的语句,a函数停止执行,转而去执行b函数。(5)顺序执行b函数中的语句,即第③步,如果还有函数调用,则继续进入执行。(6)当b函数执行完毕,返回到主调函数a函数的断点继续执行剩下的语句,即第④步。
(7)当a函数执行完毕,返回到主调函数main函数的断点继续执行剩下的语句,直到main函数结束,则程序结束。即第⑤步。
四种存储类别 C语言中对变量的存储类型说明有以下四种: auto
自动变量 register 寄存器变量 static 静态变量 extern 外部变量
自动变量和寄存器变量属于动态存储方式,外部变量和静态变量属于静态存储方式,在定义变量的时候要加上变量的存储类型定义。一般形式如下(即在数据类型前面加上存储类型定义):
[存储类型说明符] 数据类型说明符 变量列表; 例如:
auto int a,b;static float c[4]={1,8,4,7};register int w;extern double x,y;1.自动变量(auto)
自动变量的说明符为auto。这种存储类型是C程序中最广泛应用的一种类型。C语言规定,在函数内凡未加存储类型说明的变量都视为自动变量,即,自动变量可以省去auto关键字。自动变量有以下特点:
(1)自动变量只能定义在函数内部,形参、返回值的数据类型前面不能加auto关键字,否则TURBO C 2.0提示错误。
(2)自动变量采用动态存储方式,当程序执行进入它的作用域,就分配内存,可以访问,当程序出了它的作用范围,变量内存就被回收,变量不可使用。
(3)自动变量和我们以前使用的局部变量是等价的,使用方法也一样,其实以前我们使用的局部变量就是自动变量。
如:auto int b,c=3;等价于 int b,c=3;(相当于省略了auto关键字)2.寄存器变量(register)
我们知道当前所用到的变量都是在内存中开辟空间的,当一个变量频繁的读写就要反复不断地访问内存,从而浪费了大量的时间。众所周知CPU中寄存器的存取速度是非常快的,为了提高效率,C语言允许将局部变量存放在CPU中的寄存器中,这种变量叫“寄存器变量”,用关键字register声明。使用寄存器变量要注意的问题:
(1)只有局部自动变量和形式参数可以作为寄存器变量;
(2)一个计算机系统中的寄存器数目有限,不能定义任意多个寄存器变量;(3)局部静态变量(下面讲的)不能定义为寄存器变量。3.外部变量(extern)
外部变量(即全局变量)是在函数的外部定义的,外部变量的存储空间分配方法是静态存储分配方式,即程序开始运行时,就分配存储空间,当程序结束时才回收存储空间。它的作用域为从变量定义处开始,到本程序文件的末尾,如果在定义点之前的函数或其它源文件中的函数想引用该外部变量,则应该在引用之前用关键字extern对该变量作“外部变量声明”。表明该变量是一个已经定义的外部变量。有了此声明,就可以从“声明”处起,到文件结束,合法地使用该外部变量,即用extern可以扩展外部变量的作用域。4.静态变量(static)
静态变量的说明符是static,用static关键字定义的变量才是静态变量。静态变量分配存储空间采用的是静态存储方式。即,当程序运行时就在用户的静态存储区分配了空间,当程序运行结束的时候才回收内存。我们知道变量按作用域分是有全局变量和局部变量之分的。同样,静态的局部变量和静态的全局变量是不同的。(1)用static声明的静态局部变量
函数中的局部变量在调用函数后要回收空间,变量的值也随之消失。有时希望函数中的局部变量的值在函数调用结束后不消失而保留原值,当下次再调用这个函数的时候继续使用保留的值,这时就应该指定局部变量为“静态局部变量”,即用关键字static进行声明。
1)静态局部变量属于静态存储类别,程序开始运行时(而不是函数发生调用时,这一点一定要注意)在静态存储区内分配存储单元。在程序整个运行期间都不释放,每次调用函数时静态变量的值都是上次调用后的值。而自动变量(即动态局部变量)属于动态存储类别,在动态存储区内分配空间,函数调用结束后就释放。
2)静态局部变量的作用域和动态局部变量的作用域是一致的,虽然静态局部变量在整个程序运行过程中都存在,但在其它函数中并不能使用该变量。
3)静态局部变量在程序开始执行前赋初值,即只赋一次初值;而自动变量赋初值是在函数调用时进行的,每调用一次函数就对自动变量重新赋一次初值。4)如果在定义局部变量时不赋初值,则对静态局部变量来说,运行时自动赋初值0(对数值型变量)或空字符(对字符变量)。而对自动变量来说,如果不赋初值则它的值是一个不确定的值。
5)局部静态变量不能定义为寄存器变量。(2)用static声明静态外部变量
外部变量虽然采用的是静态存储方式,但不能说外部变量是静态变量,当外部变量使用static关键字定义时,这就是静态外部变量。我们知道外部变量的作用域可以使用extern关键字进行拓展,而静态外部变量是不能拓展,即使用了extern关键字也不能拓展它的作用域。外部变量和静态外部变量都采用的是静态存储方式,唯一不同的就是作用域。
第九章 预处理命令
学习内容:
9.1宏定义 9.2文件包含 9.3 条件编译
目的要求:
掌握常用的预处理命令与文件包含
重点难点:
宏定义的应用
重点难点详解:
宏定义的应用:
宏定义功能是定义符号常量和常参数的宏,宏定义编译预处理语句的格式如下 :
#define
字符串1
字符串2 它把字符串1定义为字符串2,字符串1称为字符串2的宏定义,例如,下面是符号常量的宏定义:
#define
ON
#define
OFF
0
它把符号常量ON定义为1,OFF定义为0。符号常量经过宏定义后,就可以在程序中作为常量使用。
在宏定义语句中,可以使用已经定义过的符号常量定义新的符号常理。例如:
#define
WID
#define
LEN
(WID+20)
其中第二个宏定义中使用了第一个宏定义的符号常量WID。在执行编译预处理时,程序中出现的所有符号常量WID都将被40置换。
1、不带参数的宏定义: 用一个指定的标识符(即名字)来代表一个字符串。一般形式:#define 标识符
字符串 例:#define PI
3.14159 说明:
(1)宏名一般习惯用大写字母表示。
(2)使用宏名代替一个字符串,可以减少程序中重复书写某些字符串的工作量。(3)宏定义是用宏名代替一个字符串,也就是作简单的置换,不作正确性检查。(4)宏定义不是C语句,不必在行末加分号.#define PI 3.14159;
area=PI*r*r;
展开:
area=3.14159;*r*r;
出现语法错误
(5)#define命令出现在程序中函数的外面,宏名的有效范围为定义命令之后到本源文件结束。
(6)可以用#undef命令终止宏定义的作用域。
格式:#undef 宏名
7)在进行宏定义时,可以引用已定义的宏名,可以层层置换。
#define R 3.0
#define PI 3.14159
#define L 2*PI*R
#define S PI*R*R
main()
{ printf(“L=%fnS=%fn”,L,S);
}(8)对程序中用双括号括起来的字符串内的字符,即使与宏名相同,也不进行置换。(9)宏定义是专门用于预处理命令,只作字符替换。
2、带参数的宏定义:
一般形式: #define 宏名(参数表)字符串 #define
MULT2(X)
X*X
其中,MULT2(X)称为带参数的宏,X是它的形式参数。该宏定义把MULT2(X)定义为X*X。在此定义后,MULT2(X)就可以用在程序中代替定义它的运算表达式X*X。它的形式参数的使用特性类似于函数的形式参数。在程序中需要计算某个数的平方值时,可以使用这个已定义 的宏,例如:
a=10;
c=MULT2(a);
在进行编译预处理时,带参数的宏用它的定义置换,其中的形式参数用实际使用的实际参数置换。因此,上面的赋值表达式置换后的形式是:
c=a*a;
其中定义式中的形式参数X被实际参数a置换,该运算表达式的结果是100。当程序中需要计算某两个变量和的平方时,如果使用上面定义的带参数的宏的话,如下所示:
w=6;v=4;
c=MULT2(w+v);
进行编译预处理后,上面的赋值表达式置换后的形式是:
c=w+v*w+v;
它的运算顺序与预定的顺序完全不同,计算结果是34。如果上面的宏定义改为下列形式:
#define MULT2(X)(X)*(X)上面的赋值表达式置换后就成为:
c=(w+v)*(w+v);
它的运算结果就正确了。这里又一次看到在定义式中使用必要圆括号的重要性。
第十章 指针
学习内容:
10.1地址和指针的概念
10.2变量的指针 10.3数组与指针 10.4字符串与指针
目的要求:
掌握指针的基本定义以及应用
掌握数组与指针、字符串与指针应用
重点难点:
指针的基本概念 指针变量的运算性质
重点难点详解:
指针的基本概念: 指针:一个变量的地址。例:
int a = 1, b = 2;float f1 = 1.1, f2 = 5.9;double d = 13.24;char c1 = 'A', c2 = 'B';变量都有具体的内存地址。
内存地址:内存中存储单元的编号
注意:内存单元的地址和内存单元的内容的区别
变量的地址:系统分配给变量的内存单元的起始地址 指针变量的运算性质
指针变量:专门用来存放另一个变量的地址。指针变量的值:指针变量中存放的地址。指针变量的说明与初始化
“指针变量”专门用来存放地址的变量。定义形式:类型标识符
*标识符 eg.float
*point;
int
*p;p=&i;point =&f;定义指针时需注意:
1.*表示是指针类型,指针变量名是p,point。
2.指针变量也有类型,根据它所指向的数据来确定的。Eg.point 指向实型,p指向整型。1)与指针变量相关的运算符
“变量的指针”指变量的地址。
指针变量和它所指向的变量之间的联系。
用“*”符号
*point 便是point 所指向的变量。
Eg.point
*point
2000
i=3
*ponit=3 2)指针变量的运算
“指针变量”专门用来存放地址的变量。它有两类运算符:*
& &I 指向I的地址
*p指向p所指向的内容。见183页的例子。说明:
指针变量在定义时无所指,只是定义了这样一种类型。Point-1=&a
point-2=&b 注意定义时,*point-1与引用*point-1的含义不同。
第十一章结构体与共同体
学习内容:
11.2定义结构体类型变量的方法 11.3结构体变量的应用 11.4结构体变量的初始化 11.8共同体
目的要求:
掌握结构体的定义和使用 掌握共同体的定义和使用
重点难点:
结构体的应用
重点难点详解:
结构体的应用: 结构体是由不同数据类型的若干数据集合而成。在程序中使用结构体时,一般不允许把结构体作为一个整体参加操作处理,而应通过对结构体的各个成员项的引用来实现各种运算和操作。
1.引用结构体变量中的一个成员
由于结构体变量是一个整体,要访问其中一个成员,必须先找到这个结构体变量,然后再从中找出其中的一个成员。引用的一般形式:
结构体变量名.成员名
其中圆点符号称为成员运算符。例如上面定义的结构中要想访问stud1项,应写成:stud1.age。
访问stud1.age的步骤如图8-4 所示: 即第一步先访问结构体变量stud1,找到该变量的起始地址后,第二步从stud1所分配的内存区间中找到age 成员项对应的数据。说明:
(1)如果在同一函数中又另外定义了一个age简单变量,它将由系统另外分配存储空间,与stud1.age分属不同的变量。
stud1.age表示结构体变量中的age 成员项,而age 表示简单变量age。
(2)若定义stud1 , stud2 均为同一结构体类型struct examinees的两个变量,则当引用两个变量中的age 成员项时,应分别用stud1.age和stud2.age,它们表示内存中不同的存储单元并且各自有不同的值。
(3)如果一个结构体中又嵌套一个结构体,则要访问一个成员时,应采取逐级访问的方法。
例如:图8-3中所示的嵌套结构体变量,若要访问考生l 的出生年份时,则用:stud1.birthday.year。而不能写成:year 或birthday.year或stud1.year。
(4)允许对结构体变量的成员进行各种相应的运算,但运算的规则应遵循定义结构体时各成员项类型的规则。例如:stud1.num的类型是长整型,因此,它适合于长整型简单变量所允许的所有运算。如算术运算、关系运算、逻辑运算和赋值运算等。2.结构体类型变量的整体引用
可以将一个结构体变量作为一个整体赋给另一个同类型的结构体变量。例如:stud2=stud1;
执行stud2=stud1这个赋值语句时,完成将stud1变量中各成员项逐个依次赋给stud2中相应的各成员。当然要求stud1和stud2必须具有完全相同的数据类型。但必须注意,不允许将一组常量直接赋给一个结构体变量。如下面赋值语句是非法的:
stud2={ 20102, “Liu Hao”,„F‟, 20,„2P‟, 90} 3.结构体变量的输入和输出
结构体变量的输入输出,同样要求必须指明结构体变量所对应的各成员项。例如:
scanf(“ %ld, %s, %c, %d”,&stud2.num, stud2.name,stud2.sex, &stud2.age); 表示输入stud2变量的各成员项的值;
printf(“ %ld, %s, %c, %dn ”,stud1.num, stud1.name,studl.sex, studl.age);表示输出studl变量的各成员项的值。
应当注意:C语言不允许把一个结构体变量作为一个整体进行输入输出操作。因此下面的输入输出语句均是错误的。
scanf(“%ld”, &studl);
printf(“% ldn”, studl);或者scanf(“%ld, %s, %c, %d”, &studl);
printf(“%ld, %s, %c, %dn”, studl);
第十三章 文件
学习内容:
13.1 文件的概念
13.3文件的打开和关闭
目的要求:
掌握c语言对文件的操作是如何通过c语言的库函数来实现问题
重点难点:
文件的操作
重点难点详解:
文件的操作: 所谓“文件”是指一组相关数据的有序集合。这个数据集有一个名称叫做文件名。它是外存中保存信息的最小单位。前面的各章中我们已经多次使用了文件,例如源程序文件、目标文件、可执行文件、库文件(头文件)等。从不同的角度可对文件作不同的分类。
1.从用户的角度看,文件可分为普通文件和设备文件两种。
普通文件是指驻留在磁盘或其它外部介质上的一个有序数据集,可以是源文件、目标文件、可执行程序;也可以是一组待输入处理的原始数据,或者是一组输出的结果。对于源文件、目标文件、可执行程序可以称作程序文件,对输入输出数据可称作数据文件。2.从数据的组织来看,文件可分文本文件和二进制文件两种。
文本文件也称为ASCII文件,文件中的每个元素都是字符,文件在磁盘中存放时每个字符对应一个字节,用于存放对应的ASCII码。3文件打开与关闭函数
和其他高级语言一样,对文件读写之前应该“打开”该文件,在使用结束之后应“关闭”该文件。
1)文件打开函数——fopen函数
fopen函数用来打开一个文件,其调用的一般形式为:
文件指针名=fopen(文件名及路径,使用文件方式);
其中,“文件指针名”必须是被说明为FILE类型的指针变量,“文件名及路径”是被打开文件的文件名,是字符串常量或字符串数组,如文件不在当前目录中需指定文件路径。“使用文件方式”是指文件的类型和操作要求。2)文件关闭函数——fclose函数
fclose函数用来关闭一个文件,其调用的一般形式为:
fclose(文件指针);
例如:fclose(fp);,为关闭fp指针所指的文件。
正常完成关闭文件操作时,fclose函数返回值为0。如返回非零值则表示有错误发生。
文件的打开和关闭是对文件的读和写是最常用的文件操作。我们经常在使用文件前打开文件,然后进行文件的读写操作,最后还应该养成在程序终止之前关闭所有文件的习惯,如果不关闭文件将会丢失数据。因为,在向文件写数据时,是先将数据输出到缓冲区,待缓冲区充满后才正式输出给文件。如果当数据未充满缓冲区而程序结束运行,就会将缓冲区中的数据丢失。用fclose函数关闭文件,可以避免这个问题,它先把缓冲区中的数据输出到磁盘文件,然后才释放文件指针变量。
第五篇:C语言程序设计
1.Problem A: Hello world!Description Xiao_ming有两个哥哥,大哥叫Da_min,二哥叫Er_min。三兄弟放学回家,父母分别跟他们打招呼。
Input 无
Output 请输出: Hello Da_min, Hello Er_min, Hello Xiao_ming!
Sample Input Sample Output Hello Da_min, Hello Er_min, Hello Xiao_ming!
HINT 请注意换行符
Append Code #include
printf(“Hello Da_min,n”);
printf(“Hello Er_min,n”);
printf(“Hello Xiao_ming!n”);} 2.Problem B: 求圆的面积和周长 Description 从键盘输入圆的半径,求圆的面积和周长,圆周率取3.14。
Input 输入一个浮点型数据,有效数字不会超过十进制的6位。
Output 输出为两行。
第一行为圆的面积,第二行为圆的周长,格式见sample。
Sample Input 3
Sample Output Area: 28.260000 Perimeter: 18.840000
HINT 了解浮点类型的输入、输出和算术运算符
Append Code 法一
#include
#include
double r;
scanf(“%d”,&r);
printf(“Area: %lfn”,pi*r*r);
printf(“Perimeter: %lfn”,2*pi*r);
}
3.Problem C:平均值 Description 求3个数的平均值。
Input 输入只有一行,为3个较小的整数。
Output 输出为这3个整数的平均值,保留3位小数。
Sample Input 1 2 3 Sample Output 2.000
HINT 注意除法运算对整型数据和浮点型数据是不一样的。
Append Code #include
4.Problem D: 求字符的值 Description 从键盘输入3个字符(不含双字节字符),分别输出每个字符的十进制值(ASCII码)、八进制值和十六进制值。
Input 输入为3个字符。
Output 输出为3行。
每一行为每个字符(对应输入顺序)的十进制、八进制和十六进制值,用空格分隔开。每个输出的值占3个字符,不足3个字符前面补0。
Sample Input 0 A
Sample Output 048 060 030 032 040 020 065 101 041
HINT 了解字符值的存储和整型的关系。
Append Code #include
5.Problem A: 最简单的程序 Description 输出一行“Hello world!”。
Input 无
Output Hello world!
Sample Input Sample Output Hello world!
HINT Append Code #include
printf(“Hello world!”);}
6.Problem B: 算术基本运算 Description 计算两整数x和y(0 Input 输入只有一行,格式见sample。 Output 输出为多行,按顺序每行输出x,y的和、差、积、商、余数、x的平方和y的三次方,格式见sample Sample Input x = 11, y = 3 Sample Output x + y : 14 xy : %dn“,x-y); printf(”x * y : %dn“,x*y); printf(”x / y quotient: %d, remainder: %dn“,x/y,x%y); printf(”x ^ 2 : %dn“,x*x); printf(”y ^ 3 : %dn“,y*y*y);} 7.Problem C: 自增自减运算 Description C语言中有自增运算++、自减运算--,并且可以前置和后置。 编写一个程序:对输入的一个整数a,输出a++、a--、++a、--a的值。 Input 一个整数a,a是很小的整数。 Output 输出为5行,第一行为a的值,后面依次为--a、a--、a++、++a的值。 5行输出纵向a要对齐,“:”对齐,“:”前后各一个空格,后面的数值不用对齐。每行行尾都有回车。 Sample Input 0 Sample Output a : 0--a :-1 a--: 0 a++ : 0 ++a : 1 HINT Append Code #include : %dn“,a);printf(”--a : %dn“,--a);a=x;printf(” a--: %dn“,a--);a=x;printf(” a++ : %dn“,a++);a=x;printf(”++a : %dn“,++a);} 8.Problem F: 绝对值 Description 求整型数据和浮点型数据的绝对值。 Input 输入两个数,第一个是整数,第二个是浮点数。 Output 输出为两行,第一行为整数的绝对值,第二行为浮点数的绝对值,注意浮点数的绝对值不输出无意义的0。 Sample Input-1 1 Sample Output 1 1 HINT 求绝对值可以用标准库函数来完成,也可以自己判断。注意浮点数的输出格式。求绝对值的函数在哪个头文件?貌似很多人会搞错,包括很多编书的人! Append Code #include int n; float m; scanf(”%d%f“,&n,&m); //n=abs(n); //m=fabs(m); if(n<0) { n=-n; } if(m<0) { m=-m; } printf(”%dn“,n); printf(”%g“,m); return 0;} 9.Problem A: 奇数还是偶数? Description 输入一个整数,判读它是奇数还是偶数。 Input 输入只有一行,为一个100以内的正整数。 Output 输出为一行。 若输入为偶数则输出“even”,奇数输出“odd”。Sample Input 30 Sample Output even HINT 用整数运算可以解决,练习“?:”表达式。 Append Code #include int n; scanf(”%d“,&n); if(n>=0&&n<=100){ if(n%2==0)printf(”evenn“); else printf(”oddn“); } return 0;} 10.Problem B: 简单的打折计算 Description 商店规定:消费满n元,可以打八八折。设某件商品标价m元,输入购买的件数x,计算出需要支付的金额(单位:元),精确到分。 Input 输入只有一行,三个整数m、n和x,且0 Sample Input 95 300 4 Sample Output 334.40 HINT 了解浮点型的输出控制,注意整型和浮点型混合运算过程中的数据类型转换。 Append Code #include int m,x,n,a; float b; scanf(”%d%d%d“,&m,&n,&x); 0 x m a=m*x; if(a>n) b=0.88*a; else b=a; printf(”%.2fn“,b); } 11.Problem C: 判断闰年 Description 输入一个正整数的年份,判断是否为闰年。 Input 输入只有一行,为一个10000以内的正整数。 Output 输出为一行。 若输入为闰年偶数则输出“Yes”,否则输出“No”。 Sample Input 2010 Sample Output No HINT 了解逻辑运算符和关系运算符。 Append Code #include int x; scanf(”%d“,&x); if(x>0&&x<10000) { if(x%4==0&&x%100!=0) printf(”Yesn“); else if(x%400==0) printf(”Yesn“); else printf(”Non“); } else printf(”error“);} 12.Problem D: 水仙花数 Description 如果一个三位十进制数等于其各位数字的立方和,则称这个数为水仙花数。如:13+53+33=153。 Input 一个整数x,100<=x<=999。 Output x是水仙花数,则输出“YES”,否则为“NO”。 Sample Input 153 Sample Output YES HINT Append Code #include int a,b,c,x; scanf(”%d“,&x); a=x/100; b=x/10%10; c=x%10; if(x==a*a*a+b*b*b+c*c*c) printf(”Yes“); else printf(”No“);} 13.Problem E: 三个数比较大小 Description 从键盘上输入0~100之间的三个数,按从小到大的顺序输出。 Input 输入只有一行,为三个整数。 Output 按从小到大输出这三个数。 Sample Input 15 10 20 Sample Output 10 15 20 HINT 用if语句判断各种情况可以解决这个问题。 Append Code #include int a,b,c; scanf(”%d%d%d“,&a,&b,&c); if(a>=b) { if(b>=c) printf(”%d %d %dn“,c,b,a); else if(c>=a) printf(”%d %d %dn“,b,a,c); else printf(”%d %d %dn“,b,c,a); } else { if(a>=c) printf(”%d %d %dn“,c,a,b); else if(b>=c) printf(”%d %d %dn“,a,c,b); else printf(”%d %d %dn“,a,b,c); } } 14.Problem F: 奇怪的求和之一 Description 给定3个正整数a、b和c,按照如下规则求和: 如果这个数字是偶数,则累加到和中; 如果这个数字是奇数,则将大于该数的最小偶数累加到和中。 Input 三个正整数,均在100以内。 Output 一个和。 Sample Input 2 3 5 Sample Output 12 HINT 如果不会使用分支语句,可使用条件运算符判断到底将哪个数累积到和中。 Append Code #include int a,b,c; scanf(”%d%d%d“,&a,&b,&c); if(a%2!=0)a++; if(b%2!=0)b++; if(c%2!=0)c++; printf(”%dn“,a+b+c); } 15.Problem G: 你过线了吗? Description 经过四年的学习,你决定报考我国著名的“285”高校之一的北青大学,经过认真的复习,残酷的考试,终于知晓了自己的考试成绩,也知道了北青大学的录取分数线,请你编程判断,自己过线了吗? Input 输入有2行,第一行有4个正整数,分别表示三门课程的分数线以及总分分数线。第二行有3个非负整数,分别表示你考的三门课程的成绩。 Output 如果你的三门课程成绩都不低于相应课程的分数线,且你的考试总分也不低于北青大学的总分分数线要求,则输出“congratulations”,否则输出“sorry”。 Sample Input 70 80 70 240 80 80 82 Sample Output congratulations HINT 如果你不会使用分支语句,同样可以使用条件运算符实现该程序。 Append Code #include int a,b,c,d,e,f,g,h; scanf(”%d %d %d %dn%d %d %d“,&a,&b,&c,&d,&e,&f,&g); h=e+f+g; if(e>=a&&f>=b&&g>=c&&h>=d) printf(”congratulations“); else printf(”sorry“);} 16.Problem I: A+B Problem(II): Input/Output Practice Description 计算a+b,0<=a,b<1000。 Input 输入的第一行是一个整数N,后面有N对整数a和b,每对a和b占一行,a,b用空格分开。 Output 每行输出一个a+b的和,顺序与输入对应。 Sample Input 2 1 2 10 20 Sample Output 3 30 HINT N给出了测试样例数,用for循环处理方便。 Append Code #include int n,a,b,i;Scanf(“%d”,&n);For(i=0;i 17.Problem H: A+B Problem Description 计算a+b,0<=a,b<1000。 Input 输入有多对整数a和b组成,每对a和b占一行,a,b用空格分开。 Output 每行输出一个a+b的值,顺序与输入对应。 Sample Input 1 2 10 20 Sample Output 3 30 HINT OJ系统上测试输入结束符为EOF(End Of File),其值为-1。用scanf()把文件所有内容读完后,会读到EOF,所以可以用来判断输入是否完成,测试时可以用Ctrl+Z产生EOF。本题解法参看FAQ。Append Code #include int a,b; while(scanf(”%d%d“,&a,&b)!=EOF){ printf(”%dn“,a+b); } return 0;} 18.Problem A: 判断是否是元音字母 Description 输入一个英文字母,判断是否是元音字母。元音字母是:a,e,i,o u,A,E,I,O,U Input 输入一个英文字母 Output 是元音字母,输出“yes”,否则输出“no”,行尾没有回车。 Sample Input A Sample Output yes HINT Append Code #include char ch; scanf(”%c“,&ch); if(ch>='A'&&ch<='Z') ch=ch+32; if(ch=='a') printf(”yes“); else if(ch=='e') printf(”yes“); else if(ch=='i') printf(”yes“); else if(ch=='o') printf(”yes“); else if(ch=='u') printf(”yes“); else printf(”no“); } 19.Problem B: 按顺序输出三个数 Description 对于输入的3个整数,按照从小到大的顺序输出。 Input 输入3个int类型内的整数,两两之间用一个空格隔开。 Output 按照从小到大的顺序输出上述三个数,两两之间用一个空格隔开。 Sample Input 2 1 3 Sample Output 1 2 3 HINT Append Code #include int a,b,c,temp; scanf(”%d%d%d“,&a,&b,&c); if(a { temp=a; a=b; b=temp; } if(a { temp=a; a=c; c=temp; } if(b { temp=b; b=c; c=temp; } printf(”%d %d %dn“,c,b,a);} 20.Problem E: Description 判断输入整数的奇偶性。 判断奇偶数 Input 输入为一个整数。 Output 输出只有一行,代表判断结果。如果输入的整数n是一个偶数,输出: n is an even number.否则输出: n is an odd number.见样例。 Sample Input 12 Sample Output 12 is an even number.HINT Append Code #include int a; scanf(”%d“,&a); if(a%2==0) printf(”%d is an even number.“,a); else printf(”%d is an odd number.“,a);} 21.Problem A: 判断两个整数的大小关系 Description 输入2个整数a和b,如果a>b,则输出1,否则输出0。 Input 两个整数a和b,均不超过int类型的表示范围。 Output 表示a>b的结果:如果a>b,则输出1,否则输出0。 Sample Input 3 4 Sample Output 0 HINT Append Code #include printf(”1“); else printf(”0“);return 0;} 22.Problem D: 成绩的等级 Description 把百分制的考试成绩转换成五级制的成绩: 90~100:Excellent 80~89:Good 70~79:Average 60~69:Pass 0~59:Failing 不在0~100之间的输入是非法数据,输出“Error”。 Input 输入多行,每行一个整数。 Output 输入所对应的成绩等级。 Sample Input-1 81 92 35 68 72 100 Sample Output Error Good Excellent Failing Pass Average Excellent HINT 用switch语句解决这个问题比较方便。 Append Code #include int score; while(scanf(”%d“,&score)!=EOF) { if(score<0||score>100) printf(”Errorn“); else { switch(score/10) { case 0: case 1: case 2: case 3: case 4: case 5:printf(”Failingn“);break; case 6:printf(”Passn“);break; case 7:printf(”Averagen“);break; case 8:printf(”Goodn“);break; case 9: case 10:printf(”Excellentn“);break; } } } return 0;} 23.Problem E: 输出是m的倍数或n的倍数、但不是 m和n的公倍数的数 Description 输出1~k之间是m的倍数或n的倍数、但不是m和n的公倍数的数,其中1<=m,n Input 输入三个整数,依次为k、m、n。 Output 从小到大输出符合题意的所有整数,两数之间用一个空格分开。 Sample Input 15 2 3 Sample Output 2 3 4 8 9 10 14 15 HINT 难点在于输出格式的控制:空格在数的中间,学会用循环时边界情况的特殊处理。 Append Code #include a=m;else a=n;printf(”%d“,a);for(i=a+1;i<=k;i++){ } if((i%m==0&&i%n!=0)||(i%n==0&&i%m!=0)) printf(” %d“,i);} return 0; 24.Problem B: 两整数相加减 Description 计算a+b和a-b。 Input 输入为一对整数a和b。a,b用空格分开。 Output 输出a+b和a-b的计算结果,各占一行。 Sample Input 1 2 Sample Output 3-1 HINT Append Code #include printf(”%dn“,a+b); printf(”%dn“,a-b);} 25 Problem C: 它满足条件吗? Description 需要判断给定的一个整数是否同时满足如下三个条件: 1.它是一个完全平方数。2.它是一个偶数。3.它是一个正数。 注:若一个数能表示成某个自然数的平方的形式,则称这个数为完全平方数。例如: 0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225,256,289,324,361,400,441,484,529 Input 一个int范围内的整数。 Output 如果输入的数字满足条件,则输出yes,否则输出no。 Sample Input 100 Sample Output yes HINT 注意逻辑表达式判断三个条件的顺序。如果你不会使用分支语句,同样可以使用条件运算符实现该程序。 库函数sqrt()可以用于求一个数的平方根。 Append Code #include if(a==sqrt(a)*sqrt(a)&&a%2==0&&a>0) printf(”yes“); else printf(”no“);} 26.Problem F: 多路分支 Description 编写一个完整的程序,运行时向用户提问”你考试考了多少分?(0-100)“接受输入后判断其等级并显示出来等级: 优:90<=分数<=100 良:80<=分数<90 中:60<=分数<80 差:0<=分数<60 Input 输入任意一个整数分数值,显示等级;再输入任意一个整数分数值,显示等级;....直到测试数据较充分,可输入-1止。 Output 对任意输入的分数值,输出对应的等级,直到输入的数为-1时才退出运行.Sample Input 102 100 90 80 70 60 50 0-80-1 Sample Output grad must between 0 and 100 优 优 良 中 中 差 差 grad must between 0 and 100 grad must between 0 and 100 HINT Append Code #include int x; while(scanf(”%d“,&x)!=EOF) { if(x<0||x>100) printf(”grad must between 0 and 100n“); else if(x>=90) printf(”优n“); else if(x>=80) printf(”良n“); else if(x>=60) printf(”中n“); else if(x>=0) printf(”差n“); } return 0;} Problem D: 有多少人? Description 学校举行运动会,如果全体学生按照3人一队列队,则多了1个人;如果按照4人一队列队,则多了2个人;如果按照5人一队排队,则多了3个人。请问这个学校有多少学生? Input 一个int类型的正整数N,是学生人数的上界,即:该校学生数不超过N。 Output 所有可能的学生数,每个数占一行。 Sample Input 200 Sample Output 58 118 178 HINT Append Code #include int n,i; scanf(”%d“,&n); for(i==1;i<=n;i++){ if(i%3==1&&i%4==2&&i%5==3) printf(”%dn“,i);} return 0;} Problem C: 正负数各有几个? Description 输入若干个整数,求其中正数、负数的个数。 Input 输入分为2行:第一行是一个数字N>0,表示下面有N个整数。第2行是N个整数,都是int类型的。 Output 输出所输入的N个整数的正数个数和负数个数,并用空格分开2个输出。Sample Input 10 2 3 4 5-1-2-3-4-5 Sample Output 5 5 HINT 貌似还有一种叫做0的数。 Append Code #include int n,a,i,num1=0,num2=0; scanf(”%d“,&n);for(i=0;i { scanf(”%d“,&a); if(a>0) num1++; else if(a<0) num2++; } printf(”%d %dn“,num1,num2); return 0;} Problem A: A+B Problem(III): Input/Output Practice Description 计算a+b,0<=a,b<1000。 Input 输入有多对整数a和b组成,每对a和b占一行,a,b用空格分开。当测试样为0 0时表示输入结束,0 0不参与运算。 Output 每行输出一个a+b的值,顺序与输入对应。 Sample Input 1 2 10 20 0 0 Sample Output 3 30 HINT 练习break的使用。 Append Code #include { if(a!=0||b!=0) } printf(”%dn“,a+b); else break; return 0;} 30 Problem B: A+B Problem(IV): Input/Output Practice Description 计算a+b,0<=a,b<1000。 Input 输入有多对整数a和b组成,每对a和b占一行,a,b用空格分开。 Output 每行输出一个a+b的值,顺序与输入对应。每个格式样例之间用一个空行分隔开。 Sample Input 1 2 10 20 15 35 Sample Output 3 30 50 HINT 由于输出的和比空行多一个,所以全部计算放在一个循环里是不行的,必须要特殊处理开头或者结尾。 Append Code #include n++; if(n==1) printf(”%dn“,a+b); else printf(”n%dn“,a+b); } return 0;} Problem C: n个数的最大值和最小值 Description 找出n个数中最大的数和最小的数,并将它们的值输出出来。 Input 输入为n+1个整数,都在int类型范围内。这些数可能用若干空格或者换行符分隔开。输入的第1个数为n,表示后续有n个数输入。从输入的第2个数开始,求出直到第n+1个数中最大的数和最小的数。 Output 输出为两行,格式见sample。 Sample Input 3 0 1-1 Sample Output The maximum number is 1.The minimum number is-1.HINT 分隔符是空格还是回车都是空白符,对scanf(”%d“)来说没有区别;先读入n,然后用for循环就很容易控制读入n个数的过程。 Append Code #include int n,i,max,min; scanf(”%d“,&n); int a[n];