1、自增、自减运算符,自增、自减运算符的作用是使变量的值增1或减1 自增运算符:+ i+ 等价于 i = i + 1 或 i += 1 +i 等价于 i = i + 1 或 i += 1 自减运算符:-,6,4,自增、自减运算符的使用,自增、自减运算符的使用 例如:若i的值为1 表达式“j = +i”的值是什么? 表达式“j = i+”的值是什么?,自增、自减运算符的使用,a+ * b 得 6,3,a,自增、自减运算符的使用 例如:int a=3,b=2,c; 执行“c = +a * b”之后a、b、c的值? 执行“c = a+ * b”之后a、b、c的值?,2,b,c,+a * b 得 8,自增
2、、自减运算符的副作用,表达式中过度使用自增、自减运算符会带来副作用,容易产生歧义 例如:若i的值为1,j的值为2,表达式“i+j”的值是什么? 例如:若i的初值为1,i+i+i+等于多少?,处理循环计算需要明确的三个问题: 循环体:哪些运算(动作)是需要重复进行的。 循环条件:重复这些运算的条件是什么,即在什么情况下终止/继续这个重复的过程。 循环准备:在进行重复的运算处理之前,需要进行的初始处理是什么。 剩下的问题就是选用合适的语句表达一个循环计算过程了,循环计算过程的要点,阅读程序,加密:将消息中每个字母变成其后的第四个字母,即A变成E,a变成e,最后的W变成A,X变成B。,#includ
3、e main( ) char c;while ( (c = getchar( ) != n )if ( (c = a ,阅读程序1,#include #include main( ) int i, n = 1;for( i = 1; i =20; i+ ) n = n * i;printf(“%dn”,n);system(“pause”); ,TC2.0,阅读程序2,#include #include main() float a, x1, x2;printf(“input value for a:“);scanf(“%f“, ,TC2.0,百钱百鸡问题,中国古代数学家张丘建在他的算经中曾提出
4、著名的“百钱百鸡问题”,其题目如下: 鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,翁、母、雏各几何?,百钱百鸡问题,解:设i、j、k分别代表公鸡、母鸡、小鸡的数量,根据题意列方程:,根据题意可知,i、j、k的范围一定是0到100的正整数,那么,最简单的解题方法是:穷举i、j、k每一种可能的取值组合,直接代入方程组,若满足该方程组则是一组解。这样即可得到问题的全部解。,百钱百鸡问题,i 0,i 20?,买母鸡和 小鸡,开始,结束,i i + 1,i = 0; while (i 20 ) i+; , int i, j, k; /*i、j、k分别表示公鸡、母鸡和小鸡的数目*/ ,j
5、= 0; while (j 34) j+; ,k = 0; while ( k 100) if ( i + j + k = 100 ,百钱百鸡问题-1,for(i = 0; i 20; i+ ) /*设定公鸡的数目*/ ,int main( ) int i, j, k; /*i、j、k分别表示公鸡、母鸡和小鸡的数目*/ return 0; ,for(j = 0; j 34; j+) /*设定母鸡的数目*/ ,for(k = 0; k 100; k+) /*设定小鸡的数目*/ if ( i + j + k = 100 ,百钱百鸡问题(for),for(i = 0; i 20; i+ ) /*设定
6、公鸡的数目*/ ,int main( ) int i, j, k; /*i、j、k分别表示公鸡、母鸡和小鸡的数目*/ return 0; ,for(j = 0; j 34; j+) /*设定母鸡的数目*/ ,k = 100 i j ; if (i*15 + j*9 + k = 300)printf(“%d %d %dn“,i,j,k);,百钱百鸡问题(for续),整数的位数,给一个不多于五位数的正整数,要求: 求出它是几位数 分别打印出每一位数 按逆序打印出各位数字,整数的位数(续),用if语句求整数x的位数,if ( x 9999) digits = 5; else if ( x 999 )
7、digits = 4;else if ( x 99 )digits = 3;else if ( x 9 )digits = 2;else digits = 1;,整数的位数(续),求整数x的各位数字,one = x % 10; /*求x的个位数字*/ ten = (x / 10) % 10; /*求x的十位数字*/ hund = (x / 100) % 10; /*求x的百位数字*/ thou = ( x / 1000) % 10; /*求x的千位数字*/ ten_thou = (x / 10000) % 10; /*求x的万位数字*/,整数的位数(循环语句),用循环语句求正整数x的位数,k
8、= 0; /*k用于记录x的位数*/ do x = x / 10;+k; while (x 0);,注意: 当循环结束的时候,x的值等于0。,k = 1; /*k用于记录x的位数*/ while (x 9) x = x / 10;+k; ,整数逆序输出,逆序输出正整数x的各位数字,k = 0; /* k用于记录x的位数*/ do printf(“%d“, x % 10); x = x / 10;+k; while (x 0);,k = 0; /* k用于记录x的位数*/ y = 0; /*用于保存x的逆置值*/ do y = y * 10 + x % 10; x = x / 10;+k; wh
9、ile (x 0); printf(“%d“,y);,另一个例子,若有下述计算关系,试编写程序求数字A、B、C、D的值。,int A=1, B, C, D;for(B=0; B=9; B+)for(C=0; C=9; C+)for(D=0; D=9;D+)if (A*1000+B*100+C*10+D)*9 =(D*1000+C*100+B*10+A)printf(“%d%d%d%d”,A,B,C,D);,十进制整数转换为二进制整数,给定一个十进制整数n,编写程序计算其二进制表示形式并输出。,(43)10 ?,被除数,除数,商,余数,43,2,21,1,被除数,除数,商,余数,21,43,2,
10、21,1,2,10,1,被除数,除数,商,余数,21,43,2,21,1,2,10,1,10,2,5,0,被除数,除数,商,余数,21,43,2,21,1,2,10,1,10,2,5,0,5,2,2,1,被除数,除数,商,余数,21,43,2,21,1,2,10,1,10,2,5,0,5,2,2,1,2,2,1,0,被除数,除数,商,余数,21,43,2,21,1,2,10,1,10,2,5,0,5,2,2,1,2,2,1,0,1,2,0,1,被除数,除数,商,余数,21,43,2,21,1,2,10,1,10,2,5,0,5,2,2,1,2,2,1,0,1,2,0,1,0,被除数,除数,商,
11、余数,21,43,2,21,1,2,10,1,10,2,5,0,5,2,2,1,2,2,1,0,1,2,0,1,0,十进制整数转换为二进制整数,给定一个十进制整数n,编写程序计算其二进制表示形式并输出。,(43)10 (101011)2,/*十进制数n转换为二进制数输出*/ while (n != 0) printf(“%d“, n % 2); n = n / 2; ,换零钱,已知有10元、5元、2元、1元等零币,现需将一张100元大钞换零,问: 有几种换法? 如何换?,换零钱(续),解:设i、j、k、l分别代表100元零钞中10元、5元、2元、1元币的数量,根据题意列方程:,根据题意可知,i
12、、j、k、l的范围分别为:010、020、050、0100,那么,最简单的解题方法是:穷举i、j、k、l每一种可能的取值组合,直接代入方程,若满足该方程则是一个解。这样即可得到问题的全部解。,for(i = 0; i = 10; i+ ) ,main( ) int i, j, k, l; /*i、j、k、l分别表示10元、5元、2元、1元币的数目*/ ,for(j = 0; j = 20; j+) ,for(k = 0; k = 50; k+) ,换零钱(续),for(l = 0; l = 100; l+) if ( 10*i + 5*j +2*k + l = 100) printf(“%d
13、%d %d %dn“,i, j, k, l); ,for(i = 0; i = 10; i+ ),main( ) int i, j, k, l; long count = 0;,for(j = 0; j = 20; j+),for(k = 0; k = 50; k+),换零钱(续),for(l = 0; l = 100; l+) if ( 10*i + 5*j +2*k + l = 100) printf(“%d %d %d %dn“,i, j, k, l);count+;,完数,一个数如果恰好等于它的因子之和,则称其为完数。编写程序找出1000之内的所有完数。例如,6是完数(6 = 1 +
14、2 + 3)。,对21000内的每个整数n,找出其所有因子(不包括自身),并求其因子之和。,查找正整数n的所有因子之和,for(n = 2; n 1000; n+ ) ,/*计算正整数n的所有因子之和*/ s = 0; for(k = 1; k = n / 2 ; k+)if ( n % k = 0) s += k;,if ( s = n) printf(“%d is a perfect number.n“,n);,重新查找正整数n的所有因子,for(n = 2; n 1000; n+ ) ,s = 0; /*计算正整数n的所有因子之和*/ for(k = 1; k = n / 2 ; k+)
15、if ( n % k = 0) s += k;,if ( s = n) printf(“%d Its factors are “,n);for(k = 1; k = n /2; k+) /*输出n的所有因子*/if (n % k = 0) printf(“%d,“, k);printf(“%c n“, 8); ,从键盘输入一个字符序列,若其中包含有数字,则将其按照权位降低的次序转换为数值输出。例如,从输入的串 dsf6%2?0d.43s中提取出数值62043。,练习1:从字符序列中取数,62043 = 6*104 + 2*103 + 0*102 + 4*101 + 3= (0*10 + 6 )
16、*10 + 2)*10 + 0)*10 + 4)*10 + 3,从字符序列中取数,double k;char ch;,k = 0; ch = getchar(); while (ch != n) if ( ch = 0 ,从字符序列中取数,double k; char ch;printf(“input characters:n“);k = 0; ch = getchar();while (ch != n) if ( ch = 0 ,while (ch = getchar() != n) if ( ch = 0 /*end of if */ /*end of while */,练习2:求自然对数
17、底的近似值,求自然对数底的近似值,当 时,把等号右端的和作为e的近似值,其公式为:,编制程序,利用下式计算ucosx的近似值,直到最后一项的绝对值小于10-6.,练习3:求余弦函数,double u, x, cosx;int n;printf(“input value for x(double):“);scanf(“%lf“,cosx = 1; n = 1; u = 1;while (fabs(u)1.0e-6)u = u*x*x / (2*n*(2*n-1);u = -u;cosx = cosx + u;printf(“%5d%30.10lf%20.10lfn“,n,u,cosx); n =
18、 n + 1;printf(“n“);printf(“user:cos%.4lf=%.10lfn“, x, cosx);printf(“ sys:cos(%.4lf)=%.10lfn“, x, cos(x);,x1 = x;x = x - (int)(x / (2*PI)*2*PI; cosx = 1; n = 1; u = 1;while (fabs(u)1.0e-6)u = u*x*x / (2*n*(2*n-1);u = -u;cosx = cosx + u;printf(“%5d%30.10lf%20.10lfn“,n,u,cosx); n = n + 1;printf(“n“);printf(“user:cos%.4lf=%.10lfn“, x1, cosx);printf(“ sys:cos(%.4lf)=%.10lfn“, x1, cos(x1);,