第5讲 结构化程序设计(Part II) 周水庚 2018年10月11日.

Slides:



Advertisements
Similar presentations
CSIM, PU C Language Introduction to the C Programming Language 重覆敘述 (for,while,break,continue) 適合重複性的計算或判斷.
Advertisements

Loops.
第一章 C语言概述 计算机公共教学部.
補充: Input from a text file
第十三章 文件.
C语言程序设计 第八章 函数.
第九章 系 统 安 全 性 9.1 结构体 9.2 结构体型数组  9.3 结构体型指针 9.4 内存的动态分配 9.5 共用体
第一章 程序设计入门.
C语言程序设计 第五章 选择结构程序设计.
C语言程序设计 课程 第5章 数组 主讲:李祥 博士、副教授 单位:软件学院软件工程系.
C 程序设计实例 1. 问题描述 2. 数据结构 3. 算法分析 4. 参考程序 5. 改进说明.
循环结构又称为重复结构:用来处理需要重复处理的问题,它是程序中一种很重要的结构。
函數 授課:ANT 日期:2009/3/24.
计算概论 第二十一讲 文件操作 北京大学信息学院.
第3章 顺序结构程序设计 本章要点: 格式化输出函数──printf() 格式输入函数——scanf() 字符输出函数——putchar()
Chap 10 函数与程序结构 10.1 函数的组织 10.2 递归函数 10.3 宏定义 10.4 编译预处理.
C程序设计.
Chap 2 用C语言编写程序 2.1 在屏幕上显示 Hello World! 2.2 求华氏温度 100°F 对应的摄氏温度
STRUCTURE 授課:ANT 日期:2010/5/12.
计算概论 第十八讲 C语言高级编程 结构与习题课 北京大学信息学院.
C 語言簡介 - 2.
Chap 8 指针 8.1 寻找保险箱密码 8.2 角色互换 8.3 冒泡排序 8.4 电码加密 8.5 任意个整数求和*
11.1 文件的基本概念 11.2 文件的打开与关闭 11.3 文件的顺序读写 11.4 文件的随机读写 11.5 文件检测
2017北一女中 資訊能力競賽 暑期培訓營
第5章 堆疊(Stacks) 5-1 堆疊的基礎 5-2 堆疊的表示法 5-3 堆疊的應用 - 運算式的計算與轉換
QQ: 李祥 QQ: 欢迎多种方式的学习交流,祝大家学有所成.
Introduction to the C Programming Language
作弊是否很有诱惑性? 上堂课已经讲了 作业不一定在两个小时里都能完成 答疑没有一个人? 作弊是有记录的 心理系很多同学集体作弊,让人震惊
6.4.1指针与二维数组 1、二维数组结构的分析 设有数组定义为:int a[3][4]; 则有: a表示数组在内存中的首地址。
1. 說明一個一維整數陣列passwd,下標範圍0至49 2. 在屏幕顯示 "Enter password"
C语言 程序设计基础与试验 刘新国、2012年秋.
fp=fopen("CD2.dat","wb"); fwrite(&min,8,1,fp); fclose(fp);
File(檔案處理) 學習目標:開檔、讀檔、更新檔與關閉檔案.
期中考试成绩分布 《程序设计》-2017年秋.
THE C PROGRAMMING LANGUAGE
第10章 檔案與資料夾處理 10-1 C語言的檔案輸入與輸出 10-2 文字檔案的讀寫 10-3 二進位檔案的讀寫
程序的三种基本结构 if条件分支语句 switch多路开关语句 循环语句 循环嵌套 break,continue和goto语句
第9章 文件操作 文件 使用文件的目的 操作系统管理数据的基本单位 存储在外存储器上的数据的集合
第七章 函数及变量存贮类型 7.1 函数基础与C程序结构 7.2 函数的定义和声明 7.3 函数的调用 7.4 函数的嵌套与递归
第4章 顺序程序设计.
第0章作业: 教材P12-练习与实践 1.写出用符号’*’输出描绘汉字”大”的流程图。
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
一、文件的基本概念 第十三章 文 件 所谓“文件”是指一组相关数据的有序集合。 这个数据集有一
C语言概述 第一章.
第1讲 C语言基础 要求: (1) C程序的组成 (2) C语言的标识符是如何定义的。 (3) C语言有哪些基本数据类型?各种基本数
Introduction to the C Programming Language
C语言程序设计 教案 崔武子制作
函式庫補充資料.
浙江长征职业技术学院—计算机与信息技术系—相方莉制作
指標
Chap 5 函数 5.1 计算圆柱体积 5.2 数字金字塔 5.3 复数运算.
第十四章 若干深入问题和C独有的特性 作业: 函数指针 函数作参数 函数副作用 运算 语句 位段 存储类别 编译预处理
C程序设计.
C程序设计.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
Introduction to the C Programming Language
程序设计基础.
第13章 文 件.
第七章  数 组.
結構、檔案處理(Structure, File)
Chap 7 数 组 7.1 排序问题 7.2 找出矩阵中最大值所在的位置 7.3 进制转换.
第七章 文件 7.1 文件的基本概念 7.2 文件类型指针 7.3 文件的打开与关闭 7.4 文件的读/写 7.5 文件的随机读/写
第二章 数据类型、运算符和表达式 §2.1 数据与数据类型 §2.2 常量、变量和标准函数 §2.3 基本运算符及其表达式 目 录 上一章
C/C++基礎程式設計班 C語言入門、變數、基本處理與輸入輸出 講師:林業峻 CSIE, NTU 3/7, 2015.
C/C++基礎程式設計班 陣列 講師:林業峻 CSIE, NTU 3/14, 2015.
Chap 10 函数与程序结构 10.1 圆形体积计算器 10.2 汉诺塔问题 10.3 长度单位转换 10.4 大程序构成.
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
Q1(a) 小偉打算編寫一個程序。該程序把兩個44的表內的數字相加。表3內的數字是由表1和表2應格子內的數字相加而成。例如:
函式庫補充資料 1.
C语言基础学习 从外行到入门.
Presentation transcript:

第5讲 结构化程序设计(Part II) 周水庚 2018年10月11日

提要 C程序简介 函数基础知识 文件的简单用法 简单程序设计实例 《程序设计》-2018年秋

提要 C程序简介 函数基础知识 文件的简单用法 简单程序设计实例 《程序设计》-2018年秋

C程序简介 一个C程序可由若干个源程序文件组成 一个源文件可以由若干个函数和预处理命令以及全局变量声明部分组成 一个函数由变量定义部分和执行语句组成 一个源程序文件也是可独立编译的单位,所以C程序可以按源程序文件分别编写、分别编译 《程序设计》-2018年秋

《程序设计》-2018年秋

C语句 C语句是C程序的基本组成单元 C语句可以分为以下5类 空语句 表达式语句 复合语句 控制语句 函数调用语句 《程序设计》-2018年秋

C语句(续) 控制语句有9种 if() … else … (条件语句) switch (多分支选择语句) for() (循环语句) while() (循环语句) do … while() (循环语句) continue (结束本次循环语句) break (中止执行switch或循环语句) goto (转向语句) return (从函数返回语句) 《程序设计》-2018年秋

C语句(续) 函数调用语句 表达式语句 空语句 复合语句 由一次函数调用加一个分号构成 由一个表达式加一个分号构成,如赋值语句 只有一个分号的语句,它什么也不做 复合语句 用 {}把一些语句括起来构成,又称分程序 《程序设计》-2018年秋

C程序的三种基本结构 顺序结构 条件控制结构 循环结构 if … [else …] while() do … while() for() 《程序设计》-2018年秋

提要 C程序简介 函数基础知识 正文文件的简单用法 简单程序设计实例 《程序设计》-2018年秋

函数基础知识 结构化程序设计中,将复杂的功能分解成若干简单的子功能,用函数编码实现子功能,通过调用函数实施子功能要求 函数是一个实现指定功能、逻辑上独立的代码段 对函数使用者来说,把它看作“黑盒”,只需知道要传送给函数的数据(输入),和函数执行后能得到什么结果(输出) 函数可以定义局部对象,使函数在逻辑上作为程序的一个相对独立单位,不受主函数或其它函数的程序对象命名的影响 《程序设计》-2018年秋

函数基础知识(续) 函数可带形参,使函数执行时,操作对象、求值方式等可随不同调用的需要而改变 函数为程序的层次构造和开发提供支持,使设计新程序能在已有函数基础上构造功能更强的函数和程序 一个C程序以 main()函数作为程序的主函数。程序运行时,从它开始执行 在C语言中,函数不能嵌套定义,一个函数并不从属于另一个函数 除不能调用 main() 函数外,其它函数可以相互调用 《程序设计》-2018年秋

函数库 把一些公用的、基本的计算功能所对应的函数集中起来,构成一个库,我们称之为函数库,相应的函数成为库函数 函数库中的函数具有预先定义的、标准的输入、输入接口 C语言中定义了一些基本的标准函数 编程环境工具厂商(Microsoft、Borland等)往往提供更多的函数供编程者使用 《程序设计》-2018年秋

函数库(续) C语言使用头文(header file,即*.h文件)对函数库中的函数进行定义和说明 函数库中的函数经编译后,绑定在一起件,构成一个库文件(library file ,即*.lib文件) C程序调用C语言或者编程环境提供的函数时,要在程序中包含(include)相应的头文件;在产生执行文件时,需要与库文件中相应的目标函数代码连接 为了使用方便,C语言按功能分类,提供了大量函数库,每个函数库都有自己的头文件 《程序设计》-2018年秋

库函数的使用 使用相应库函数的程序都要在使用之前写上包含其头文件的预处理命令 常用的头文件 stdio.h (输入输出库函数) math.h、stdlib.h、float.h (数学库函数) time.h (时间库函数) ctype.h (字符分类和转换库函数) string.h (内存缓冲区和字符串处理库函数) graphics.h (图形处理库函数) malloc.h、stdlib.h (内存动态分配库函数) signal.h、process.h (进程控制库函数) 《程序设计》-2018年秋

实例 实例1:时间函数使用 实例2:随机函数使用(1) 实例3:随机函数使用(2) 《程序设计》-2018年秋

#include <stdio.h> #include <time.h> void main() { struct tm *tmNow; /* 定义一个时间结构指针变量 */ long secsNow; /* 定义以秒为单位的记录时间的变量 */ char *strNow; /* 时间字符串表示的字符指针 */ time(&secsNow); /* 调用函数time(),得到当前时间 */ strNow = ctime(&secsNow); /* 获得时间的字符串表示 */ printf("自1970年1月1日至现在的时间(以秒为单位):%ld\n", secsNow); printf("当前时间的另一种表示:%s\n", strNow); tmNow = localtime(&secsNow); /* 获得结构形式的时间 */ printf("存于tmNow所指结构中的时间有年中的日、年、月、日、时、分、秒:\n"); printf("%d %d-%02d-%02d %02d:%02d:%02d\n", tmNow->tm_yday,tmNow->tm_year+1900, tmNow->tm_mon,tmNow->tm_mday, tmNow->tm_hour,tmNow->tm_min,tmNow->tm_sec); strNow = asctime(tmNow); /* 得到字符串表示的时间 */ } 《程序设计》-2018年秋

#include <stdio.h> #include <time.h> #include <stdlib.h> void main() { int k; long now; srand(time(&now) % 60); /* 用时间初始化随机 数发生函数的初态,使初态总不相同 */ for(k = 0; k < 10; k++) /* 产生10个随机数输出 */ printf(”%d\n”, rand()); /* 调用随机函数 */ } 《程序设计》-2018年秋

#include <stdio.h> #include <time.h> #include <stdlib.h> void main() { int i; srand(time(NULL)); for(i=1; i<=10000; i++) { printf(”%10d”, 1+rand()%6); if(i%5==0) printf(“\n”); } 《程序设计》-2018年秋

函数定义 函数定义的一般形式为 类型标识符 函数名(形式参数说明表) { 说明和定义部分 语句序列 } 《程序设计》-2018年秋

函数定义(续) 类型标识符用于标识函数执行结果返回值的类型 当函数执行不返回值时,习惯用void来标记 当函数返回int型值时,类型标识符int可以省略 函数名是一个标识符,一个C程序有且只有一个main()函数,其它的函数名可以随意命名 《程序设计》-2018年秋

函数定义(续) 函数名之后括号内的形式参数说明表是按需要而定 没有形参的函数,也就没有形参说明表,常用void代之,但函数名之后的一对圆括号不可省略 当函数有多个形参时,形参说明之间用逗号分隔,每个形参说明指定形参的类型和形参名 《程序设计》-2018年秋

函数定义(续) 最外层花括号“{”和“}”括住的部分是函数体 在函数体的前面部分可有函数需要的程序对象的说明和定义 函数体内定义的变量是局部变量,只能在函数体内引用它们 说明和定义之后是由语句序列组成的执行代码 《程序设计》-2018年秋

例子1 求两个数中最小值的函数min() return语句的执行将结束函数的执行 C语言的return语句有两种形式: double min(double x, double y) /* 返回 double 型值,有两个形参 x,y,都为 double 型的 */ { /* 函数返回x和y中的小者的值 */ return x < y ? x : y; } return语句的执行将结束函数的执行 C语言的return语句有两种形式: return;用于不返回值的函数体中 return 表达式;用于有返回值的函数体中 《程序设计》-2018年秋

例子2 求两个正整数最大公因子的函数gcd() 两个正整数a和b的最大公因子有性质: gcd(a, b) = gcd(a-b, b), 如a > b; gcd(a, b) = gcd(a, b-a), 如a < b; gcd(a, b) = a, 如a = b。 《程序设计》-2018年秋

第1解法 int gcd(int a, int b) { while( a != b) if(a > b) a -= b; else b -= a; return a; } 《程序设计》-2018年秋

第2解法 步骤: [求余数] 求a除b的余数r [判结束] 如r等于0,b为最大公约数 [替换] 用b置a,r置b,并回到步骤[求余数] 《程序设计》-2018年秋

int gcd(int a, int b) { int r; while(1) { if((r = a % b) == 0) break; } return b; 《程序设计》-2018年秋

int gcd(int a, int b) { int r = a; do { a = b; b = r; r = a % b; } while (r); return b; } 《程序设计》-2018年秋

函数定义(续) C语言也允许在函数名后的圆括号内只给出各形参的名,随后才指定各形参的类型,但这种写法在C++中已不允许 double min(x, y) double x, y; { return x < y ? x : y; } C语言还允许函数体为空的函数 dummy() /* 或 dummy(void) */ 《程序设计》-2018年秋

函数调用 函数被定义以后,凡要实现函数功能的地方,就可简单地通过函数调用来完成 函数调用的一般形式为 函数名(实在参数表) 实在参数,简称实参。函数调用时,实参按它们出现的顺序与函数定义中的形参一一对应,并要求实参类型与其对应的形参类型相一致 《程序设计》-2018年秋

函数调用(续) 函数调用有两种方式 传值调用(call by value) 传引用调用(call by reference) 把实参的值传给被调用函数的参数(形参)。这时,被调用函数对参数的改变,不影响调用函数实参的原始值 传引用调用(call by reference) 把实参的地址传给被调用函数的参数(形参)地址。这时,被调用函数对参数的改变,将影响到调用函数实参的原始值 《程序设计》-2018年秋

函数调用(续) 对double min(double x, double y)的函数调用 w = min(u, v); 函数调用min(u, v)就是对函数min()的调用,它提供了两个实参u和v,分别对应形参x和y 如果调用无形参的函数,这时函数的调用形式变为 函数名() 其中函数名之后的一对圆括号是不能省略的 《程序设计》-2018年秋

函数调用(续) 按函数调用在程序中的作用,有两种不同类型的应用 函数调用只是利用函数所完成的功能。此时,将函数调用作为一个独立的语句。这种应用不要求或无视函数的返回值 如程序中经常使用的调用格式输入函数scanf()和格式输出函数printf()等。 函数调用是利用函数的返回值:或用这返回值继续进行表达式的计算,或输出函数返回值等 《程序设计》-2018年秋

函数调用的执行过程 为形参分配内存空间 计算实参表达式的值,并将值赋给对应的形参 为函数的局部变量分配内存空间 执行函数体内的语句序列 函数体执行完,或执行了return语句后,释放为这次函数调用分配的全部内存空间 将函数值(如果有)返回到函数调用处继续执行 《程序设计》-2018年秋

#include <stdio.h> double x, y, d, min(double, double); void main() { printf(“Enter x,y.\n”); scanf(“%lf%lf”,&x,&y); d = min(x, y); printf(“MIN(%.3f, %.3f) = %.3f\n”, x, y, d); } double min(double a, double b) { double temp; temp = a > b ? b : a; return temp; 《程序设计》-2018年秋

对函数调用的说明 当函数执行return语句或执行完函数体的语句序列后,函数的这次调用就结束,随之将控制返回到函数调用处继续执行 函数的返回值是通过执行return 语句时,计算return之后的表达式值而获得的。如果函数不提供返回值,则return语句不包含表达式。 如果函数有返回值,则应有确定的类型,并在函数定义时指明。若函数定义时不指明返回值类型,且函数有返回值,C语言约定该函数的返回值类型为int型 《程序设计》-2018年秋

对函数调用的说明(续) 为了明确指明函数不提供返回值,建议在函数定义时,在函数名之前写上void。并在这样的函数体内,所有的return语句都不带表达式 当函数执行不带表达式的return语句返回时,函数并不是一定不带回值,而是返回一个不确定的值。这时,不应该利用函数返回值进行再计算,否则会产生错误结果 函数定义中的return语句的表达式类型应与函数定义中指明的返回值类型相一致。如果return语句中的表达式类型与函数定义指明的返回值类型不一致时,对于基本类型情况,则以函数的返回值类型为准,系统会自动进行类型转换 《程序设计》-2018年秋

实参向形参单向传递数据 在函数未被调用时,函数定义中的形参和函数体中定义的局部变量并不占用存储单元 在函数定义中,必须为函数的形参指定数据类型 函数体中所使用的形参的初值是由函数调用时对应的实参表达式给定的 C语言规定,实参表达式对形参的数据传递是“值传递”的,即单向传递 对于有多个实参的函数调用情况,C语言不规定实参的求值次序 《程序设计》-2018年秋

提要 C程序简介 函数基础知识 文件的简单用法 简单程序设计实例 《程序设计》-2018年秋

文件的简单用法 介绍这部分内容的目的 学习编写从文件输入数据和把结果输出到文件的程序 了解使用文件程序的结构 掌握文件的一般使用方法 熟悉一些和文件操作有关的库函数的用法 涉及一些较深的概念先暂且接受! 《程序设计》-2018年秋

定义文件变量 在程序的开始处定义文件指针变量,和存储文件名的字符数组 #include <stdio.h> FILE *fp; /* 定义文件指针变量fp */ char fname[40]; /* 存储文件目录路径和文件名的字符数组 */ 《程序设计》-2018年秋

输入文件名 printf(”输入文件名(包括目录路径、扩展名)\n”); scanf(”%s%*c”,fname);/* 输入文件名及回车符 */ 《程序设计》-2018年秋

打开文件 程序从正文文件输入数据 程序向正文文件输出结果 if ((fp = fopen(fname, ”r”)) == NULL){ 读打开时,要求被打开文件已存在 程序从正文文件输入数据 if ((fp = fopen(fname, ”r”)) == NULL){ printf(”%s文件不能打开\n”, fname); return; } 程序向正文文件输出结果 若被打开文件不存在,则建立一个新文件;若被打开文件已存在,则该文件中的数据被删除 fp=fopen(fname,”w”); /* 为写打开文件*/ 《程序设计》-2018年秋

关闭文件 文件使用结束后,要及时关闭 fclose(fp); /* 以后fp又可用于打开文件 */ 《程序设计》-2018年秋

文件输入输出 调用函数fgetc()从文件输出下一个字符 ch=fgetc(fp); /* 将输入字符存于变量ch */ 调用函数fscanf()从文件按指定格式输出数据 fscanf(fp,”%d%d”,&k,&j); /* 从文件输出整数 */ 调用函数fputc()向文件输入一个字符 fputc(ch, fp); /* 将变量ch中的字符输出到文件*/ 调用函数fprintf()向文件按指定格式输入数据 fprintf(fp,”%d %d\n”, k, j); /* 向文件输入整数 */ 《程序设计》-2018年秋

从文件逐一输出字符 int c; /* 不能为char类型 */ FILE *fp; … /* 说明有关变量和设置初值等 */ … /* 说明有关变量和设置初值等 */   if ((fp = fopen(文件名, ”r”)) == NULL) { printf(”不能打开文件 %s。\n”, 文件名); return; } while((c = fgetc(fp)) != EOF) { … /* 对刚读入的字符信息 c 作某种处理 */ fclose(fp); … /* 输出处理结果 */ 《程序设计》-2018年秋

字符逐一输入形成新文件 int c; /* 也可以是char类型 */ FILE *fp; … /* 说明有关变量和设置初值等 */ … /* 说明有关变量和设置初值等 */ fp = fopen(文件名,”w”); while(还有字符) {    … /* 生成字符(或字节)存于变量c */ fputc(c, fp); /* 将生成的字符输出 */ } fclose(fp); … /* 输出程序结束报告 */ 《程序设计》-2018年秋

例子 将键盘输入的字符流复制到指定的文件 逐行复制从键盘输入字符到指定文件,直至输入空行结束 《程序设计》-2018年秋

#include <stdio.h> FILE *fp; void main() { int ch; char fname[40]; printf(”输入文件名!\n”); scanf(”%s%*c”, fname); fp=fopen(fname,"w"); /* 以写方式打开正文文件 */ while((ch=getchar())!=‘\n’){ /* 逐行处理,至空行结束 */ do fputc(ch, fp); /* 行内字符逐一复制 */ while ((ch = getchar()) != ‘\n’); /* 处理当前行 */ fputc(ch, fp); /* 输出换行符 */ } fclose(fp); printf(”程序复制键盘输入字符结束。\n”); 《程序设计》-2018年秋

提要 C程序简介 函数基础知识 正文文件的简单用法 简单程序设计实例 《程序设计》-2018年秋

【例1】输入整数n,输出由2*n+1行2*n+1列,以下形式(n = 2)的图案。 * * * * * * * * * 图案中,同一行上的两个星号字符之间有一个空格符 对于上半部分,设第一行的星号字符位于屏幕的中间,则后行图案的起始位置比前行起始位置提前两个位置 对于下半部,第一行的起始位置比上半部最后一行起始位置前进两个字符位置,以后各行也相继进两个位置 《程序设计》-2018年秋

#include <stdio.h> void main() { int n, j, k; printf("Enter n!\n"); scanf("%d", &n); for(j = 0;j <= n; j++) { printf("%*c", 40 - 2*j, ’ ’); for(k = 1; k <= 2*j+1; k++) printf(" *"); printf("\n"); } for(j = n-1; j >= 0; j--) { “%*c”中的*表示输入宽度由后面的参量值确定 《程序设计》-2018年秋

【例2】试编制一个程序输出以下形式的乘法表。 1 2 3 4 5 6 7 8 9 1 1 2 2 4 3 3 6 9 4 4 8 12 16 1 2 3 4 5 6 7 8 9 1 1 2 2 4 3 3 6 9 4 4 8 12 16 5 5 10 15 20 25 6 6 12 18 24 30 36 7 7 14 21 28 35 42 49 8 8 16 24 32 40 48 56 64 9 9 18 27 36 45 54 63 72 81 《程序设计》-2018年秋

#include <stdio.h> void main() { int i, j; printf("\n\t 1 2 3 4 5 6 7 8 9\n"); for(i=1; i <= 9; i++) { printf("\t%d", i); for(j = 1; j<=i; j++) printf("%4d", i*j); printf("\n"); } printf("\n\n\n"); 《程序设计》-2018年秋

【例3】编制一个程序, 实现输入n(>2) 个整数, 输出其中的次最大数。 为求次最大,程序在循环过程中需保留两个数,当前暂时最大数max1和当前暂时次最大数max2。 程序将输入的第一个数暂时保留,待输入第二个数后,确定max1和max2。 从第三个输入数x开始,根据x调整max1和max2。调整过程需考虑以下几种可能: x>max1,则以max1作为新的max2,x作为新的max1; max1>x>max2,则以x作为新的max2; x<max2,则不调整。 《程序设计》-2018年秋

#include <stdio.h> void main() { int n, i, max1, max2, x, temp; printf("输入 n(>=2)!\n"); scanf("%d", &n); if (n < 2) return; printf("输入第 %d 个整数. ", 1); scanf("%d", &temp); printf("输入第 %d 个整数. ", 2); scanf("%d", &x); if (temp < x) { max1 = x; max2 = temp; } 《程序设计》-2018年秋

else { max1 = temp; max2 = x; } for(i = 3; i <= n; i++) { printf("输入第 %d 个整数. ", i); scanf("%d", &x); if ( x > max1) { max2 = max1; max1 = x; } else if (x > max2) max2 = x; printf("次最大是 %d\n\n", max2); 《程序设计》-2018年秋

【例4】编制对给定的整数,判该整数是否是质数的函数,若是质数,函数返回1,否则函数返回0。 判一个整数n是否是一个质数有许多方法:如n=2,则n是质数; 若n是其它偶数,则n不是质数; 让整数变量k自3开始,每次增2,直至k 的平方超过n为止,若其中某个k能整除n,则n不是质数。若所有这样的k都不能整除n,则n是质数。 《程序设计》-2018年秋

for(k = 3L; k*k <= n; k += 2L) if (n % k == 0) break; int isPrime(long n) { long k; if (n == 2L) return 1; if (n % 2 == 0) return 0; for(k = 3L; k*k <= n; k += 2L) if (n % k == 0) break; if (k*k > n) return 1; return 0; } 《程序设计》-2018年秋

【例5】编制输入整数,输出小于等于该整数的全部质数的程序。程序首先输出质数2,之后对指定范围内的奇数采用例4的方法判其是否是质数。 #include <stdio.h> void main() { long m, n; int j; /* j控制每行输出10个质数 */ printf(”输入整数\n”); scanf(”%ld”, &m); printf(”%6d”, 2); j = 1; for(n = 3L; n <= m; n += 2) if (isPrime(n)) { if (j++ % 10 == 0) printf(”\n”); printf(”%6ld”, n); } printf(”\n”); 《程序设计》-2018年秋

【例6】输入x,求级数s(x)的近似值。约定求和的精度为0.000001。 x3 x5 x7 s(x) = x+ + + +… 3*1! 5*2! 7*3! 一般地,设级数为 s(x) = t0 + t1 + t2+ ┅ + tk 《程序设计》-2018年秋

{ s = 0; /* 级数的部分和变量s,置初值0 */ t = 首项值; /* 置通项变量t为级数的首项值 */ 求级数部分和的算法可描述如下: { s = 0; /* 级数的部分和变量s,置初值0 */ t = 首项值; /* 置通项变量t为级数的首项值 */ k = 0; /* 置项序号变量k为0 */ while (fabs(t) >= Epsilon) { s += t; /* 累计当前项tk到部分和 */ t = f(t,k);/* 由当前项t和k计算下一个当前项的值 */ k++; /* 项序号增1 */ } 《程序设计》-2018年秋

对于本题,首项值为x,级数第k(>=0)项tk的算式为 (-1)k*x(2*k+1)/((2*k+1)*k!) k+1项tk+1与k项tk有关系 tk+1 = -tk*x*x*(2*k+1)/((2*k+3)*(k+1)) tk是通项t的当前项值,tk+1是通项t的下一个当前项值。由当前项t和k计算t的下一个当前项值t’,可用以下表达式实现: t’ = -t*x*x*(2.0*k+1.0)/((2.0*k+3)*(k+1)) 把以上式子代入上述算法,并令x的值由输入给定,写出程序如下: 《程序设计》-2018年秋

#include <stdio.h> #include <math.h> #define Epsilon 0.000001 void main() { int k; double s, x, t; printf(“Enter x.\n”); scanf(“%lf”, &x); s = 0.0; /* 级数的部分和变量s置初值0 */ t = x; /* 置通项变量t为级数的首项值 */ k = 0; /* 置项序号变量k为0 */ while (fabs(t) >= Epsilon) { s += t; t = -t*x*x*(2.0*k+1)/((2.0*k+3)*(k+1)); k++; /* 项序号增1 */ } printf(“s(%f) = %f\n”, x, s); 《程序设计》-2018年秋

【例7】编制从键盘输入整数序列,并按输入顺序输出到指定的文件中的程序。 程序循环地从键盘输入整数,将整数输出到指定的文件中。当程序发现不能从键盘输入整数时结束循环。 《程序设计》-2018年秋

#include <stdio.h> FILE *fp; int main() { int x, k; char fname[40]; printf(”输入文件名!\n”);scanf(”%s%*c”, fname); if ((fp=fopen(fname, "w")) == NULL) { printf("不能打开文件 %s。\n", fname); return 0; } k = 1; while(scanf(”%d”, &x) == 1) { fprintf(fp, ”%d\t”, x); if (k++ % 5 == 0) fprintf(fp, ”\n”); } fclose(fp); printf(”\n输出了 %d个整数.\n”, k-1); return 1; /* scanf返回值表示输入参数的个数 */ 《程序设计》-2018年秋

【例8】编制从指定的文件中输出整数,并按输出顺序输出到显示屏上。 程序从文件循环地输入整数,将整数输出到显示屏。当程序发现不能从文件输入整数时结束循环。 《程序设计》-2018年秋

#include <stdio.h> FILE *fp; int main() { int x, k; char fname[40]; printf(”输入文件名!\n”); scanf(”%s%*c”, fname); if ((fp=fopen(fname, "r")) == NULL) { printf("不能打开文件 %s。\n", fname); return 0;} k = 1; while(fscanf(fp, ”%d”, &x) == 1) { printf(”%d\t”, x); if (k++ % 5 == 0) printf(”\n”); } fclose(fp); printf(”\n从文件 %s输入了 %d个整数.\n”, fname, k-1); return 1; } 《程序设计》-2018年秋

【例9】求Sn=a+aa+aaa+…+aa…a(n个a之值),其中a是一个十进制数字。 #include<stdio.h> main() { long sn; int i, a, t, n; printf(“Input n and a:”); scanf(“%d %d”, &n, &a); t=a;sn=0;i=1; do{ sn+=t; i++;t=t*10+a; }while(i<n); printf(“Sn=%l\n”, sn); } 《程序设计》-2018年秋

【例10】有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13,… 求出这个数列的前n项之和 分析: 假设这个序列的第k项为tk=ak/bk,有tk+1=(ak+bk)/ak=1+1/tk a1=2; b1=1 《程序设计》-2018年秋

#include<stdio.h> main() { int i=1,n, float t, s printf(“Input n:”); scanf(“%d”, &n); s=0.0;t=2.0 while(i<=n){ s+=t; t=1.0+1.0/t;i++ } printf(“The sum is: %f”, s); 《程序设计》-2018年秋

要求前后两次求出的x的差的绝对值小于10-5。 【例11】用迭代法求 。求平方根的迭代公式为 要求前后两次求出的x的差的绝对值小于10-5。 #include<stdio.h> Main() {float a, x1,x2; printf(“Input a’s value:”); scanf(“%f”, &a); x1=a; do{ x2=0.5*(x1+a/x1);} while(fabs(x2-x1)>=1e-5); printf(“ =%f”, x2) ; } 《程序设计》-2018年秋

#include<stdio.h> main() { int i, first, second, third; 【例12】打印出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其各位数字立方和等于该数本身。例如,153是一水仙花数,因为153=13+53+33 #include<stdio.h> main() { int i, first, second, third; for(i=100; i<=999; i++){ first=i/100; second=(i/10)%10; third=(i%100)%10; if (i==first*first*first+second*second*second+third*third*third) printf(“%d\n”, i);} } 《程序设计》-2018年秋

【例13】一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如,6的因子为1、2、3,而6=1+2+3, 因此6是“完数”。编程序找出1000之内的所有完数,并按下面格式输出其因子: 6’s factors are 1,2,3 《程序设计》-2018年秋

#include<stdio.h> main() {int i, j, sum; for(i=1;i<=1000;i++){ sum=0; for(j=1;j<i;j++) if(i%j==0)sum+=j; if(i==1) printf(“1’s factor is 1”) else if(sum==i){ printf(“%d’s factors are:”); if(i%j==0)printf(“%d,”, j); printf(“\n”); } 《程序设计》-2018年秋

第3章作业 习题:1,5,13, 18, 20,21,23,24 《程序设计》-2018年秋