视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
C语言典型例题答案详解解
2025-10-04 08:50:55 责编:小OO
文档
典型例题

例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(scoreprintf("max=%d,min=%d\\n

}

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=mfor(i=t; i>=1; i--)

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(mr=m%n;

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;iscanf("%d,

for(i=0;i{p=i;

for(j=i+1;jif(a[j]>a[p])p=j;/*条件成立更新p*/

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;ia[i][0]=a[i][i]=1;

for(i=2;ia[i][j]=a[i-1][j-1]+a[i-1][j];

for(i=0;iprintf("%5d

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(nnum) { p0->next=head; head=p0; }

else

{ do /*查找插入位置*/ { p2=p1;

p1=p1->next;

} while(p1!=NULL && n>p1->num);

p0->next=p2->next; /*插入在其余位置*/

p2->next=p0;

}

return(head);

} /*insert*/下载本文

显示全文
专题