一些c小程序

                                 C程序设计经典题型

1.       水仙花数

#include<stdio.h>

void main()

{int a,b,c,i,n=0;

for(i=100;i<1000;i++)

{a=i/100;b=(i-a*100)/10;c=i-a*100-b*10;

if(i==a*a*a+b*b*b+c*c*c)

{printf("水仙花数为%d",i);

n=n+1;if(n%2==0)printf("/n");

}

}

printf("/n");

}

2.       求两个数的最大公约数和最小公倍数

#include<stdio.h>

void main()

{int a,b,r,t,p;

printf("输入两个数为:");

scanf("%d%d",&a,&b); #include<stdio.h>

if(b>a)

{t=b;b=a;a=t;}

p=a*b;

while(b!=0)

{r=a%b;

a=b;

b=r;

}

printf("最大公约数为%d/n,最小公倍数为%d/n",a,p/a);

}

3. 1000之内的完数(即它的各因子之和等于它本身,如:6=1+2+3

#include<stdio.h>

void main()

{int i,n=0,t,j,sum;

printf("完数为:/n");

for(i=1;i<1000;i++)

{sum=0;t=i/2;

for(j=1;j<=(t+1);j++)

{if((i%j)==0)

sum=sum+j;

}

if(sum==i)

{printf("     %d    ",i);

n=n+1;

if(n%4==0)printf("/n");

}

}

}

4、  用牛顿迭代法求下面方程在1.5附近的根:

2x3(x的三次方)—4x2+3x—6=0

附:牛顿迭代法

牛顿迭代法又称牛顿切线法,它采用以下的方法求根:先任意设定一个与真实的根接近的X0作为第一次接近的根,由x0求出f(x0),过(x0,f(x0))点做f(x)的切线,交x轴于x1,把它作为第二次近似根,再由x1求出f(x1),再过(x1,f(x1))点做f(x)的切线,交x轴于x2,再求出f(x2),再做切线...........如此继续下去,直到足够接近真正的根x为止。

#include<stdio.h>

#include<math.h>

void main()

{float f1(float);

float f2(float);

float x0=1.5,x1;

x1=x0-f1(x0)/f2(x0);

while(fabs(x1-x0)>=1e-5)

{x0=x1;

x1=x0-f1(x0)/f2(x0);

}

printf("该方程的根为% 3.2f /n",x1);

}

float f1(float x)

{float y;

y=2*x*x*x-4*x*x+3*x-6;

return(y);

}

float f2(float x)

{float y;

y=6*x*x-8*x+3;

return(y);

}

51用二分法求解下列方程在-1010之间的根 :

      2x3-4x2+3x-6=0

附:二分法的思路如下

先定一个区间【x1,x2】,如果函数f(x)在此区间是单调变化,可以根据f(x1)f(x2)是否同号来确定方程f(x)=0在【x1,x2】区间是否有一个实根。若f(x1)f(x2)不同符号,则方程在此区间必定至少有一个实根;如果不同号,则说明在此区间无实根,要重新改变x1x2的值。当确定一个区间有实根后,采取二分法将【x1,x2】区间一分为二,再判断在哪一个小区间内有实根,如此往复不断进行下去,直到小区间是足够小为止,此即为二分法。

#include<stdio.h>

#include<math.h>

void main()

{float f(float);

       float x0,x1,t,p;

printf("输入一个取值范围");

do

{scanf("%f%f",&x0,&x1);

}while(f(x0)*f(x1)>0);

if(f(x0)>0)

{p=x0;x0=x1;x1=p;}

do

{t=(x0+x1)/2;

if(f(t)>0)x1=t;

else x0=t;

}while(fabs(f(x0))>1e-6);

printf("该方程的根为x=% 3.2f /n",x0);

}

float f(float x)

{float y;

y=2*x*x*x-4*x*x+3*x-6;

return(y);

}

2用弦截法求方程的根

f(x)=x3-5x2+16x-80=0

方法如下:第一步(同上取两个使方程值异号的x值)

          第二步 连接(x1,f(x1))和(x2,f(x2))两点,此线即弦交x轴于xx点的坐标可用下式表示:

              

              X=x 1f (x2)-x 2f (x1)/f(x2)-f(x1)

再从x求出f(x).

         第三步  f(x)f(x1)同号,则根必在(x,x2)区间内,此时将x作为新的x1。如果f(x)f(x2)同号,则表示根在(x1,x)之间,将x作为新的x2.

         第四步   重复步骤23,直到|f(x)|足够小为止,此时可认为f(x)0.

为什么输入27及以上值时有问题

#include<stdio.h>

#include<math.h>

float f(float x)

{float y;

y=x*x*x-5*x*x+16*x-80;

return(y);

}

float xpoint(float x1,float x2)

{float x;

x=(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1));

return(x);

}

float root(float x1,float x2)

{float x,y,y1;

y1=f(x1);

do

{x=xpoint(x1,x2);

y=f(x);

if(y*y1>0)

{y1=y;x1=x;}

else x2=x;

}while(fabs(y)>=1e-6);

return(x);

}

void main()

{float x1,x2,f1,f2,x;

do

{printf("input x1,x2:/n");

scanf("%f,%f",&x1,&x2);

f1=f(x1);

f2=f(x2);

}while(f1*f2>=0);

x=root(x1,x2);

printf("A root of equation is % 8.4f /n",x);

}

 

6.用循环语句输出竖形菱形星形,如:

        *

       * * *

      * * * * *

* * * * * * *

 * * * * *

   * * *

     *

#include<stdio.h>

void main()

{int n,i,t,a,b,p;

printf("请输入有几行奇数行星");

scanf("%d",&n);

t=n/2;

for(i=1;i<=t;i++)

{for(a=1;a<=t+1-i;a++)

printf(" ");

for(b=1;b<=2*i-1;b++)

printf("*");

printf("/n");

}

for(p=1;p<=n;p++)

printf("*");

printf("/n");

for(i=1;i<=t;i++)

{for(a=1;a<=i;a++)

printf(" ");

for(b=1;b<=2*(t+1-i)-1;b++)

printf("*");

printf("/n");

}

printf("/n");

}

7.1冒泡法十数排序:(从小到大不知道为什么浮点型错

思路如下:将相邻两个数比较,将小的数排到前面。

#include<stdio.h>

void main()

{int a[10],i,j,t;

printf("请输入十个数为");

for(i=0;i<10;i++)

scanf("%d",&a[i]);

for(i=0;i<10;i++)

{for(j=i+1;j<10;j++)

if(a[j]<a[i])

{t=a[j];a[j]=a[i];a[i]=t;}

}

printf("排出的数为/n");

for(i=0;i<10;i++)

printf("%4d",a[i]);

printf("/n");

}

2用选择法对十个数排序从小到大

思路如下:将第一个数a[0]与后面9个数比较,若都比后9个数小,则a[0]不变,若后面有比a[0]小的,则将a[0]与后面中最小一个交换,此时a[0]中存放了十个数中最小的一个数;接着同上比较,a[1]中存放第二小的数.........共进行9轮比较,即已经完成了从小到大的排序。

#include<stdio.h>

void main()

{int a[10],i,j,t,r;

printf("请输入十个数为");

for(i=0;i<10;i++)

scanf("%d",&a[i]);

for(i=0;i<9;i++)

{r=i;

for(j=i+1;j<10;j++)

if(a[r]>a[j])r=j;

t=a[i];

a[i]=a[r];

a[r]=t;

}

printf("最后排序数为/n");

for(i=0;i<10;i++)

printf("%4d",a[i]);

printf("/n");

}

8.已有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插人数组中。

不知道为什么浮点型错

#include<stdio.h>

void main()

{int a[5]={2,4,7,12,15},i,x,j,t,b[6];

scanf("%d",&x);

if(x<a[0])

{t=x;

b[0]=t;

for(i=0;i<5;i++)

b[i+1]=a[i];

}

else if(x>a[4])

{t=x;

b[5]=t;

for(i=0;i<5;i++)

b[i]=a[i];

}

else if(x>a[0]&&x<a[4])

{for(i=0;i<5;i++)

if(x>a[i]&&x<a[i+1])

j=i;

for(i=0;i<=j;i++)

b[i]=a[i];

b[j+1]=x;

for(i=j+2;i<6;i++)

b[i]=a[i-1];

}

printf("重新排列的数组为");

for(i=0;i<6;i++)

printf("%4d",b[i]);

printf("/n");

}

9.杨辉三角的输出。

#include<stdio.h>

#define N 10

void main()

{int a[N][N],i,j;

 for(i=0;i<N;i++)

a[i][0]=1;

 for(i=1;i<N;i++)

a[i][i]=1;

 for(i=2;i<N;i++)

for(j=1;j<i;j++)

a[i][j]=a[i-1][j-1]+a[i-1][j];

for(i=0;i<N;i++)

{for(j=0;j<i+1;j++)

printf("%-5d",a[i][j]);

printf("/n");

}

printf("/n");

}

*10.魔方阵的输出魔方阵即它的每一行、每一列和对角线之和均相等。例如三阶魔方阵为

              8    1    6

              3    5    7

              4    9    2

魔方阵的排列规律如下:

1.1放在第一行中间一列;

2.2开始直到NN止依次按下列规则存放:每一个数存放的行比前一个数的行数减1,列数加1(例如上面的方阵,54的上一行后一列)。

3).如果上一数的行数为1,则下一个数的行数为n(指最下一行),例如1在第一行,2则在最下一行。

4.当上一个数的列数为n时,下一个数的列数为1,行数减1,例如,2在第三行最后一列,3则应放在他第二行第一列。

5.如果按上面规则确定的位置上已有数,或上一个数是第1n列时,则把下一个数放在上一个数的下面。例如,按上面的规则,4应放在第一行第二列。但该位置已被1占据,所以4就放在3的下面。重编

按此方法可以得到任何阶的魔方阵。

#include<stdio.h>

void main()

{int a[16][16],j,i,k,p,n;

p=1;

while(p==1)                      /*要求阶数在115之间的奇数*/

{printf("请输入n");

scanf("%d",&n);

if((n!=0)&&(n<=15)&&(n%2!=0))

   p=0;

}

for(i=1;i<=n;i++)              /*确定魔方阵大小*/

for(j=1;j<=n;j++)

a[i][j]=0;

j=n/2+1;a[1][j]=1;              /*第一步1放到第一行中间一列*/

for(k=2;k<=n*n;k++)

{i=i-1;j=j+1;      

if((i<1)&&(j>n))                /*如果上一行数是第一行第n列时*/

{i=i+2;j=j-1;}                  /* 下一个数放在上一个数的下面*/

else

{if(i<1)i=n;

if(j>n)j=1;

}

if(a[i][j]==0)             

a[i][j]=k;

else                          /*如果按上面的规则确定的位置上已有数*/

{i=i+2;j=j-1;a[i][j]=k;}      /*下一个数放在上一个数的下面*/

}

for(i=1;i<=n;i++)

{for(j=1;j<=n;j++)

printf("%5d",a[i][j]);

printf("/n");

}

printf("/n");

}

*11.15个数按由大到小的顺序排列存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元数的值,如果该数不在数组中,则输出“无此数”。

重编

#include<stdio.h>

#include<math.h>

#define M 15

void main()

{int a[M],i,j,top,bot,x,flag=1,mid,k=0;

char ch='Y',p;

printf("请由大到小输入相应的元素/n");

for(i=0;i<M;i++)

scanf("%d",&a[i]);

while(ch=='Y')

{top=M-1;bot=0;

printf("请输入要查找的元素的值");

scanf("%d",&x);

while(k<=sqrt(M))

{mid=(top+bot)/2;

if(x==a[mid]){j=mid;flag=0;}

else if(x>a[mid])top=mid-1;

else if(x<a[mid])bot=mid+1;

if(flag==0)break;

else k=k+1;

}

if(flag==0)break;

else if(flag)

{printf("没有要查找的数,是否继续查找:Y/N ? /n");

scanf("%c",&p);

}

if(p=='Y')k=0;

else if(p=='N'){printf("结束没有要查找的数./n");ch='N';}

}

if(flag==0)printf("你查找的数的位置为第%d./n",(j+1));

}

12.写一个函数,输入一行字符(每个单词间用空格符隔开),将此字符串中最长的单词输出。(重编

#include<stdio.h>

#include<string.h>

void main()

{int alphabetic(char);

int longest(char[]);

int i;

char line[100];

printf("input one line:/n");

gets(line);

printf("The lingest word is: ");

for(i=longest(line);alphabetic(line[i]);i++)

printf("%c",line[i]);

printf("/n");

}

int alphabetic(char c)

{if(c>='a'&&c<='z'||c>='A'&&c<='Z')

return(1);

else return(0);

}

int longest(char string[])

{int len=0,i,length=0,flag=1,place=0,point;

for(i=0;i<=strlen(string);i++)

if(alphabetic(string[i]))

if(flag){point=i;flag=0;}

else len++;

else {flag=1;

if(len>=length)

{length=len;

place=point;len=0;}

}

return(place);

}

13.输入10个学生5门课的成绩,分别用函数实现下列功能:(该程序可优化,如若有最高分相同的情况时,每个学生姓名不同长时,将相应的数组长度及输出间隔做相应的调整等等,考虑优化后的程序可能更为复杂,此暂不设计,读者课照此优化)

1计算每个学生平均分;

2计算每门课的平均分;

3找出所有50个分数中最高的分数所对应的学生和课程;

4计算平均方差:

      方差=(∑(xi)2/n-((xi)/n)2

#include<stdio.h>

#define N 10

#define M 5

int l,k;

void main()

{void average1(int b[][M],float ave[]);

void average2(int b[][M],float ave[]);

void max(int b[][M]);

float fangcha(float b[],int);

float ave1[N]={0},ave2[M]={0};

int i,j,a[N][M];

char m[N+1][10];

for(i=0;i<N;i++)

{printf("请输入姓名:  ");

scanf("%s",m[i]);

printf("/n");

printf("请输入成绩");

for(j=0;j<M;j++)

scanf("%d",&a[i][j]);

printf("/n");

}

scanf("%s",m[N]);

printf("/n");

average1(a,ave1);

average2(a,ave2);

printf("姓名科目    数学  英语  语文  物理  化学  平均分/n");

for(i=0;i<N;i++)

{printf("%s",m[i]);

for(j=0;j<M;j++)

printf("%6d",a[i][j]);

printf("% 7.1f ",ave1[i]);

printf("/n");

}

printf("%s",m[N]);

for(i=0;i<M;i++)

printf("% 6.0f ",ave2[i]);

printf("/n");

printf("该最高分学生的课程为");

max(a);

printf("/n");

printf("该学生姓名是%s/n",m[l]);

printf("学生方差为%f/n",fangcha(ave1,N));

printf("科目方差为%f/n",fangcha(ave2,M));

}

void average1(int b[N][M],float ave[N])

{int i,j;

float z,sum;

for(i=0;i<N;i++)

{sum=0;

for(j=0;j<M;j++)

sum=sum+b[i][j];

z=sum/M;

ave[i]=z;

}

}

void average2(int b[N][M],float ave[M])

{int i,j;

float z,sum;

for(i=0;i<M;i++)

{sum=0;

for(j=0;j<N;j++)

sum=b[j][i]+sum;

z=sum/N;

ave[i]=z;

}

}

void max(int b[N][M])

{int i,j,zui;

zui=0;

for(i=0;i<N;i++)

for(j=0;j<M;j++)

if(b[i][j]>zui)

{zui=b[i][j];l=i;k=j;}

if(k==0)

printf("数学");

else if(k==1)

printf("英语");

else if(k==2)

printf("语文");

else if(k==3)

printf("物理");

else if(k==4)

printf("化学");

}

float fangcha(float b[],int n)

{float t,r,p,z,sum1=0,sum2=0;

int i;

for(i=0;i<n;i++)

sum1=b[i]*b[i]+sum1;

t=sum1/n;

for(i=0;i<n;i++)

sum2=sum2+b[i];

r=sum2/n;

p=r*r;

z=t-p;

return(z);

}

注:此文为本人在学习c时的一些练习题,初涉论坛,还有些生疏,望各位朋友多提意见,以望共同进步,不胜感激 !

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值