
例1:求main( )
{ int i, sum;
for (sum=0, i=1; i<=100; i++)
sum=sum+i ;
printf("1+2+3+…+100=%d \\n
1+2+3+…+100=5050∑=100
1n n
main()
{int i,fact;
for(fact=1,i=1;i<=5;i++)
{fact=fact*i;
printf("\%d!=%d\\n
}
}
1!=1(每次循环都进行输出))
2!=2
3!=6
4!=24
5!=120例3: 计算某班32位学生某门课的平均成绩,并输出最高分、最低分。
main()
{int i,score,max=0,min=100;
float sum=0;
for(i=1;i<=32;i++)
{scanf("%d
sum=sum+score;
if(score>max)max=score;
if(score } i: 11*1=1 22*1=22*2=4 33*1=33*2=63*3=9 44*1=44*2=84*3=124*4=16 ┇┇ ┇┇ 99*1=99*2=1*3=27……9*9=81 j1239 被乘数i取值1~9;i每取一值,乘数j取值1~imain() {int i,j,k; for(i=1;i<=9;i++) {for(j=1;j<=i;j++) {k=i*j; printf("%d*%d=%-4d } printf(“\\n”); } getch();/*加getch();每行暂停*/ } 例5:输入5个最多8位的正整数,将各数按位颠倒输出。 main( ) { int i; long n, d; for(i=1; i<=5; i++) { printf(“Enter a data(1-99999999):”); scanf(“%ld”, &n); while(n!=0) { d=n%10; printf(“%d”, d); n=n/10;} } } 半径的范围控制——r:1~10 附加控制——area>100 main() { int r; float area; for(r=1; r<=10; r++) { area=3.141592*r*r; if(area>100) break; printf(“r=%d,area=%-7.2f\\n”, r, area); } } main() { int n, c=0; printf(“\\n”); for(n=100; n<=200; n++) { if(n%3==0) continue; printf(“%d”, n); c++; printf(“%s”, c%10==0? ”\\n” : ” ”); } } 算法1:(穷举法) 1)找出m、n中的较小者 t; 最大公约数肯定在t、t-1、t-2、…1之间; 2) 测试m%i和n%i是否同时为0 ; 除数i依次取t、t-1、t-2 … 1 ; 测试条件成立时的i值即为最大公约数; 3) 最小公倍数:m×n/最大公约数;main( ) { int m, n, t, i; printf(“Enter m,n:”); scanf(“%d,%d”, &m, &n); t=m if (m%i==0&&n%i==0) break; printf(“GCD=%d,SCM=%d\\n”, i, m*n/i); } 18,12↙17,3↙ GCD=6,SCM=36 GCD=1,SCM=51算法2:(辗转相除法) main( ) { int a, b, m, n, r, t; printf(“Enter a, b:”); scanf(“%d,%d”, &a, &b); m=a, n=b; /*产生a、b副本*/ if(m while(r!=0) { m=n; n=r; r=m%n; } printf(“GCD=%d,SCM=%d”, n, a*b/n); } 输入a、b a ⇒m, b ⇒n T F Øm⇔n 求m%n ⇒r r!=0? n ⇒m r ⇒n m%n ⇒r 输出n、a*b/n m>n? 例9:判断m是否素数 素数:除1和它本身之外再无别的约数; 算法:判断m%i==0成立否? (int) i取值: 2~(m-1) 或:2~m #include"math.h" main() {int m,i,k; printf("\Enter m:");scanf("%d k=sqrt(m); for(i=2;i<=k;i++) if(m%i==0)break; if(i>k)printf("%d is a prime number.\\n else printf("%d is not prime number.\\n 算法:外循环控制m取100 ~200之间的奇数。 #include"math.h" main() {int m,i,k,c=0;printf("\\n"); 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)/*i>k成立表示未出现约数*/ {printf("%-6d c++; if(c%10==0)printf("\\n");} } } 例11:用公式求π的近似值,直到最后一项的绝对值小于10-4 为止。考虑问题: 1) 需循环累加,但累加项数不确定; 2) 有规律的量 分母n 的取值:1、3、5、7 … 奇偶项符号s 的变化:+、-、+、- 3) 循环条件:fabs(t)>=10-4循环,t 为某项值。 ...7 1513114+-+-≈π main() {int s; float n,t,pi; n=1.0;s=1;t=1./n;pi=0; while(fabs(t)>=1e-4)/*判断某项*/ {pi=pi+t;/*累加和*/ n=n+2.0;/*改变分母*/ s=-s;/*符号变反*/ t=s/n;}/*计算下一项*/ printf("PI=%10.6f\\n getch(); } 1,1,2,3,5,8,13,21 … 考虑问题: 1) 属递推问题:从前一项或几项推出下一项结果; 2) 定义两个变量: f1=f2=1; f1=f1+f2; f2=f2+f1; 由前两项相加求得下一项后第一项可覆盖,即变量的值是不断更迭的(迭代法)。 main() {long f1,f2,i; f1=f2=1; for(i=1;i<=20;i++) {printf("%12ld%12ld if(i%2==0)printf("\\n");/*每行4项*/ f1=f1+f2;/*一次递推两项*/ f2=f2+f1; } getch(); } 例13:输入一个数,输出其因子连乘表达式main( ) { int n, f, i=2; printf (“Input an integer n:”); scanf (“%d”, &n); f=n; printf (“%d=1”, n); do { if ( f%i==0) { f=f/i; printf ( “*%d”, i ); } else i++; } while( i<=n ); printf (“\\n”); } 例14:用字符’*’打印出钻石图案 分析:将上半三角、下半三角分别处理,找出行 数、空格数、星号数之间的关系; 前四行:行空格星号1 3 1 2 2 33 1 54 0 7规律:i 4–i i ×2–1后三行:1 1 52 2 33 3 1 规律:i i 7–i ×2 * * * * * * * * * * * * * * * * * * * * * * * * * {int i,j; for(i=1;i<=4;i++) {for(j=4-i;j>0;j--)printf(””); for(j=i*2-1;j>0;j--)printf(”*”); printf(”\\n”); } for(i=1;i<=3;i++) {for(j=i;j>0;j--)printf(””); for(j=7-i*2;j>0;j--)printf(”*”); printf(”\\n”); } } main( ) { int i, l, n, s, all; char str[80], t; l=n=s=all=0; gets(str); for(i=0; (t=str[i])!='\\0';i++) /*t:提高效率*/ { if(t>='A'&&t<='Z'||t>='a'&&t<='z')l++; else if(t>='0'&&t<='9')n++; else if(t==' ')s++; all++; } printf("l=%d,n=%d,s=%d,all=%d\\n } int a[100], i; for( i=0; i<100; i++) a[i]=i+1; /*生成数组*/ for(i=0; i<100; i++) { if( i%10==0) printf(“\\n”); /*换行控制*/ printf(”%-5d”, a[i]); } for(i=99; i>=0; i--) printf(”%d,”, a[i]); for(i=1; i<=99; i=i+2) printf(”%5d”, a[i]);例17:编写函数,用冒泡法对数组从小到大排序main() { int x[10], i; void sort( int a[], int n ) for(i=0; i < 10; i++) scanf("%d sort( x, 10); for(i = 0; i < 10; i++) printf("%d printf( "\\n" ); } void swap( int *p1, int *p2 ) { int t; t = *p1; *p1 = *p2; *p2 = t; } void sort( int a[], int n ) { int i, j; for(i=0; i < n-1; i++) for(j= 0; j < n-1-i; j++) if (a[j] > a[j+1]) swap(&a[j],&a[j+1]); }例18:用选择法对一数列按降序排序(由大到小) #define N5 main() {int a[N],i,j,p,t; for(i=0;i
