例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 for(i=0;i for(j=i+1;j if(p!=i){t=a[i];a[i]=a[p];a[p]=t;} } ┇/*输出*/ } main() {int a[N]={2,3,5,6,12,15,23,46,50,100}; int num,low,high,mid,mark=-1; printf("Enter check number:"); scanf("%d low=0;high=N-1; ┇┇ low=0; high=N-1; while(low<=high) { mid=(high+low)/2;/*计算中间位置*/ if(num==a[mid]){ mark=1; break;} else if(numelse low=mid+1; } if(mark==1) printf("%d found in %d\\n } 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1#define N10 main() {static int a[N][N],i,j; for(i=0;i for(i=2;i for(i=0;i printf("\\n"); } } 例21:输入一行字符,判断其是否对称,是则输出Yes,否则输出No。 #include main() { char a[80];int n, i; gets( a ); n = strlen(a) ; for ( i = 0; i < n/2; i++ ) if ( a[i] != a[n-1-i] ) break; if ( i < n/2) printf( "No\\n" ); else printf( "Yes\\n" ); } #include "stdio.h" main( ) { static char str[80]; int i, len, scol; printf("Please input a character string:"); gets(str); len=strlen(str); /*测试有效长*/ scol=(80-len)/2;/*计算起始列*/ for(i=1; i<=scol; i++) putchar(' '); puts(str); } 数学表达:C语言表达: 阶乘 1 fac(int n) n!=< { if(n==1) return 1; n*(n-1)! else return n*fac(n-1); } 连加 1 sum(int n) s n=< { if(n==1) return 1; n+s n-1 else return n+sum(n-1); }例:求字符串长度 int my_strlen(char *str) { if(*str==…\\0‟) return 0; else return (1+my_strlen(str+1)); } 例:求N 层嵌套平方根 double y(double x, int n) { if(n==0) return 0; else return (sqrt(x+y(x, n-1)); }例23:编写函数,在一个已从小到大排序的数组中查找一个指定的数,如果找到,返回指向数组中该数的指针,否则返回空指针。 int *find(int *a, int n, int data) /* 数组a长度n待查数data */ { int *p=a, *q=a+n, *r; while ( p < q ) /* 待查找区不为空时*/ { r = p + (q-p)/2;/* 待查找区的中点位置*/ if ( *r==data ) return r; /* 如找到,返回该指针*/ else if ( *r < data ) p = r + 1;/* 比中点大,在后半区*/ else q = r;/* 比中点小,在前半区*/ } return NULL; /* 没找到,返回空指针*/ }main() { int x[]={11,22,33,44,55,66,77,88,99,100}, d, *p; scanf( "%d printf( "Not Found.\\n" ); /* 没找到*/ } 例24编写通用的函数,可根据需要建立任意节点数的链表。struct student*creat()/*无参有返回值*/ {struct student*head=NULL,*p1,*p2; int len;long n;float s; len=sizeof(struct student); while(1)/*循环次数不确定*/ {printf("Enter number,score:"); scanf("%ld,%f if(n==0)break;/*输入0表示数据结束*/ p1=(struct student*)malloc(len); ┇} return(head);}┇ while(1) {printf("Enter number,score:"); scanf("%ld,%f if(n==0)break;/*以0表示数据结束*/ p1=(struct student*)malloc(len); p1->num=n;p1->score=s;/*转存入节点*/ if(head==NULL) head=p2=p1; else { p2->next=p1; p2=p1; } } p2->next=NULL; /*末尾链节成员赋空*/ return(head); /*返回链表头指针*/ } /*creat*//*输出各节点*/ void plink(struct student*head) {struct stduent*p; int i; for(i=1;i<=N;i++) {if(i==1)p=head; else p=p->next; printf("%d:num=%ld,score=%5.2f\\n i,p->num,p->score); } return; } p=head; while(p!=NULL) { printf("num=%ld, score=%5.2f\\n p->num, p->score); p=p->next; } return; } 注:本形式的链表输出函数具有通用性,可适应由于删除或插入节点引起的链表长度的变化。 例25 删除指定的节点 struct student *del(struct student *head, long n) {struct student*p1,*p2;/*↑n:要删除学号*/ p1=head; if(p1->num==n)head=p1->next;/*删除首节点*/ else {do{p2=p1;p1=p1->next; }while(p1!=NULL&&p1->num!=n); if(p1->num==n)p2->next=p1->next;/*找到*/ else printf("Not be found!\\n");/*未找到*/ } free(p1);/*释放被删除节点的存储区*/ return(head);/*返回头指针*/ }例26 在链表中插入节点的函数: struct student*insert(struct student*head) {struct student*p0,*p1,*p2; long n;int len; len=sizeof(struct student); p0=(struct student*)malloc(len);/*申请新节点*/ printf("Enter num,score to insert:"); scanf("%ld,%f n=p0->num;/*产生学号副本n*/ p1=head;/*从首节点开始查找*/┇ ┇ p1=head;/*↓插入在头部*/ if(n else { do /*查找插入位置*/ { p2=p1; p1=p1->next; } while(p1!=NULL && n>p1->num); p0->next=p2->next; /*插入在其余位置*/ p2->next=p0; } return(head); } /*insert*/下载本文