谢丽聪老师C语言课件-9习题课-2009
合集下载
谢丽聪老师C语言课件-8函数-2009
void pv(a,n)
pv(’+’,3);
char a; int n;
形参:供 其它函数
调用
p_star( );
{ int i;
pv(’$’,5);
for(i=1;i<=n;i++)
p_star( );
printf("%c %c\n",a,a);
}
}
void p_star( )
{ printf("*******\n");
例2: int max(int a,int b) { if(a>b)return a;
一个函数的定义可以放在主函数main之前, 也可放在main之后,末尾无分号
else return b; }
对max函数进行说明,末尾要加分号
main()
{ int max(int a,int b);
int x,y,z;
printf("input two numbers:\n");
scanf("%d%d",&x,&y); z=max(x,y); printf("maxmum=%d",z); } 输入: 80 61
调用max函数,并把x, y中的 值传送给max的形参a, b。 max函数执行的结果(a或 b)将返回给变量z。最后由 主函数输出z的值。
一个C程序由一个主函数和≥0个 其它函数组成函数体允许是空 的或无值类型,或无返回值(void)
结构化程序设计的一个重要特点: 模块化设计,即用一个函数表示 一个模块
例1.
void main( )
执行一个程序从主函数开始,再从 主函数结束
谢丽聪老师C语言课件-6循环控制-2009.ppt
例8. while和do-while循环比较。 sum i
void main()
输入:8
0
8
8
9
{int sum=0,i; scanf(“%d”,&i);
17
10
27
11
while(i<=10)
do {sum=sum+i;
{sum=sum+i; i++;
i++;}
} while(i<=10);
printf(“sum=%d”,sum);
for语句形式: for(循环变量赋初值;循环条件;循环变量增量) 语句
总是一个赋 值语句, 它用 来给循环控 制变量赋初 值
总是一个表 达式, 它用来 判别循环是 否终止
定义循环控制 变量每循环一 次后按什么方 式变化
这三个部分之间用“;”分开
对于for循环中语句的一般形式, for(表达式1;表达式2 ;表达式3) 语句
运行结果:5050
注意: i和sum的初值 i的终值
例3 统计从键盘输入一行字符的个数。
#include <stdio.h>
void main() { int n=0;
完成对输入字 符个数计数。
printf("input a string:\n");
while(getchar()!='\n') n++;
}
输入:11
sum=0
sum=11
66..44.1fo形r 式语:句——代替while 语句
for (表达式1;表达式2;表达式3) 语句 要正确表达循环结构应注意三方面要求: 1、循环控制变量的初始化。 2、循环的条件。 3、循环控制变量的值的更新
c语言教材第9章文件PPT教学课件
“w” ( 只 写 ) 为 输 出 打 开 一 文 本 文 件
“a” ( 追 加 ) 向 文 本 文 件 尾 加 数 据
“rb’ ( 只 读 ) 为 输 入 打 开 一 二 进 制 文 件
“wb” ( 只 写 ) 为 输 出 打 开 一 二 进 制 文 件
“ab” ( 追 加 ) 向 二 进 制 文 件 尾 加 数 据
运行结果:
test.txt 的内容是
3,4.50
} 2020/12/10
14
14
5. 文件定位
文件中有一个位置指针,指向当前读写的位置。 我们可以使用有关函数来改变其位置。
• 二进制文件:把内存中的数据按其在内存中的存 储形式原样输出到磁盘文件上。
4. 输入和输出方式
• 缓冲文件系统:系统自动在内存区为每一个正在
使用的文件名开辟一个缓冲区。从内存向磁盘输
出数据必须先送到内存的缓冲区中,装满缓冲区
后在一起送到磁盘中去。如果从磁盘向内存读入
数据,则一次从磁盘文件将一批数据
/* 文件操作模式 */ /* 下一个字符位置 */ /* 文件缓冲区位置 */
}FILE;
2020/12/10
7
7
2.文件类型指针
例: 定义一个FILE类型的数组
FILE -efile [-MAXFILE]; -MAXFILE: 数组元素个数,也就是可使用文件的
最大数目。
例:定义一个文件指针变量
“w b+ ’ ( 读 写 ) 为 读 /写 建 立 一 新 二 进 制 文 件
“ab+ ” ( 读 写 ) 为 读 /写 打 开 一 二 进 制 文 件
2020/12/10
11
11
谢丽聪老师C语言课件-1C语言概述-2009
1.3 C 语言学习内容
程序
由某种语 言表示
1.4 计算机语言概述
1.语言分类: 1.语言分类: 语言分类 机器语言 汇编语言 高级语言
2.计算机语言表达方式较接近于英语 2.计算机语言表达方式较接近于英语 和我们熟悉的数学公式, 和我们熟悉的数学公式,因此具有较 好的通用性. 好的通用性.
3.常用的高级语言 3.常用的高级语言
编译
连 接
(EXE)
执 行
�
注意: 注意:
计算机不能执行高级语言 写的程序, 写的程序,只能执行机器 语言程序
必须用如下的编译方式把源程序翻译 成目标程序才能被计算机硬件识别和 执行: 执行:
产家提供 我 们 编 输入C 输入 语言源 程序 编译 程序 目标程 序( OBJ) ) 装配 程序
可执行 程序
盘中多出来 名字自己定 结 果
执行一个程序从主函数开始, 执行一个程序从主函数开始 再从主函数结束
1.C程序结构 1.C程序结构: 程序结构:
1)一个 程序由一个主函数和 )一个C程序由一个主函数和 程序由一个主函数和>=0个其它的函数组成, 个其它的函数组成, 个其它的函数组成 每个函数实现某特定功能, 函数间先后不限制, 每个函数实现某特定功能 , 函数间先后不限制 , 执 行程序总是从主函数开始到主函数结束 2)每个函数结构如下: )每个函数结构如下: [函数类型]<函数名>([形参1][,形参2]……) 函数类型]<函数名 函数名> 形参1][,形参2 ……) [形参定义;] 形参定义; { [声明部分] 声明部分] [执行部分]} 执行部分]} 3)可用 /* */ 把注释内容括起来插入在程序中任何 ) 位置,但不允许插入到字符串中 应培养写注释习惯. 但不允许插入到字符串中. 位置 但不允许插入到字符串中.应培养写注释习惯.
硬件第9章2009.ppt
下面分别说明
第9章 常用接口芯片
4
1. 主要引脚
CLK : 时钟脉冲输入端
GATE:门控信号输入端,用于启动或禁止计数器减1操作
OUT: 计数器输出信号,用于输出波形
D0~D7 CS RD WR A0 A1
A1 A0 00 01 10 11
含义 选择计数器0 选择计数器1 选择计数器2 选择控制寄存器
先写计数器低8位,再写高8位,方式3,二进制计数。
答: 控制字是36H ( 0 0 1 1 0 1 1 0 B )
第9章 常用接口芯片
12
计数器的计数范围和最大计数值
D0位:用于选择计数制(0为二进制、1为BCD)
每个计数器的字长为16位
二进制数的计数范围:0000H ~ FFFFH (4位16进制数)
D0
8
9
CLK0
D1
7
11
GATE0
D2
6
10
OUT0
D3
5
D4
4
15 CLK1
D5
3
14 GATE1
D6
2
13 OUT1
D7
1
RD 22 18 CLK2
WR 23 16 GATE2
A0
19 17 OUT2
A1
20
24
VCC
CS 21 12 GND
第9章 常用接口芯片
5
2. 内部结构
▪计数器:3个16位减1计数器(硬件减法计数器)
即 0 ~ 65535,最大计数值:65536 (0)
计数初值设为0时,对应最大计数值65536
BCD数的计数范围:0000 ~ 9999
(4位十进制数)
谢丽聪老师C语言课件-8函数-2009
8.1概述 8.2函数的分类 8.3函数的定义 8.4函数的调用 8.5形式参数与实际参数 8.6对被调函数的申明 8.7函数的嵌套调用 8.8函数的嵌套调用
8.1 概述
一个C程序由一个主函数和≥0个 其它函数组成函数体允许是空 的或无值类型,或无返回值(void)
结构化程序设计的一个重要特点: 模块化设计,即用一个函数表示 一个模块
{int c ; 没有给形参分配存储单元
数组元素是下标变量,它 与普通变量并无区别。把c=a ; a=b ; Nhomakorabea=c ;
作为实参的数组元素的值
}
传送给形参,实现单向的
X[0] X[1] 值传送。
与上例
73
相同功能
a
b
37
函数调用中发生的数据传送是单向的。即 只能把实参的值传送给形参,而不能把形参 的值反向地传送给实参。因此在函数调用过 程中,形参的值发生改变,而实参中的值不 会变化。 实参
char str(int a);
float f(float b);
main() { …… }
对str函数和f函数预先作了说明
char str(int a)
{ …… }
float f(float b)
{ …… }
4)对库函数的调用不需要再作说明,但必须把该函 数的头文件用include命令包含在源文件前部。
输出: maxmum=80
例3.
计算
Cnr
n!
r!(n r)!
main( )
{ int n , r , cnr ;
实参,必 须赋值
scanf (”%d,%d”,&n , &r ); cnr = f (n)/(f ( r)*f( n-r); printf (”%d\n”,cnr ) ;
8.1 概述
一个C程序由一个主函数和≥0个 其它函数组成函数体允许是空 的或无值类型,或无返回值(void)
结构化程序设计的一个重要特点: 模块化设计,即用一个函数表示 一个模块
{int c ; 没有给形参分配存储单元
数组元素是下标变量,它 与普通变量并无区别。把c=a ; a=b ; Nhomakorabea=c ;
作为实参的数组元素的值
}
传送给形参,实现单向的
X[0] X[1] 值传送。
与上例
73
相同功能
a
b
37
函数调用中发生的数据传送是单向的。即 只能把实参的值传送给形参,而不能把形参 的值反向地传送给实参。因此在函数调用过 程中,形参的值发生改变,而实参中的值不 会变化。 实参
char str(int a);
float f(float b);
main() { …… }
对str函数和f函数预先作了说明
char str(int a)
{ …… }
float f(float b)
{ …… }
4)对库函数的调用不需要再作说明,但必须把该函 数的头文件用include命令包含在源文件前部。
输出: maxmum=80
例3.
计算
Cnr
n!
r!(n r)!
main( )
{ int n , r , cnr ;
实参,必 须赋值
scanf (”%d,%d”,&n , &r ); cnr = f (n)/(f ( r)*f( n-r); printf (”%d\n”,cnr ) ;
09年3月国二C语言课件
3、逻辑运算符和逻辑表达式 (1)逻辑运算符 C语言提供三种逻辑运算符: && 逻辑与(相当于“并且”) || 逻辑或(相当于“或者”) ! 逻辑非(相当于“否定”) 运算规则: &&:当且仅当两个运算量的值都为“真”时,运算结果为 “真”,否则为“假”。 || :当且仅当两个运算量的值都为“假”时,运算结果为 “假”,否则为“真”。 ! :当运算量的值为“真”时,运算结果为“假”;当运算 量的值为“假”时,运算结果为“真”。 例如,假定x=5,则(x>=0) && (x<10)的值为“真”,(x<-1) || (x>5)的值为“假”。
国二C语言培训课件
第三章 顺序结构
输入和输出
为了让计算机处理各种数据,首先就应该把源数据输 入到计算机中;计算机处理结束后,再将目标数据
信息以人能够识别的方式输出。C语言中没有专门的
输入输出语句,而是通过调用库函数来实现。
因此,在使用库函数输入和输出之前,需要使用“文
件包含”预处理命令将标准输入输出头文件
b的值是3,则大于关系运算“>”的结果为“真”,即条件成立; 如果a的值是2,b的值是3,则大于关系运算“>”的结果为“假”,
即条件不成立。
(1)关系运算符
关系运算符的操作数可以是整型、字符型和实型,而结果是
整型(0和1)。 C语言提供6种关系运算符: <(小于), <=(小于或等于), >(大于), >=(大于或等于), ==(等于), !=(不等于) 注意:在C语言中,“等于”关系运算符是双等号“= =”, 而不是单等号“= ”(赋值运算符)。 优先级:
(2)逻辑表达式
所谓逻辑表达式是指,用逻辑运算符将1个或多个表达式连接
谢丽聪老师C语言课件-7数组(1)-2009
3)如给全部元素赋值,则在数组说明中, 可以不给出数组元素的个数。
例如:
int a[5]={1,2,3,4,5}; 可写为:
int a[]={1,2,3,4,5};
例7.4
void main()
定义一个10个元素的整型数组
{int i,max,a[10];
printf("input 10 numbers:\n");
a[9] 9
printf("%d",a[i]); }
运行结果:9876543210
a[8] 8 ……
a[0] 0
例7.3
a[0] 2*0+1=1
void main()
a[1] 2*1+1=3
{ int i,a[10];
a[2] 2*2+1=5
for(i=0;i<10;) a[i++]=2*i+1;
都是合法的数组元素。
数组元素通常也称为下标变量。必须先定义 数组,才能使用下标变量。在C语言中只能 逐个地使用下标变量,而不能一次引用整个 数组。
例如:
输出有10个元素的数组必须使用循环语句逐 个输出各下标变量:
√ for(i=0; i<10; i++) printf("%d",a[i]);
而不能用一个语句输出整个数组。
× 下面的写法是错误的: printf("%d",a);
例7.1
逐一
void main()
赋值
{ int i,a[10];
for(i=0;i<=9;i++)
a[i]=i;
逐一 for(i=9;i>=0;i--)
专升本 C语言课件 C09(12) 常用算法
select_sort(int a[],int n) {int i,j,k,tmp; for(i=0;i<n-1;++i){ k=i; for(j=i+1;j<=n-1;j++) if(a[j]<a[k])k=j; if(k!=i){ tmp=a[k]; a[k]= a[i]; a[i]=tmp;} } } }
m=0 a[i]>a[m] m=i
九 常用算法 9.1 数组的常用算法 将数组中的最大元素与最后一个元 素交换。
m=0 void exch(float a[],int n) { float m,tmp; int i; m=___; for(i=1;i<n;i++) if(____)m=_____; if(______) {tmp=a[n-1]; __________; __________;} } a[i]>a[m] m=i m!=n-1 a[n-1]=a[m] a[m]=tmp
九 常用算法 9.1 数组的常用算法
有一个3×4的矩阵,求其中值最大 的那个元素的值及其下标。 main() { int row,column,i,j; int a[3][4]= {5,9,4,21,6,7,16,2,4,10,12,3}; ______________________ row=column=0; for(i=0;i<3;i++) for(j=0;j<4;j++) if(_______________________) a[i][j]>a[row][column] { row=______; i column=______; j } printf("max=%d,row=%d,column=%d\ n",______________,row,column); a[row][column] }
200912281665
2
9.2
标准文件操作
在 C 语言中,没有输入输出语句,对文件的操作都是由库函数来完成的。 一般来说,标准文件操作有三个步骤: (1 )在使用文件之前要调用 fopen()将文件打开,若打开成功,可得到一个指针, 称 为文件指 针, 利用 它 可 以 继续对文件 进行各 种操 作 ;若 打 开 失败 ,得到一个 空指 针 (NULL) ,对文件的操作终止; (2 )若文件打开成功,可调用各种有关文件读写函数,利用文件指针对文件进行各 种操作; (3 )在对文件的操作完成时,要及时调用 fclose()将文件关闭,以防止数据丢失或 文件的内容遭到破坏。 本节主要介绍文件指针、文件的打开、文件的关闭、文件的读写、文件重定向以及 文件操作的出错检测等。
表 9.1 文件的使用方式
文件使用方式 r(只读)
含义 只读打开一个字符文件,只允许读数据
w(只写) 只写打开或建立一个字符文件,只允许写数据 a(追加) 追加打开一个字符文件,并在文件末尾写数据 rb (只读) 只读打开一个二进制文件,只允许读数据 wb (只写) 只写打开或建立一个二进制文件,只允许写数据 ab(追加) 追加打开一个二进制文件,并在文件末尾写数据 r+(读写) 读写打开一个字符文件,允许读和写 w+(读写) 读写打开或建立一个字符文件,允许读写 a+(读写) 读写打开一个字符文件,允许读,或在文件末追加数据 rb+(读写) 读写打开一个二进制文件,允许读和写 wb+(读写) 读写打开或建立一个二进制文件,允许读和写 ab+(读写) 读写打开一个二进制文件,允许读,或在文件末追加数据 对于文件使用方式有以下几点说明: (1 )凡用“r”打开一个文件时,该文件必须已经存在,且只能从该文件读出;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一,数的分离,素数,随机数,最大最小值: 数的分离,素数,随机数,最大最小值:
(1) 判断一个数是否为素数 素数:只能被 和它本身整除的数 和它本身整除的数. 素数:只能被1和它本身整除的数. 要判断一个正整数m是不是素数, 要判断一个正整数 是不是素数,需要 是不是素数 用大于1且小于它本身的正整数去除它, 用大于1且小于它本身的正整数去除它,只 要它能被其中的一个数整除,就说明它不 要它能被其中的一个数整除,就说明它不 是素数.若所有的数都不能被它整除, 是素数.若所有的数都不能被它整除,说 明它是素数. 明它是素数.
思考
void main() { double sum=1; int i; for(i=1;i<=100;i++) sum=sum*i;
求n!=1 × 2 × 3 × …n
累乘器赋初值 整数连乘结果一 定是整数, 定是整数,而本 例中结果数值相 当大, long型 当大,用long型 都无法存放, 都无法存放,因 此将存放累乘结 果的变量s 果的变量s定义为 double型 double型.
for i=100 to 999
a=i/100 b=i/10%10 c=i%10 i =a3+b3+c3 Y
输出水仙花数 i
N
printf("%d } }
",i);
用数的分离方法求解例4.32的水仙花数. 用数的分离方法求解例4.32的水仙花数. 的水仙花数 void main() {int i,j,k,num; for(num=100;num<=999;num++) {i=num/100; /*分离出百位数*/ /*分离出百位数 分离出百位数* j=num/10j=num/10-i*10; /*分离出十位数*/ /*分离出十位数 分离出十位数* k=num%10; /*分离出个位数*/ /*分离出个位数 分离出个位数* if(num==i*i*i+j*j*j+k*k*k) printf("%4d",num); } printf("\ printf("\n"); }
习题6.6 习题6.6
main()
求水仙花数, 求水仙花数,如:153=13+53+33
{ 对100~999的每个数进行处理 int i,a,b,c; 100~999的每个数进行处理
判断: 判断: for(i=100;i<=999;i++) { 分别取出这个数的个位数*/ 分别取出这个数的个位数, a=i/100; /*取出百位数 , /*取出百位数 取出百位数* 十位数,百位数; 十位数,百位数; b=i/10%10; /*取出十位数*/ /*取出十位数 取出十位数* 判断这个数是否等于其个位 十位数,百位数的立方和 百位数的立方和; 数,十位数,/*取出各位数*/ ; c=i%10; /*取出各位数 取出各位数* 如果是,说明这个数是水仙 如果是, if(i==a*a*a+b*b*b+c*c*c) 花数,就输出这个数. 花数,就输出这个数.
水仙花数:是一个三位数,其各位数字的立方和 水仙花数:是一个三位数, 等于该数本身. 等于该数本身.如:153=13+53+33 完数:一个数等于它的所有因子(不包括它本身) 完数:一个数等于它的所有因子(不包括它本身) 之和. 之和.如:6=1+2+3 同构数:一个数等于它的平方数的右端.如5的平 同构数:一个数等于它的平方数的右端. 的平 方是25 方是 最大公约数: 最大公约数:使用辗转相除法进行求解
for(i=0;i<20;i++) { for(k=2;k<a[i];k++) if(a[i]%k==0) break; if(k==a[i]) { b[j]=a[i]; j++; } }
从a数组中找出其中 的素数放在b 的素数放在b数组中
for(i=0;i<j;i++) 输出b 输出b数组中的 printf("%4d",b[i]); 各个元素 printf("\n"); max=a[0]; min=a[0]; 求出a 求出a数组中的 for(i=1;i<20;i++) { if(a[i]>max) max=a[i]; 最大值与最小值 if(a[i]<min) min=a[i]; } printf("max=%4d,min=%4d\n",max,min); }
(2) 随机数 函数random(int num)用于产生 用于产生[0,num)区间 函数random(int num)用于产生 区间 的一个整数. 的一个整数. 其包含在"stdlib.h"头文件中 其包含在"stdlib.h"头文件中 为了使每一次运行都产生一组新的随机数, 为了使每一次运行都产生一组新的随机数, 可以使用randomize()函数 函数是每次均均产生不同的随 机数.其包含在头文件"time.h"中 机数.其包含在头文件"time.h"中 (3) 最大值与最小值 我们需要将最大值(或最小值) 我们需要将最大值(或最小值)保存在一个 将最大值 变量中(假设设变量名为max和min),变量的初 变量中(假设设变量名为 和 ) 变量的初 我们一般设为数列中的第一个值 数列中的第一个值. 值我们一般设为数列中的第一个值.
k为整数 3数都必须大于0 数都必须大于0
百钱买百鸡解法二
main() {int x,y,z; x,y,z; printf("\n"); printf("\n"); for(x=1 x<=100; for(x=1;x<=100;x++) for(y=1 y<=100; for(y=1;y<=100;y++) for(z=1 z<=100; for(z=1;z<=100;z++) if(x+y+z==100&&15*x+9*y+z==300&&z if(x+y+z==100&&15*x+9*y+z==300&&z %3==0) ==0 printf("% printf("%3d%3d%3d",x,y,z); d",x,y,z); }
3, 循环初值: 循环初值:
设为0, 设为 ,设为第一项 注意双重循环设初值的位置
习题6.3 习题6.3
main() { int i,n,a;
s=a+aa+aaa+… 求:s=a+aa+aaa+…
s=0,t=0 输入a,n 输入 ,
a=2
unsigned long s=0,t=0;
printf("please input a,n:\n"); n=3 scanf("%d,%d",&a,&n); for(i=1;i<=n;i++) { t=t+a; a=a*10; s=s+t; }
例:给出一个不多于4位的正整数,要求:求出它 给出一个不多于4位的正整数,要求: 是几位数, 是几位数,并且按逆序打印出各位数字 main() { int i,j,k=0; scanf("%d",&i); i!=0 while(i!=0) { printf("%4d",i%10); i 10 i=i/10; k++; } printf("\nk=%d\n",k); }
用穷举法求出所有水仙花数. 用穷举法求出所有水仙花数. void main() {int i,j,k,m1,m2; printf("narcissus numbers are:"); for(i=1;i<=9;i++) for(j=0;j<=9;j++) for(k=0;k<=9;k++) {m1=i*100+j*10+k; m2=i*i*i+j*j*j+k*k*k; if(m1==m2)printf("%4d",m1);} printf("\ printf("\n"); }
t=222 t=22 t=2 a=2000 a=200 a=20 s=2+22+222 s=2+22 s=2
for i=1 to n
t=t+a a=a*10 s=s+t 输出s 输出s的值
printf("s=a+aa+aaa+…=%ld\n",s); } 输入: 输入:2,3 ↙ 输出:s=a+aa+aaa+ =246 输出:s=a+aa+aaa+…=246
二,求累加,连乘的算法: 求累加,连乘的算法:
1,循环条件
次数控制(加多少项n,20,100) 次数控制(加多少项 用误差控制(直到某一项小于或大于一个数) 用误差控制(直到某一项小于或大于一个数) 使用终止标记
2,循环体
求和 求每一项:从前一项求出后一项, 求每一项:从前一项求出后一项,单独求每一项 为下一项作准备
求累乘积. 求累乘积.
...× 如:1×2×3×...×100
属于"累乘器"类型问题. 属于"累乘器"类型问题.
基本方法: 基本方法
(1)给累乘器赋初值,一般为1; 给累乘器赋初值,一般为1 用循环语句实现累乘; (2)用循环语句实现累乘; for(循环变量赋初值;循环条件;循环变量改变规律) for(循环变量赋初值;循环条件;循环变量改变规律) 循环体设计. (3)循环体设计. 累乘器当前值=累乘器原值*循环变量当前值; 累乘器当前值=累乘器原值*循环变量当前值;
(1) 判断一个数是否为素数 素数:只能被 和它本身整除的数 和它本身整除的数. 素数:只能被1和它本身整除的数. 要判断一个正整数m是不是素数, 要判断一个正整数 是不是素数,需要 是不是素数 用大于1且小于它本身的正整数去除它, 用大于1且小于它本身的正整数去除它,只 要它能被其中的一个数整除,就说明它不 要它能被其中的一个数整除,就说明它不 是素数.若所有的数都不能被它整除, 是素数.若所有的数都不能被它整除,说 明它是素数. 明它是素数.
思考
void main() { double sum=1; int i; for(i=1;i<=100;i++) sum=sum*i;
求n!=1 × 2 × 3 × …n
累乘器赋初值 整数连乘结果一 定是整数, 定是整数,而本 例中结果数值相 当大, long型 当大,用long型 都无法存放, 都无法存放,因 此将存放累乘结 果的变量s 果的变量s定义为 double型 double型.
for i=100 to 999
a=i/100 b=i/10%10 c=i%10 i =a3+b3+c3 Y
输出水仙花数 i
N
printf("%d } }
",i);
用数的分离方法求解例4.32的水仙花数. 用数的分离方法求解例4.32的水仙花数. 的水仙花数 void main() {int i,j,k,num; for(num=100;num<=999;num++) {i=num/100; /*分离出百位数*/ /*分离出百位数 分离出百位数* j=num/10j=num/10-i*10; /*分离出十位数*/ /*分离出十位数 分离出十位数* k=num%10; /*分离出个位数*/ /*分离出个位数 分离出个位数* if(num==i*i*i+j*j*j+k*k*k) printf("%4d",num); } printf("\ printf("\n"); }
习题6.6 习题6.6
main()
求水仙花数, 求水仙花数,如:153=13+53+33
{ 对100~999的每个数进行处理 int i,a,b,c; 100~999的每个数进行处理
判断: 判断: for(i=100;i<=999;i++) { 分别取出这个数的个位数*/ 分别取出这个数的个位数, a=i/100; /*取出百位数 , /*取出百位数 取出百位数* 十位数,百位数; 十位数,百位数; b=i/10%10; /*取出十位数*/ /*取出十位数 取出十位数* 判断这个数是否等于其个位 十位数,百位数的立方和 百位数的立方和; 数,十位数,/*取出各位数*/ ; c=i%10; /*取出各位数 取出各位数* 如果是,说明这个数是水仙 如果是, if(i==a*a*a+b*b*b+c*c*c) 花数,就输出这个数. 花数,就输出这个数.
水仙花数:是一个三位数,其各位数字的立方和 水仙花数:是一个三位数, 等于该数本身. 等于该数本身.如:153=13+53+33 完数:一个数等于它的所有因子(不包括它本身) 完数:一个数等于它的所有因子(不包括它本身) 之和. 之和.如:6=1+2+3 同构数:一个数等于它的平方数的右端.如5的平 同构数:一个数等于它的平方数的右端. 的平 方是25 方是 最大公约数: 最大公约数:使用辗转相除法进行求解
for(i=0;i<20;i++) { for(k=2;k<a[i];k++) if(a[i]%k==0) break; if(k==a[i]) { b[j]=a[i]; j++; } }
从a数组中找出其中 的素数放在b 的素数放在b数组中
for(i=0;i<j;i++) 输出b 输出b数组中的 printf("%4d",b[i]); 各个元素 printf("\n"); max=a[0]; min=a[0]; 求出a 求出a数组中的 for(i=1;i<20;i++) { if(a[i]>max) max=a[i]; 最大值与最小值 if(a[i]<min) min=a[i]; } printf("max=%4d,min=%4d\n",max,min); }
(2) 随机数 函数random(int num)用于产生 用于产生[0,num)区间 函数random(int num)用于产生 区间 的一个整数. 的一个整数. 其包含在"stdlib.h"头文件中 其包含在"stdlib.h"头文件中 为了使每一次运行都产生一组新的随机数, 为了使每一次运行都产生一组新的随机数, 可以使用randomize()函数 函数是每次均均产生不同的随 机数.其包含在头文件"time.h"中 机数.其包含在头文件"time.h"中 (3) 最大值与最小值 我们需要将最大值(或最小值) 我们需要将最大值(或最小值)保存在一个 将最大值 变量中(假设设变量名为max和min),变量的初 变量中(假设设变量名为 和 ) 变量的初 我们一般设为数列中的第一个值 数列中的第一个值. 值我们一般设为数列中的第一个值.
k为整数 3数都必须大于0 数都必须大于0
百钱买百鸡解法二
main() {int x,y,z; x,y,z; printf("\n"); printf("\n"); for(x=1 x<=100; for(x=1;x<=100;x++) for(y=1 y<=100; for(y=1;y<=100;y++) for(z=1 z<=100; for(z=1;z<=100;z++) if(x+y+z==100&&15*x+9*y+z==300&&z if(x+y+z==100&&15*x+9*y+z==300&&z %3==0) ==0 printf("% printf("%3d%3d%3d",x,y,z); d",x,y,z); }
3, 循环初值: 循环初值:
设为0, 设为 ,设为第一项 注意双重循环设初值的位置
习题6.3 习题6.3
main() { int i,n,a;
s=a+aa+aaa+… 求:s=a+aa+aaa+…
s=0,t=0 输入a,n 输入 ,
a=2
unsigned long s=0,t=0;
printf("please input a,n:\n"); n=3 scanf("%d,%d",&a,&n); for(i=1;i<=n;i++) { t=t+a; a=a*10; s=s+t; }
例:给出一个不多于4位的正整数,要求:求出它 给出一个不多于4位的正整数,要求: 是几位数, 是几位数,并且按逆序打印出各位数字 main() { int i,j,k=0; scanf("%d",&i); i!=0 while(i!=0) { printf("%4d",i%10); i 10 i=i/10; k++; } printf("\nk=%d\n",k); }
用穷举法求出所有水仙花数. 用穷举法求出所有水仙花数. void main() {int i,j,k,m1,m2; printf("narcissus numbers are:"); for(i=1;i<=9;i++) for(j=0;j<=9;j++) for(k=0;k<=9;k++) {m1=i*100+j*10+k; m2=i*i*i+j*j*j+k*k*k; if(m1==m2)printf("%4d",m1);} printf("\ printf("\n"); }
t=222 t=22 t=2 a=2000 a=200 a=20 s=2+22+222 s=2+22 s=2
for i=1 to n
t=t+a a=a*10 s=s+t 输出s 输出s的值
printf("s=a+aa+aaa+…=%ld\n",s); } 输入: 输入:2,3 ↙ 输出:s=a+aa+aaa+ =246 输出:s=a+aa+aaa+…=246
二,求累加,连乘的算法: 求累加,连乘的算法:
1,循环条件
次数控制(加多少项n,20,100) 次数控制(加多少项 用误差控制(直到某一项小于或大于一个数) 用误差控制(直到某一项小于或大于一个数) 使用终止标记
2,循环体
求和 求每一项:从前一项求出后一项, 求每一项:从前一项求出后一项,单独求每一项 为下一项作准备
求累乘积. 求累乘积.
...× 如:1×2×3×...×100
属于"累乘器"类型问题. 属于"累乘器"类型问题.
基本方法: 基本方法
(1)给累乘器赋初值,一般为1; 给累乘器赋初值,一般为1 用循环语句实现累乘; (2)用循环语句实现累乘; for(循环变量赋初值;循环条件;循环变量改变规律) for(循环变量赋初值;循环条件;循环变量改变规律) 循环体设计. (3)循环体设计. 累乘器当前值=累乘器原值*循环变量当前值; 累乘器当前值=累乘器原值*循环变量当前值;