文档库 最新最全的文档下载
当前位置:文档库 › 常用数学算法C语言实现

常用数学算法C语言实现

常用数学算法C语言实现
常用数学算法C语言实现

一、基本算法

1.交换(两量交换借助第三者)

例1、任意读入两个整数,将二者的值交换后输出。

main()

{int a,b,t;

scanf("%d%d",&a,&b);

printf("%d,%d\n",a,b);

t=a; a=b; b=t;

printf("%d,%d\n",a,b);}

【解析】程序中加粗部分为算法的核心,如同交换两个杯子里的饮料,必须借助第三个空杯子。

假设输入的值分别为3、7,则第一行输出为3,7;第二行输出为7,3。

其中t为中间变量,起到“空杯子”的作用。

注意:三句赋值语句赋值号左右的各量之间的关系!

【应用】

例2、任意读入三个整数,然后按从小到大的顺序输出。

main()

{int a,b,c,t;

scanf("%d%d%d",&a,&b,&c);

/*以下两个if语句使得a中存放的数最小*/

if(a>b){t=a;a=b;b=t;}

if(a>c){t=a;a=c;c=t;}

/*以下if语句使得b中存放的数次小*/

if(b>c) {t=b;b=c;c=t;}

printf("%d,%d,%d\n",a,b,c);}

2.累加

累加算法的要领是形如“s=s+A”的累加式,此式必须出现在循环中才能被反复执行,从而实现累加功能。“A”通常是有规律变化的表达式,s在进入循环前必须获得合适的初值,通常为0。例1、求1+2+3+……+100的和。

main()

{int i,s;

s=0; i=1;

while(i<=100)

{s=s+i; /*累加式*/

i=i+1; /*特殊的累加式*/

}

printf("1+2+3+...+100=%d\n",s);}

【解析】程序中加粗部分为累加式的典型形式,赋值号左右都出现的变量称为累加器,其中“i = i + 1”为特殊的累加式,每次累加的值为1,这样的累加器又称为计数器。

累乘算法的要领是形如“s=s*A”的累乘式,此式必须出现在循环中才能被反复执行,从而实现累乘功能。“A”通常是有规律变化的表达式,s在进入循环前必须获得合适的初值,通常为1。例1、求10!

[分析]10!=1×2×3×……×10

main()

{int i; long c;

c=1; i=1;

while(i<=10)

{c=c*i; /*累乘式*/

i=i+1;

}

printf("1*2*3*...*10=%ld\n",c);}

二、非数值计算常用经典算法

1.穷举

也称为“枚举法”,即将可能出现的每一种情况一一测试,判断是否满足条件,一般采用循环来实现。例1、用穷举法输出所有的水仙花数(即这样的三位正整数:其每位数位上的数字的立方和与该数相等,比如:13+53+33=153)。

[法一]

main()

{int x,g,s,b;

for(x=100;x<=999;x++)

{g=x%10;s=x/10%10;b=x/100;

if(b*b*b+s*s*s+g*g*g==x)printf("%d\n",x);}

}

【解析】此方法是将100到999所有的三位正整数一一考察,即将每一个三位正整数的个位数、十位数、百位数一一求出(各数位上的数字的提取算法见下面的“数字处理”),算出三者的立方和,一旦与原数相等就输出。共考虑了900个三位正整数。

[法二]

main()

{int g,s,b;

for(b=1;b<=9;b++)

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

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

if(b*b*b+s*s*s+g*g*g==b*100+s*10+g) printf("%d\n",b*100+s*10+g);

}

【解析】此方法是用1到9做百位数字、0到9做十位和个位数字,将组成的三位正整数与每一组的三个数的立方和进行比较,一旦相等就输出。共考虑了900个组合(外循环单独执行的次数为9,两个内循环单独执行的次数分别为10次,故if语句被执行的次数为9×10×10=900),即900个三位正整数。与法一判断的次数一样。

(1)冒泡排序(起泡排序)

假设要对含有n个数的序列进行升序排列,冒泡排序算法步骤是:

①从存放序列的数组中的第一个元素开始到最后一个元素,依次对相邻两数进行比较,若前

者大后者小,则交换两数的位置;

②第①趟结束后,最大数就存放到数组的最后一个元素里了,然后从第一个元素开始到倒数

第二个元素,依次对相邻两数进行比较,若前者大后者小,则交换两数的位置;

③重复步骤①n-1趟,每趟比前一趟少比较一次,即可完成所求。

例1、任意读入10个整数,将其用冒泡法按升序排列后输出。

#define n 10

main()

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

for(i=0;i

for(j=1;j<=n-1;j++) /*n个数处理n-1趟*/

for(i=0;i<=n-1-j;i++) /*每趟比前一趟少比较一次*/

if(a[i]>a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}

for(i=0;i

(2)选择法排序

选择法排序是相对好理解的排序算法。假设要对含有n个数的序列进行升序排列,算法步骤是:

①从数组存放的n个数中找出最小数的下标(算法见下面的“求最值”),然后将最小数与第1

个数交换位置;

②除第1个数以外,再从其余n-1个数中找出最小数(即n个数中的次小数)的下标,将此

数与第2个数交换位置;

③重复步骤①n-1趟,即可完成所求。

例1、任意读入10个整数,将其用选择法按升序排列后输出。

#define n 10

main()

{int a[n],i,j,k,t;

for(i=0;i

for(i=0;i

{k = i; /*总是假设此趟处理的第一个(即全部数的第i个)数最小,k记录其下标*/ for(j=i+1;j

if(a[j] < a[k]) k = j;

if (k != i){t = a[i]; a[i] = a[k]; a[k] = t;}

}

for(i=0;i

printf("%d\n",a[i]);}

(3)插入法排序

要想很好地掌握此算法,先请了解“有序序列的插入算法”,就是将某数据插入到一个有序序列后,该序列仍然有序。插入算法参见下面的“数组元素的插入”。

例1、将任意读入的整数x插入一升序数列后,数列仍按升序排列。

#define n 10

main()

{ int a[n]={-1,3,6,9,13,22,27,32,49},x,j,k; /*注意留一个空间给待插数*/

scanf("%d",&x);

if(x>a[n-2]) a[n-1]=x ; /*比最后一个数还大就往最后一个元素中存放*/

else /*查找待插位置*/

{j=0;

while( j<=n-2 && x>a[j]) j++;

/*从最后一个数开始直到待插位置上的数依次后移一位*/

for(k=n-2; k>=j; k- -) a[k+1]=a[k];

a[j]=x; /*插入待插数*/ }

for(j=0;j<=n-1;j++) printf("%d ",a[j]);

}

插入法排序的要领就是每读入一个数立即插入到最终存放的数组中,每次插入都使得该数组有序。例2、任意读入10个整数,将其用插入法按降序排列后输出。

#define n 10

main()

{int a[n],i,j,k,x;

scanf("%d",&a[0]); /*读入第一个数,直接存到a[0]中*/

for(j=1;j

{scanf("%d",&x);

if(x

else /*以下查找待插位置*/

{i=0;

while(x

/*以下for循环从原最后一个数开始直到待插位置上的数依次后移一位*/

for(k=j-1;k>=i;k--) a[k+1]=a[k];

a[i]=x; /*插入待插数*/

}

}

for(i=0;i

}

(4)归并排序

即将两个都升序(或降序)排列的数据序列合并成一个仍按原序排列的序列。

例1、有一个含有6个数据的升序序列和一个含有4个数据的升序序列,将二者合并成一个含有10个数据的升序序列。

#define m 6

#define n 4

main()

{int a[m]={-3,6,19,26,68,100} ,b[n]={8,10,12,22};

int i,j,k,c[m+n];

i=j=k=0;

while(i

{if(a[i]

else {c[k]=b[j]; j++;}

k++; }

while(i>=m && j

{c[k]=b[j]; k++; j++;}

while(j>=n && i

{c[k]=a[i]; k++; i++;}

for(i=0;i

}

3.查找

(1)顺序查找(即线性查找)

顺序查找的思路是:将待查找的量与数组中的每一个元素进行比较,若有一个元素与之相等则找到;若没有一个元素与之相等则找不到。

例1、任意读入10个数存放到数组a中,然后读入待查找数值,存放到x中,判断a中有无与x 等值的数。

#define N 10

main()

{int a[N],i,x;

for(i=0;i

/*以下读入待查找数值*/

scanf("%d",&x);

for(i=0;i

if(i

else printf("Not found!\n");}

(2)折半查找(即二分法)

顺序查找的效率较低,当数据很多时,用二分法查找可以提高效率。使用二分法查找的前提是数列必须有序。

二分法查找的思路是:要查找的关键值同数组的中间一个元素比较,若相同则查找成功,结束;否则判别关键值落在数组的哪半部分,就在这半部分中按上述方法继续比较,直到找到或数组中没有这样的元素值为止。

例1、任意读入一个整数x,在升序数组a中查找是否有与x等值的元素。

#define n 10

main()

{int a[n]={2,4,7,9,12,25,36,50,77,90};

int x,high,low,mid;/*x为关键值*/

scanf("%d",&x);

high=n-1;low=0; mid=(high+low)/2;

while(a[mid]!=x&&low

{if(x

else low=mid+1; /*修改区间下界*/

mid=(high+low)/2;}

if(x==a[mid]) printf("Found %d,%d\n",x,mid);

else printf("Not found\n");

}

三、数值计算常用经典算法:

1.级数计算

级数计算的关键是“描述出通项”,而通项的描述法有两种:一为直接法、二为间接法又称递推法。

直接法的要领是:利用项次直接写出通项式;递推法的要领是:利用前一个(或多个)通项写出后一个通项。

可以用直接法描述通项的级数计算例子有:

(1)1+2+3+4+5+……

(2)1+1/2+1/3+1/4+1/5+……等等。

可以用间接法描述通项的级数计算例子有:

(1)1+1/2+2/3+3/5+5/8+8/13+……

(2)1+1/2!+1/3!+1/4! +1/5!+……等等。

(1)直接法求通项

例1、求1+1/2+1/3+1/4+1/5+……+1/100的和。

main()

{float s; int i;

s=0.0;

for(i=1;i<=100;i++)s=s+1.0/i;

printf("1+1/2+1/3+...+1/100=%f\n",s);

}

【解析】程序中加粗部分就是利用项次i的倒数直接描述出每一项,并进行累加。注意:因为i是整数,故分子必须写成1.0的形式!

(2)间接法求通项(即递推法)

例2、计算下列式子前20项的和:1+1/2+2/3+3/5+5/8+8/13+……。

[分析]此题后项的分子是前项的分母,后项的分母是前项分子分母之和。

main()

{float s,fz,fm,t,fz1; int i;

s=1; /*先将第一项的值赋给累加器s*/

fz=1;fm=2;

t=fz/fm; /*将待加的第二项存入t中*/

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

{s=s+t;

/*以下求下一项的分子分母*/

fz1=fz; /*将前项分子值保存到fz1中*/

fz=fm; /*后项分子等于前项分母*/

fm=fz1+fm; /*后项分母等于前项分子、分母之和*/

t=fz/fm;}

printf("1+1/2+2/3+...=%f\n",s);

}

下面举一个通项的一部分用直接法描述,另一部分用递推法描述的级数计算的例子:

例3、计算级数??? ??∑+∞=2!102x n n n n 的值,当通项的绝对值小于eps 时计算停止。

#include

float g(float x,float eps);

main()

{float x,eps;

scanf("%f%f",&x,&eps);

printf("\n%f,%f\n",x,g(x,eps));

}

float g(float x,float eps)

{int n=1;float s,t;

s=1;t=1;

do {t=t*x/(2*n);

s=s+(n*n+1)*t; /*加波浪线的部分为直接法描述部分,t 为递推法描述部分*/

n++; }while(fabs(t)>eps);

return s;

}

2.一元非线性方程求根

(1)牛顿迭代法

牛顿迭代法又称牛顿切线法:先任意设定一个与真实的根接近的值x 0作为第一次近似根,由x 0求出f(x 0),过(x 0,f(x 0))点做f(x)的切线,交x 轴于x 1,把它作为第二次近似根,再由x 1求出f(x 1),过(x 1,f(x 1))点做f(x)的切线,交x 轴于x 2,……如此继续下去,直到足够接近(比如|x- x 0|<1e-6时)真正的根x *为止。

而f '(x 0)=f(x 0)/( x 1- x 0) 所以 x 1= x 0- f(x 0)/ f ' (x 0)

例如,用牛顿迭代法求下列方程在1.5附近的根:2x 3-4x 2+3x-6=0。

#include "math.h" main()

{float x,x0,f,f1;x=1.5;

do{x0=x;

f=2*x0*x0*x0-4*x0*x0+3*x0-6;

f1=6*x0*x0-8*x0+3;

x=x0-f/f1; }while(fabs(x-x0)>=1e-5);

printf ("%f\n",x);}

(2)二分法

算法要领是:先指定一个区间[x1, x2],如果函数f(x)在此区间是单调变化的,则可以根据f(x1)和f(x2)是否同号来确定方程f(x)=0在区间[x1, x2]内是否有一个实根;如果f(x1)和f(x2)同号,则f(x) 在区间[x1, x2]内无实根,要重新改变x1和x2的值。当确定f(x) 在区间[x1, x2]内有一个实根后,可采取二分法将[x1, x2]一分为二,再判断在哪一个小区间中有实根。如此不断进行下去,直到小区间足够小为止。

具体算法如下:

(1)输入x1和x2的值。

(2)求f(x1)和f(x2)。

(3)如果f(x1)和f(x2)同号说明在[x1, x2] 内无实根,返回步骤(1),重新输入x1和x2的值;若f(x1)和f(x2)不同号,则在区间[x1, x2]内必有一个实根,执行步骤(4)。

(4)求x1和x2的中点:x0=(x1+ x2)/2。

(5)求f(x0)。

(6)判断f(x0)与f(x1)是否同号。

①如果同号,则应在[x0, x2]中寻找根,此时x1已不起作用,用x0代替x1,用f(x0)代替f(x1)。

②如果不同号,则应在[x1, x0]中寻找根,此时x2已不起作用,用x0代替x2,用f(x0)代替f(x2)。(7)判断f(x0)的绝对值是否小于某一指定的值(例如10-5)。若不小于10-5,则返回步骤(4)重复执行步骤(4)、(5)、(6);否则执行步骤(8)。

(8)输出x0的值,它就是所求出的近似根。

例如,用二分法求方程2x3-4x2+3x-6=0在(-10,10)之间的根。

#include "math.h"

main()

{float x1,x2,x0,fx1,fx2,fx0;

do {printf("Enter x1&x2");

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

fx1=2*x1*x1*x1-4*x1*x1+3*x1-6;

fx2=2*x2*x2*x2-4*x2*x2+3*x2-6;

}while(fx1*fx2>0);

do {x0=(x1+x2)/2;

fx0=2*x0*x0*x0-4*x0*x0+3*x0-6;

if((fx0*fx1)<0) {x2=x0; fx2=fx0; }

else{x1=x0;fx1=fx0; }

}while(fabs(fx0)>1e-5);

printf("%f\n",x0);}

3.梯形法计算定积分

定积分?b

a dx x f )(的几何意义是求曲线y=f(x)、x=a 、x=

b 以及x 轴所围成的面积。

可以近似地把面积视为若干小的梯形面积之和。例如,把区间[a, b]分成n 个长度相等的 小区间,每个小区间的长度为h=(b-a)/n ,第i 个小梯形的面积为

[f(a+(i-1)·h)+f(a+i ·h)]·h/2,将n 个小梯形面积加起来就得到定积分的近似值:

∑?=??++?-+≈n

i b

a h h i a f h i a f dx x f 12/)]())1(([)( 根据以上分析,给出“梯形法”求定积分的N-S 结构图:

上述程序的几何意义比较明显,容易理解。但是其中存在重复计算,每次循环都要计算小梯形的上、下底。其实,前一个小梯形的下底就是后一个小梯形的上底,完全不必重复计 算。为此做出如下改进:

?∑-=?+++?≈b a n i h i a f b f a f h dx x f 11)](2/)(2/)([)(

矩形法求定积分则更简单,就是将等分出来的图形当作矩形,而不是梯形。

例如:求定积分?++40)2*3*(dx x x x 的值。等分数n=1000。

#include "math.h"

float DJF(float a,float b)

{float t,h;int n,i;

float HSZ(float x);

n=1000;h=fabs(a-b)/n;

t=(HSZ(a)+HSZ(b))/2;

for(i=1;i<=n-1;i++) t=t+HSZ(a+i*h);

t=t*h;

return(t);

}

float HSZ(float x)

{return(x*x+3*x+2);}

main()

{float y;

y=DJF(0,4);

printf("%f\n",y);}

四、其他常见算法

1.迭代法

其基本思想是把一个复杂的计算过程转化为简单过程的多次重复。每次重复都从旧值的基础上递推出新值,并由新值代替旧值。

例如,猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,就只剩一个桃子了。编程求第一天共摘多少桃子。

main()

{int day,peach;

peach=1;

for(day=9;day>=1;day--) peach=(peach+1)*2;

printf("The first day:%d\n",peach);}

又如,用迭代法求x=a的根。

求平方根的迭代公式是:x n+1=0.5×(x n+a/ x n )

[算法]

(1)设定一个初值x0。

(2)用上述公式求出下一个值x1。

(3)再将x1代入上述公式,求出下一个值x2。

(4)如此继续下去,直到前后两次求出的x值(x n+1和x n)满足以下关系:

| x n+1- x n|<10-5

#include "math.h"

main()

{float a,x0,x1;

scanf("%f",&a);

x0=a/2; x1=(x0+a/x0)/2;

do{x0=x1;

x1=(x0+a/x0)/2;

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

printf("%f\n",x1);

}

2.进制转换

(1)十进制数转换为其他进制数

一个十进制正整数m转换成r进制数的思路是,将m不断除以r取余数,直到商为0时止,以反序输出余数序列即得到结果。

注意,转换得到的不是数值,而是数字字符串或数字串。

例如,任意读入一个十进制正整数,将其转换成二至十六任意进制的字符串。

void tran(int m,int r,char str[],int *n)

{char sb[]="0123456789ABCDEF"; int i=0,g;

do{g=m%r;

str[i]=sb[g];

m=m/r;

i++;

}while(m!=0);

*n=i;

}

main()

{int x,r0; /*r0为进制基数*/

int i,n; /*n中存放生成序列的元素个数*/

char a[50];

scanf("%d%d",&x,&r0);

if(x>0&&r0>=2&&r0<=16)

{tran(x,r0,a,&n);

for(i=n-1;i>=0;i--)printf("%c",a[i]);

printf("\n"); }

else exit(0);

}

(2)其他进制数转换为十进制数

其他进制整数转换为十进制整数的要领是:“按权展开”,例如,有二进制数101011,则其十进制形式为1×25+0×24+1×23+0×22+1×21+1×20=43。若r进制数a n……a2a1(n位数)转换成十进制数,方法是a n×r n-1+……a2×r1+a1×r0。

注意:其他进制数只能以字符串形式输入。

例1、任意读入一个二至十六进制数(字符串),转换成十进制数后输出。

#include "string.h"

#include "ctype.h"

main()

{char x[20];int r,d;

gets(x); /*输入一个r进制整数序列*/

scanf("%d",&r); /*输入待处理的进制基数2-16*/

d=Tran(x,r);

printf("%s=%d\n",x,d);

}

int Tran(char *p,int r)

{int d,i,cr;char fh,c;

d=0; fh=*p;

if(fh=='-')p++;

for(i=0;i

{c=*(p+i);

if(toupper(c)>='A')cr=toupper(c)-'A'+10;

elsecr=c-'0';

d=d*r+cr;

}

if(fh=='-')d=-d;

return(d);

}

3.矩阵转置

矩阵转置的算法要领是:将一个m行n列矩阵(即m×n矩阵)的每一行转置成另一个n×m 矩阵的相应列。

例1、将以下2×3矩阵转置后输出。

即将 1 2 3 转置成 1 4

4 5 6 2 5

3 6

main()

{int a[2][3],b[3][2],i,j,k=1;

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

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

a[i][j]=k++;

/*以下将a的每一行转存到b的每一列*/

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

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

b[j][i]=a[i][j];

for(i=0;i<3;i++) /*输出矩阵b*/

{for(j=0;j<2;j++)

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

printf("\n"); }

}

4.字符处理

(1)字符统计:对字符串中各种字符出现的次数的统计。

典型例题:任意读入一个只含小写字母的字符串,统计其中每个字母的个数。

#include "stdio.h "

main()

{char a[100];int n[26]={0};int i; /*定义26个计数器并置初值0*/

gets(a);

for(i=0;a[i]!= '\0' ;i++) /*n[0]中存放’a’的个数,n[1] 中存放’b’的个数……*/

n[a[i]-'a']++; /*各字符的ASCII码值减去’a’的ASCII码值,正好得到对应计数器下标*/

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

if(n[i]!=0)printf("%c:%d\n ",i+'a',n[i]);

}

(2)字符加密

例如、对任意一个只含有英文字母的字符串,将每一个字母用其后的第三个字母替代后输出(字母X后的第三个字母为A,字母Y后的第三个字母为B,字母Z后的第三个字母为C。)

#include "stdio.h"

#include "string.h"

main()

{char a[80]="China";int i;

for(i=0;i

if(a[i]>='x'&&a[i]<='z'||a[i]>='X'&&a[i]<='Z')a[i]=a[i]-26+3;

else a[i]= a[i]+3;

puts(a);}

5.整数各数位上数字的获取

算法核心是利用“任何正整数整除10的余数即得该数个位上的数字”的特点,用循环从低位到高位依次取出整数的每一数位上的数字。

例1、任意读入一个5位整数,输出其符号位及从高位到低位上的数字。

main()

{long x; int w,q,b,s,g;

scanf("%ld",&x);

if(x<0) {printf("-,"); x=-x;}

w=x/10000; /*求万位上的数字*/

q=x/1000%10; /*求千位上的数字*/

b=x/100%10; /*求百位上的数字*/

s=x/10%10; /*求十位上的数字*/

g=x%10; /*求个位上的数字*/

printf("%d,%d,%d,%d,%d\n",w,q,b,s,g);}

例2、任意读入一个整数,依次输出其符号位及从低位到高位上的数字。

[分析]此题读入的整数不知道是几位数,但可以用以下示例的方法完成此题:

例如读入的整数为3796,存放在x中,执行x%10后得余数为6并输出;将x/10得379后赋值给x。再执行x%10后得余数为9并输出;将x/10得37后赋值给x……直到商x为0时终止。

main()

{long x; scanf("%ld",&x);

if(x<0) {printf("- "); x=-x;}

do /*为了能正确处理0,要用do_while循环*/

{printf("%d ",x%10);

x=x/10;

}while(x!=0);

printf("\n");

}

例3、任意读入一个整数,依次输出其符号位及从高位到低位上的数字。

[分析]此题必须借助数组将依次求得的低位到高位的数字保存后,再逆序输出。

main()

{long x; int a[20],i,j;

scanf("%ld",&x);

if(x<0) {printf("- "); x=-x;}

i=0;

do {a[i]=x%10;

x=x/10; i++;

}while(x!=0);

for(j=i-1;j>=0;j--)

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

printf("\n");

}

6.辗转相除法求两个正整数的最大公约数

该算法的要领是:假设两个正整数为a和b,先求出前者除以后者的余数,存放到变量r中,若r不为0,则将b的值得赋给a,将r的值得赋给b;再求出a除以b的余数,仍然存放到变量r 中……如此反复,直至r为0时终止,此时b中存放的即为原来两数的最大公约数。

例1、任意读入两个正整数,求出它们的最大公约数。

[法一:用while循环时,最大公约数存放于b中]

main()

{int a,b,r;

doscanf("%d%d",&a,&b);

while(a<=0||b<=0); /*确保a和b为正整数*/

r=a%b;

while(r!=0)

{a=b;b=r;r=a%b;}

printf("%d\n",b);

}

[法二:用do…while循环时,最大公约数存放于a中]

main()

{int a,b,r;

doscanf("%d%d",&a,&b);

while(a<=0||b<=0); /*确保a和b为正整数*/

do {r=a%b;a=b;b=r;

}while(r!=0);

printf("%d\n",a);

}

【引申】可以利用最大公约数求最小公倍数。提示:两个正整数a和b的最小公倍数=a×b/最大公约数。例2、任意读入两个正整数,求出它们的最小公倍数。

[法一:利用最大公约数求最小公倍数]

main()

{int a,b,r,x,y;

doscanf("%d%d",&a,&b);

while(a<=0||b<=0); /*确保a和b为正整数*/

x=a; y=b; /*保留a、b原来的值*/

r=a%b;

while(r!=0) {a=b;b=r;r=a%b;}

printf("%d\n",x*y/b);

}

[法二:若其中一数的最小倍数也是另一数的倍数,该最小倍数即为所求]

main()

{int a,b,r,i;

do scanf("%d%d",&a,&b);

while(a<=0||b<=0); /*确保a和b为正整数*/

i=1;

while(a*i%b!=0) i++;

printf("%d\n",i*a);

}

7.求最值

即求若干数据中的最大值(或最小值)。算法要领是:首先将若干数据存放于数组中,通常假设第一个元素即为最大值(或最小值),赋值给最终存放最大值(或最小值)的max(或min)变量中,然后将该量max(或min)的值与数组其余每一个元素进行比较,一旦比该量还大(或小),则将此元素的值赋给max(或min)……所有数如此比较完毕,即可求得最大值(或最小值)。

例1、任意读入10个数,输出其中的最大值与最小值。

#define N 10

main()

{int a[N],i,max,min;

for(i=0;i

max=min=a[0];

for(i=1;i

if(a[i]>max) max=a[i];

elseif(a[i]

printf("max=%d,min=%d\n",max,min);

}

8.判断素数

素数又称质数,即“只能被1和自身整除的大于1的自然数”。判断素数的算法要领就是依据数学定义,即若该大于1的正整数不能被2至自身减1整除,就是素数。

例1、任意读入一个正整数,判断其是否为素数。

main()

{int x,k;

do scanf("%d",&x);

while(x<=1); /*确保读入大于1的正整数*/

for(k=2;k<=x-1;k++)

if(x%k==0)break; /*一旦能被2~自身-1整除,就不可能是素数*/

if(k==x)printf("%d is sushu\n",x);

elseprintf("%d is not sushu\n",x);}

以上例题可以用以下两种变形来解决(需要使用辅助判断的逻辑变量):

【变形一】将“2~自身-1”的范围缩小至“2~自身的一半”

main()

{int x,k,flag;

doscanf("%d",&x);while(x<=1);

flag=1; /*先假设x就是素数*/

for(k=2;k<=x/2;k++)

if(x%k==0){flag=0; break;}/*一旦不可能是素数,即置flag为0*/

if(flag==1) printf("%d is sushu\n",x);

else printf("%d is not sushu\n",x);}

【变形二】将“2~自身-1”的范围缩小至“2~自身的平方根”

#include "math.h"

main()

{int x,k,flag;

do scanf("%d",&x);while(x<=1);

flag=1; /*先假设x就是素数*/

for(k=2;k<=(int)sqrt(x);k++)

if(x%k==0){flag=0; break;}/*一旦不可能是素数,即置flag为0*/

if(flag==1) printf("%d is sushu\n",x);

elseprintf("%d is not sushu\n",x);}

例2、用筛选法求得100以内的所有素数。

算法为:(1)定义一维数组a,其初值为:2,3, (100)

(2)若a[k]不为0,则将该元素以后的所有a[k]的倍数的数组元素置为0;

(3)a中不为0的元素,均为素数。

#include

#include

main( )

{int k,j,a[101];

clrscr(); /*清屏函数*/

for(k=2;k<101;k++)a[k]=k;

for(k=2;k

for(j=k+1;j<101;j++)

if(a[k]!=0&&a[j]!=0)

if(a[j]%a[k]==0)a[j]=0;

for(k=2;k<101;k++) if(a[k]!=0)printf("%5d",a[k]);

}

9.数组元素的插入、删除

(1)数组元素的插入

此算法一般是在已经有序的数组中再插入一个数据,使数组中的数列依然有序。算法要领是:

假设待插数据为x,数组a中数据为升序序列。

①先将x与a数组当前最后一个元素进行比较,若比最后一个元素还大,就将x放入其后一个元素

中;否则进行以下步骤;

②先查找到待插位置。从数组a的第1个元素开始找到不比x小的第一个元素,设其下标为i ;

③将数组a中原最后一个元素至第i个元素依次一一后移一位,让出待插数据的位置,即下标为i

的位置;

④将x存放到a(i)中。

例题参见前面“‘排序’中插入法排序的例1”。

(2)数组元素的删除

此算法的要领是:首先要找到(也可能找不到)待删除元素在数组中的位置(即下标),然后将待删元素后的每一个元素向前移动一位,最后将数组元素的个数减1。

例1、数组a中有若干不同考试分数,任意读入一个分数,若与数组a中某一元素值相等,就将该元素删除。

#define N 6

main()

{int fs[N]={69,90,85,56,44,80},x; int i,j,n;

n=N;

scanf("%d",&x); /*任意读入一个分数值*/

/*以下查找待删分数的位置,即元素下标*/

for(i=0;i

if(fs[i]==x)break;

if(i==n) printf("Not found!\n");

else /*将待删位置之后的所有元素一一前移*/

{for(j=i+1;j

n=n-1; /*元素个数减1*/

}

for(i=0;i

}

10.二维数组的其他典型问题

(1)方阵的特点

行列相等的矩阵又称方阵。其两条对角线中“\”方向的为主对角线,“/”方向的为副对角线。主对角线上各元素的下标特点为:行列值相等;副对角线上各元素的下标特点为:行列值之和都为阶数加1。

主对角线及其以下部分(行值大于列值)称为下三角。

例1、输出如下5阶方阵。

1 2 2 2 2

3 1 2 2 2

3 3 1 2 2

3 3 3 1 2

3 3 3 3 1

#define N 5

main()

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

for(i=0;i

for(j=0;j

if(i==j) a[i][j]=1;

else if(i

else a[i][j]=3;

for(i=0;i

{for(j=0;j

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

printf("\n");

}

}

例2、输出如下5阶方阵。

1 2 3 4 5

2 3 4 5 6

3 4 5 6 7

4 5 6 7 8

5 6 7 8 9

#define N 5

main()

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

for(i=0;i

for(j=0;j

a[i][j]=i+j+1; /*沿副对角线平行线方向考察每个元素,其值等于行列值之和+1*/

for(i=0;i

{for(j=0;j

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

printf("\n");}

}

(2)杨辉三角形

杨辉三角形的每一行是(x+y)n的展开式各项的系数。例如第一行是(x+y)0,其系数为1;第二行是(x+y)1,其系数为1,1;第三行是(x+y)2,其展开式为x2+2xy+y2,系数分别为1,2,1;……直观形式如下:

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

1 5 10 10 5 1

……

分析以上形式,可以发现其规律:是n阶方阵的下三角,第一列和主对角线均为1,其余各元素是它的上一行、同一列元素与上一行、前一列元素之和。

例1、编程输出杨辉三角形的前10行。

#define N 10

main()

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

for(i=0;i

for(i=2;i

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

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

for(i=0;i

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

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

printf("\n");

}

}

例2、以等腰三角形的形状输出杨辉三角形的前5行。

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

#define N 5

main()

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

for(i=0;i

a[i][0]=a[i][i]=1;

for(i=0;i

for(j=1;j

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

for(i=0;i

{for(j=N-i;j>=0;j--)printf(""); /*输出时每行前导空格递减*/ for(j=0;j<=i;j++)

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

printf("\n");

}

}

数据结构与算法C语言版期末复习题

《数据结构与算法》期末复习题 一、选择题。 1.在数据结构中,从逻辑上可以把数据结构分为 C 。 A.动态结构和静态结构B.紧凑结构和非紧凑结构 C.线性结构和非线性结构D.内部结构和外部结构 2.数据结构在计算机内存中的表示是指 A 。 A.数据的存储结构B.数据结构C.数据的逻辑结构D.数据元素之间的关系 3.在数据结构中,与所使用的计算机无关的是数据的 A 结构。 A.逻辑B.存储C.逻辑和存储D.物理 4.在存储数据时,通常不仅要存储各数据元素的值,而且还要存储 C 。 A.数据的处理方法B.数据元素的类型 C.数据元素之间的关系D.数据的存储方法 5.在决定选取何种存储结构时,一般不考虑 A 。 A.各结点的值如何B.结点个数的多少 C.对数据有哪些运算D.所用的编程语言实现这种结构是否方便。 6.以下说法正确的是 D 。 A.数据项是数据的基本单位 B.数据元素是数据的最小单位 C.数据结构是带结构的数据项的集合 D.一些表面上很不相同的数据可以有相同的逻辑结构 7.算法分析的目的是 C ,算法分析的两个主要方面是 A 。 (1)A.找出数据结构的合理性B.研究算法中的输入和输出的关系C.分析算法的效率以求改进C.分析算法的易读性和文档性 (2)A.空间复杂度和时间复杂度B.正确性和简明性 C.可读性和文档性D.数据复杂性和程序复杂性 8.下面程序段的时间复杂度是O(n2) 。 s =0; for( I =0; i

C语言常用函数手册

1.分类函数,所在函数库为ctype.h int isalpha(int ch) 若ch是字母('A'-'Z','a'-'z')返回非0值,否则返回0 int isalnum(int ch) 若ch是字母('A'-'Z','a'-'z')或数字('0'-'9'),返回非0值,否则返回0 int isascii(int ch) 若ch是字符(ASCII码中的0-127)返回非0值,否则返回0 int iscntrl(int ch) 若ch是作废字符(0x7F)或普通控制字符(0x00-0x1F) 返回非0值,否则返回0 int isdigit(int ch) 若ch是数字('0'-'9')返回非0值,否则返回0 int isgraph(int ch) 若ch是可打印字符(不含空格)(0x21-0x7E)返回非0值,否则返回0 int islower(int ch) 若ch是小写字母('a'-'z')返回非0值,否则返回0 int isprint(int ch) 若ch是可打印字符(含空格)(0x20-0x7E)返回非0值,否则返回0 int ispunct(int ch) 若ch是标点字符(0x00-0x1F)返回非0值,否则返回0 int isspace(int ch) 若ch是空格(' '),水平制表符('\t'),回车符('\r'), 走纸换行('\f'),垂直制表符('\v'),换行符('\n') 返回非0值,否则返回0 int isupper(int ch) 若ch是大写字母('A'-'Z')返回非0值,否则返回0 int isxdigit(int ch) 若ch是16进制数('0'-'9','A'-'F','a'-'f')返回非0值, 否则返回0 int tolower(int ch) 若ch是大写字母('A'-'Z')返回相应的小写字母('a'-'z') int toupper(int ch) 若ch是小写字母('a'-'z')返回相应的大写字母('A'-'Z') 2.数学函数,所在函数库为math.h、stdlib.h、string.h、float.h int abs(int i) 返回整型参数i的绝对值 double cabs(struct complex znum) 返回复数znum的绝对值 double fabs(double x) 返回双精度参数x的绝对值 long labs(long n) 返回长整型参数n的绝对值 double exp(double x) 返回指数函数ex的值 double frexp(double value,int *eptr) 返回value=x*2n中x的值,n存贮在eptr中double ldexp(double value,int exp); 返回value*2exp的值 double log(double x) 返回logex的值 double log10(double x) 返回log10x的值 double pow(double x,double y) 返回xy的值 double pow10(int p) 返回10p的值 double sqrt(double x) 返回+√x的值 double acos(double x) 返回x的反余弦cos-1(x)值,x为弧度 double asin(double x) 返回x的反正弦sin-1(x)值,x为弧度 double atan(double x) 返回x的反正切tan-1(x)值,x为弧度 double atan2(double y,double x) 返回y/x的反正切tan-1(x)值,y的x为弧度double cos(double x) 返回x的余弦cos(x)值,x为弧度 double sin(double x) 返回x的正弦sin(x)值,x为弧度 double tan(double x) 返回x的正切tan(x)值,x为弧度 double cosh(double x) 返回x的双曲余弦cosh(x)值,x为弧度 double sinh(double x) 返回x的双曲正弦sinh(x)值,x为弧度

C语言标准库函数2012

常用C语言标准库函数2012 C语言编译系统提供了众多的预定义库函数和宏。用户在编写程序时,可以直接调用这些库函数和宏。这里选择了初学者常用的一些库函数,简单介绍了各函数的用法和所在的头文件。 1.测试函数 Isalnum 原型:int isalnum(int c) 功能:测试参数c是否为字母或数字:是则返回非零;否则返回零 头文件:ctype.h Isapha 原型:int isapha(int c) 功能:测试参数c是否为字母:是则返回非零;否则返回零 头文件:ctype.h Isascii 原型:int isascii(int c) 功能:测试参数c是否为ASCII码(0x00~0x7F):是则返回非零;否则返回零 头文件:ctype.h Iscntrl 原型:int iscntrl(int c) 功能:测试参数c是否为控制字符(0x00~0x1F、0x7F):是则返回非零;否则返回零 头文件:ctype.h Isdigit 原型:int isdigit(int c) 功能:测试参数c是否为数字:是则返回非零;否则返回零。 头文件:ctype.h Isgraph 原型:int isgraph(int c) 功能:测试参数c是否为可打印字符(0x21~0x7E):是则返回非零;否则返回零头文件:ctype.h Islower 原型:int islower(int c) 功能:测试参数c是否为小写字母:是则返回非零;否则返回零 头文件:ctype.h

Isprint 原型:int isprint(int c) 功能:测试参数c是否为可打印字符(含空格符0x20~0x7E):是则返回非零;否则返回零 头文件:ctype.h Ispunct 原型:int ispunct(int c) 功能:测试参数c是否为标点符号:是则返回非零;否则返回零 头文件:ctype.h Isupper 原型:int isupper(inr c) 功能:测试参数c是否为大写字母:是则返回非零;否则返回零 Isxdigit 原型:int isxdigit(int c) 功能:测试参数c是否为十六进制数:是则返回非零;否则返回零 2.数学函数 abs 原型:int abs(int i) 功能:返回整数型参数i的绝对值 头文件:stdlib.h,math.h acos 原型:double acos(double x) 功能:返回双精度参数x的反余弦三角函数值 头文件:math.h asin 原型:double asin(double x) 功能:返回双精度参数x的反正弦三角函数值 头文件:math.h atan 原型:double atan(double x) 功能:返回双精度参数的反正切三角函数值 头文件:math.h atan2 原型:double atan2(double y,double x) 功能:返回双精度参数y和x由式y/x所计算的反正切三角函数值 头文件:math.h cabs

非常全的C语言常用算法

一、基本算法 1.交换(两量交换借助第三者) 例1、任意读入两个整数,将二者的值交换后输出。 main() {int a,b,t; scanf("%d%d",&a,&b); printf("%d,%d\n",a,b); t=a; a=b; b=t; printf("%d,%d\n",a,b);} 【解析】程序中加粗部分为算法的核心,如同交换两个杯子里的饮料,必须借助第三个空杯子。 假设输入的值分别为3、7,则第一行输出为3,7;第二行输出为7,3。 其中t为中间变量,起到“空杯子”的作用。 注意:三句赋值语句赋值号左右的各量之间的关系! 【应用】 例2、任意读入三个整数,然后按从小到大的顺序输出。 main() {int a,b,c,t; scanf("%d%d%d",&a,&b,&c); /*以下两个if语句使得a中存放的数最小*/ if(a>b){ t=a; a=b; b=t; } if(a>c){ t=a; a=c; c=t; } /*以下if语句使得b中存放的数次小*/ if(b>c) { t=b; b=c; c=t; } printf("%d,%d,%d\n",a,b,c);} 2.累加 累加算法的要领是形如“s=s+A”的累加式,此式必须出现在循环中才能被反复执行,从而实现累加功能。“A”通常是有规律变化的表达式,s在进入循环前必须获得合适的初值,通常为0。例1、求1+2+3+……+100的和。 main() {int i,s; s=0; i=1; while(i<=100) {s=s+i; /*累加式*/ i=i+1; /*特殊的累加式*/ } printf("1+2+3+...+100=%d\n",s);} 【解析】程序中加粗部分为累加式的典型形式,赋值号左右都出现的变量称为累加器,其中“i = i + 1”为特殊的累加式,每次累加的值为1,这样的累加器又称为计数器。

C语言经典算法100例(1---30)

2008-02-18 18:48 【程序1】 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不满足条件的排列。 2.程序源代码: main() { int i,j,k; printf("\n"); for(i=1;i<5;i++) /*以下为三重循环*/ for(j=1;j<5;j++) for (k=1;k<5;k++) { if (i!=k&&i!=j&&j!=k) /*确保i、j、k三位互不相同*/ printf("%d,%d,%d\n",i,j,k); } } ============================================================== 【程序2】 题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高 于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提 成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于 40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于 100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数? 1.程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。 2.程序源代码: main() { long int i; int bonus1,bonus2,bonus4,bonus6,bonus10,bonus; scanf("%ld",&i); bonus1=100000*0.1;bonus2=bonus1+100000*0.75; bonus4=bonus2+200000*0.5; bonus6=bonus4+200000*0.3; bonus10=bonus6+400000*0.15; if(i<=100000)

C语言常用算法集合

1.定积分近似计算: /*梯形法*/ double integral(double a,double b,long n) { long i;double s,h,x; h=(b-a)/n; s=h*(f(a)+f(b))/2; x=a; for(i=1;i

} 3.素数的判断: /*方法一*/ for (t=1,i=2;i0;n/=10) k=10*k+n%10; return k; } /*求回文数*/ int f(long n) { long k,m=n; for(k=0;n>0;n/=10) k=10*k+n%10; if(m==k) return 1; return 0; } /*求整数位数*/ int f(long n) { int count; for(count=0;n>0;n/=10) count++; return count; }

最新C语言常用算法集合汇总

C语言常用算法集合

1.定积分近似计算: /*梯形法*/ double integral(double a,double b,long n) { long i;double s,h,x; h=(b-a)/n; s=h*(f(a)+f(b))/2; x=a; for(i=1;i

if(n==1||n==2) *s=1; else{ fib(n-1,&f1); fib(n-2,&f2); *s=f1+f2; } } 3.素数的判断: /*方法一*/ for (t=1,i=2;i0;n/=10) k=10*k+n%10; return k; } /*求回文数*/

C语言中常用的库函数

字符处理函数 本类别函数用于对单个字符进行处理,包括字符的类别测试和字符的大小写转换 头文件ctype.h 函数列表<> 函数类别函数用途详细说明 字符测试是否字母和数字isalnum 是否字母isalpha 是否控制字符iscntrl 是否数字isdigit 是否可显示字符(除空格外)isgraph 是否可显示字符(包括空格)isprint 是否既不是空格,又不是字母和数字的可显示字符ispunct 是否空格isspace 是否大写字母isupper 是否16进制数字(0-9,A-F)字符isxdigit 字符大小写转换函数转换为大写字母toupper 转换为小写字母tolower 地区化 本类别的函数用于处理不同国家的语言差异。 头文件local.h 函数列表 函数类别函数用途详细说明 地区控制地区设置setlocale 数字格式约定查询国家的货币、日期、时间等的格式转换localeconv 数学函数 本分类给出了各种数学计算函数,必须提醒的是ANSI C标准中的数据格式并不符合IEEE754标准,一些C语言编译器却遵循IEEE754(例如frinklin C51) 头文件math.h 函数列表 函数类别函数用途详细说明 错误条件处理定义域错误(函数的输入参数值不在规定的范围内) 值域错误(函数的返回值不在规定的范围内) 三角函数反余弦acos 反正弦asin

反正切atan 反正切2 atan2 余弦cos 正弦sin 正切tan 双曲函数双曲余弦cosh 双曲正弦sinh 双曲正切tanh 指数和对数指数函数exp 指数分解函数frexp 乘积指数函数fdexp 自然对数log 以10为底的对数log10 浮点数分解函数modf 幂函数幂函数pow 平方根函数sqrt 整数截断,绝对值和求余数函数求下限接近整数ceil 绝对值fabs 求上限接近整数floor 求余数fmod 本分类函数用于实现在不同底函数之间直接跳转代码。头文件setjmp.h io.h 函数列表 函数类别函数用途详细说明 保存调用环境setjmp 恢复调用环境longjmp 信号处理 该分类函数用于处理那些在程序执行过程中发生例外的情况。 头文件signal.h 函数列表 函数类别函数用途详细说明 指定信号处理函数signal 发送信号raise 可变参数处理 本类函数用于实现诸如printf,scanf等参数数量可变底函数。

c语言经典算法100例

60.题目:古典问题:有一对兔子,从出生后第3个月 起每个月都生一对兔子,小兔 子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总 数 为多少? _________________________________________________________________ _ 程序分析:兔子的规律为数列1,1,2,3,5,8,13,21.... _________________________________________________________________ __ 程序源代码: main() { long f1,f2; int i; f1=f2=1; for(i=1;i<=20;i++) { printf("%12ld %12ld",f1,f2); if(i%2==0) printf("\n");/*控制输出,每行四个*/

f1=f1+f2;/*前两个月加起来赋值给第三个月*/ f2=f1+f2;/*前两个月加起来赋值给第三个月*/ } } 上题还可用一维数组处理,you try! 61.题目:判断101-200之间有多少个素数,并输出所有素数。 _________________________________________________________________ _ 1 程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被 整 除,则表明此数不是素数,反之是素数。 _________________________________________________________________ __ 程序源代码: #include "math.h" main() { int m,i,k,h=0,leap=1;

C语言常用的库函数

库函数并不是C语言的一部分,它是由编译系统根据一般用户的需要编制并 提供给用户使用的一组程序。每一种C编译系统都提供了一批库函数,不同的 编译系统所提供的库函数的数目和函数名以及函数功能是不完全相同的。ANSI C标准提出了一批建议提供的标准库函数。它包括了目前多数C编译系统所提供 的库函数,但也有一些是某些C编译系统未曾实现的。考虑到通用性,本附录 列出ANSI C建议的常用库函数。 由于C库函数的种类和数目很多,例如还有屏幕和图形函数、时间日期函数、 与系统有关的函数等,每一类函数又包括各种功能的函数,限于篇幅,本附录不 能全部介绍,只从教学需要的角度列出最基本的。读者在编写C程序时可根据 需要,查阅有关系统的函数使用手册。 1.数学函数 使用数学函数时,应该在源文件中使用预编译命令: #include或#include "math.h" 函数名函数原型功能返回值 acos double acos(double x);计算arccos x的值,其中-1<=x<=1计算结果 asin double asin(double x);计算arcsin x的值,其中-1<=x<=1计算结果 atan double atan(double x);计算arctan x的值计算结果 atan2double atan2(double x, double y);计算arctan x/y的值计算结果 cos double cos(double x);计算cos x的值,其中x的单位为弧度计算结果 cosh double cosh(double x);计算x的双曲余弦cosh x的值计算结果 exp double exp(double x);求e x的值计算结果

C语言常见基本词汇及词汇解释

C语言常用基本词汇及其他提示语运算符与表达式: 1.constant 常量 2. variable 变量 3. identify 标识符 4. keywords 关键字 5. sign 符号 6. operator 运算符 7. statement语句 8. syntax 语法 9. expression 表达式 10. initialition初始化 11. number format 数据格式 12 declaration 说明 13. type conversion 类型转换 14.define 、definition 定义 条件语句: 1.select 选择 2. expression 表达式 3. logical expression 逻辑表达式 4. Relational expression 关系表达式 5.priority优先

6. operation运算 7.structure 结构 循环语句: 1.circle 循环 2. condition 条件 3. variant 变量 4. process过程 5.priority优先 6. operation运算 数组: 1. array 数组 2. reference 引用 3. element 元素 4. address 地址 5. sort 排序 6. character 字符 7. string 字符串 8. application 应用函数: 1.call 调用 2.return value 返回值 3.function 函数

4. declare 声明 5. `parameter 参数 6.static 静态的 7.extern 外部的 指针: 1. pointer 指针 2. argument 参数 3. array 数组 4. declaration 声明 5. represent 表示 6. manipulate 处理 结构体、共用体、链表: 1 structure 结构 2 member成员 3 tag 标记 4 function 函数 5 enumerate 枚举 6 union 联合(共用体) 7 create 创建 8 insert 插入 9 delete 删除 10 modify 修改

c语言中常用的函数和头文件

头文件ctype.h 函数列表<> 函数类别函数用途详细说明 字符测试是否字母和数字isalnum 是否字母isalpha 是否控制字符iscntrl 是否数字isdigit 是否可显示字符(除空格外)isgraph 是否可显示字符(包括空格)isprint 是否既不是空格,又不是字母和数字的可显示字符ispunct 是否空格isspace 是否大写字母isupper 是否16进制数字(0-9,A-F)字符isxdigit 字符大小写转换函数转换为大写字母toupper 转换为小写字母tolower 地区化 本类别的函数用于处理不同国家的语言差异。 头文件local.h 函数列表 函数类别函数用途详细说明 地区控制地区设置setlocale 数字格式约定查询国家的货币、日期、时间等的格式转换localeconv 数学函数 本分类给出了各种数学计算函数,必须提醒的是ANSI C标准中的数据格式并不符合IEEE754标准,一些C语言编译器却遵循IEEE754(例如frinklin C51) 头文件math.h 函数列表 函数类别函数用途详细说明 错误条件处理定义域错误(函数的输入参数值不在规定的范围内) 值域错误(函数的返回值不在规定的范围内) 三角函数反余弦acos 反正弦asin 反正切atan 反正切2 atan2 余弦cos

正弦sin 正切tan 双曲函数双曲余弦cosh 双曲正弦sinh 双曲正切tanh 指数和对数指数函数exp 指数分解函数frexp 乘积指数函数fdexp 自然对数log 以10为底的对数log10 浮点数分解函数modf 幂函数幂函数pow 平方根函数sqrt 整数截断,绝对值和求余数函数求下限接近整数ceil 绝对值fabs 求上限接近整数floor 求余数fmod 本分类函数用于实现在不同底函数之间直接跳转代码。头文件setjmp.h io.h 函数列表 函数类别函数用途详细说明 保存调用环境setjmp 恢复调用环境longjmp 信号处理 该分类函数用于处理那些在程序执行过程中发生例外的情况。 头文件signal.h 函数列表 函数类别函数用途详细说明 指定信号处理函数signal 发送信号raise 可变参数处理 本类函数用于实现诸如printf,scanf等参数数量可变底函数。 头文件stdarg.h 函数列表

C语言中最常用标准库函数 - candyliuxj - CSDN博客

C语言中最常用标准库函数- candyliuxj - CSDN博客 C语言中最常用标准库函数收藏 标准头文件包括: <asset.h> <ctype.h> <errno.h> <float.h> <limits.h> <locale.h> <math.h> <setjmp.h> <signal.h> <stdarg.h> <stddef.h> <stdlib.h> <stdio.h> <string.h> <time.h> 一、标准定义(<stddef.h>) 文件<stddef.h>里包含了标准库的一些常用定义,无论我们包含哪个标准头文件,<stddef.h>都会被自动包含进来。 这个文件里定义: l 类型size_t (sizeof运算符的结果类型,是某个无符号整型); l 类型ptrdiff_t(两个指针相减运算的结果类型,是某个有符号整型);

l 类型wchar_t (宽字符类型,是一个整型,其中足以存放本系统所支持的所有本地环境中的 字符集的所有编码值。这里还保证空字符的编码值为0); l 符号常量NULL (空指针值); l 宏offsetor (这是一个带参数的宏,第一个参数应是一个结构类型,第二个参数应是结构 成员名。offsetor(s,m)求出成员m在结构类型t的变量里的偏移量)。 注:其中有些定义也出现在其他头文件里(如NULL)。 二、错误信息(<errno.h>) <errno.h>定义了一个int类型的表达式errno,可以看作一个变量,其初始值为0,一些标准库函数执行中出错时将它设为非0值,但任何标准库函数都设置它为0。 <errno.h>里还定义了两个宏EDOM和ERANGE,都是非0的整数值。数学函数执行中遇到参数错误,就会将errno 置为EDOM,如出现值域错误就会将errno置为ERANGE。 三、输入输出函数(<stdio.h>) 文件打开和关闭: FILE *fopen(const char *filename, const char *mode); int fclose(FILE * stream);

C语言常用排序算法

/* ===================================================================== ======== 相关知识介绍(所有定义只为帮助读者理解相关概念,并非严格定义): 1、稳定排序和非稳定排序 简单地说就是所有相等的数经过某种排序方法后,仍能保持它们在排序之前的相对次序,我们就 说这种排序方法是稳定的。反之,就是非稳定的。 比如:一组数排序前是a1,a2,a3,a4,a5,其中a2=a4,经过某种排序后为 a1,a2,a4,a3,a5, 则我们说这种排序是稳定的,因为a2排序前在a4的前面,排序后它还是在a4的前面。假如变成a1,a4, a2,a3,a5就不是稳定的了。 2、内排序和外排序 在排序过程中,所有需要排序的数都在内存,并在内存中调整它们的存储顺序,称为内排序; 在排序过程中,只有部分数被调入内存,并借助内存调整数在外存中的存放顺序排序方法称为外排序。 3、算法的时间复杂度和空间复杂度 所谓算法的时间复杂度,是指执行算法所需要的计算工作量。 一个算法的空间复杂度,一般是指执行这个算法所需要的内存空间。 ===================================================================== =========== */ /* ================================================ 功能:选择排序 输入:数组名称(也就是数组首地址)、数组中元素个数 ================================================ */ /* ==================================================== 算法思想简单描述:

C语言中常见的功能函数

C语言中常见的功能函数(应掌握的编程) 1、两个变量值的交换 void exchang(float *x,float *y) /*形参为两个变量的地铁(指针)*/ {float z; z=*x; *x=*y; *y=z; } void main() {float a,b; scanf(“%f%f”,&a,&b); exchang(&a,&b); /*因为形参是指针,所以实参必须给变量的地址,不能给变量名*/ printf(“a=%f,b=%f”,a,b); } 2、判断一个整数的奇偶 int jou(int n) /*如果是奇数返回1,否则返回0*/ { if(n%2==0) return 0; return 1; } 3、小写字符转换成大写字符 根据实参传给形参的字母,判断是否是小写字母,如果是小写字母,则转换成大写字母,否则不进行转换,函数返回转换后或原来的字符。 本函数仿照toupper()库函数的功能编写(toupper(c) 是将变量c字母转换成大写字母,如果不是小写字母不转换)。 char toupper1(char ch) {if(ch>=’a’&&ch<=’z’) ch-=32; /*小写字母比对应的大写字母ASCII码值大32*/ return ch; } 4、判断一个字符是否是字母(或数字) 根据实参传给形参的字符,判断是否是字母(或数字),如果是字母(或数字)返回1,否则返回0。此函数是根据库函数isalpha()(或isdigit())来编写的。 int isalpha1(char ch) /*判断是否是字母*/ {if(ch>=’A’&&ch<=’Z’||ch>=’a’&&ch<=’z’) return 1; else return 0; } int isdigit1(char ch) /*判断是否是数字字符*/ {if(ch>=’0’&&ch<=’9’) return 1; else return 0; } 5、根据学生成绩,返回其等级 char fun(float cj) {char c; switch((int)cj/10) {case 10:

最新C语言常用算法归纳

C语言常用算法归纳 应当掌握的一般算法 一、基本算法: 交换、累加、累乘 二、非数值计算常用经典算法: 穷举、排序(冒泡,选择)、查找(顺序即线性) 三、数值计算常用经典算法: 级数计算(直接、简接即递推)、一元非线性方程求根(牛顿迭代法、二分法)、定积分计算(矩形法、梯形法) 四、其他: 迭代、进制转换、矩阵转置、字符处理(统计、数字串、字母大小写转换、加密等)、整数各数位上数字的获取、辗转相除法求最大公约数(最小公倍数)、求最值、判断素数(各种变形)、数组元素的插入(删除)、二维数组的其他典型问题(方阵的特点、杨辉三角形) 详细讲解 一、基本算法 1.交换(两量交换借助第三者) 例1、任意读入两个整数,将二者的值交换后输出。 main() { int a,b,t; scanf("%d%d",&a,&b); printf("%d,%d\n",a,b); t=a; a=b; b=t; printf("%d,%d\n",a,b); }

【解析】程序中加粗部分为算法的核心,如同交换两个杯子里的饮料,必须借助第三个空杯子。 假设输入的值分别为3、7,则第一行输出为3,7;第二行输出为7,3。 其中t为中间变量,起到“空杯子”的作用。 注意:三句赋值语句赋值号左右的各量之间的关系! 【应用】 例2、任意读入三个整数,然后按从小到大的顺序输出。 main() { int a,b,c,t; scanf("%d%d%d",&a,&b,&c); /*以下两个if语句使得a中存放的数最小*/ if(a>b){ t=a; a=b; b=t; } if(a>c){ t=a; a=c; c=t; } /*以下if语句使得b中存放的数次小*/ if(b>c) { t=b; b=c; c=t; } printf("%d,%d,%d\n",a,b,c); } 2.累加 累加算法的要领是形如“s=s+A”的累加式,此式必须出现在循环中才能被反复执行,从而实现累加功能。“A”通常是有规律变化的表达式,s在进入循环前必须获得合适的初值,通常为0。 例1、求1+2+3+……+100的和。 main() { int i,s; s=0; i=1; while(i<=100) { s=s+i; /*累加式*/ i=i+1; /*特殊的累加式*/ } printf("1+2+3+...+100=%d\n",s); } 【解析】程序中加粗部分为累加式的典型形式,赋值号左右都出现的变量称为累加器,其中“i = i + 1”为特殊的累加式,每次累加的值为1,这样的累加器又称为计数器。 3.累乘

常用C语言标准库函数

常用C语言标准库函数 C语言编译系统提供了众多的预定义库函数和宏。用户在编写程序时,可以直接调用这些库函数和宏。这里选择了初学者常用的一些库函数,简单介绍了各函数的用法和所在的头文件。 1.测试函数 Isalnum 原型:int isalnum(int c) 功能:测试参数c是否为字母或数字:是则返回非零;否则返回零 头文件:ctype.h Isapha 原型:int isapha(int c) 功能:测试参数c是否为字母:是则返回非零;否则返回零 头文件:ctype.h Isascii 原型:int isascii(int c) 功能:测试参数c是否为ASCII码(0x00~0x7F):是则返回非零;否则返回零 头文件:ctype.h Iscntrl 原型:int iscntrl(int c) 功能:测试参数c是否为控制字符(0x00~0x1F、0x7F):是则返回非零;否则返回零头文件:ctype.h Isdigit 原型:int isdigit(int c) 功能:测试参数c是否为数字:是则返回非零;否则返回零。 头文件:ctype.h Isgraph 原型:int isgraph(int c) 功能:测试参数c是否为可打印字符(0x21~0x7E):是则返回非零;否则返回零 头文件:ctype.h Islower 原型:int islower(int c) 功能:测试参数c是否为小写字母:是则返回非零;否则返回零 头文件:ctype.h Isprint 原型:int isprint(int c) 功能:测试参数c是否为可打印字符(含空格符0x20~0x7E):是则返回非零;否则返回零 头文件:ctype.h Ispunct 原型:int ispunct(int c) 功能:测试参数c是否为标点符号:是则返回非零;否则返回零

C语言中的22个数学函数

C语言的22个数学函数 在使用C语言数学函数时候,应该在该源文件中使用以下命令行: #include <> 或#include "",这里的<>跟""分别表示:前者表示系统到存放C库函数头文件所在的目录寻找需要包含的文件,这是标准方式;后者表示系统先在拥护当前目录中寻找要包含的文件,若找不到,再按前者方式查找。为节省时间,在使用自己编写的文件时使用的是“”,自己编写的文件一般是在当前目录下。 22个数学函数中只有abs的数据类型是:”整型“,”int“。 log10、logE中的10与E是在log的左下角位置。其余求弧度函数需要看清楚是不是指数。 排列方式如下:函数名:函数功能参数介绍,返回值,说明。函数原型。 abs: 求整型x的绝对值,返回计算结果。 int abs(int x); acos:计算COS-1(x)的值,返回计算结果,x应在-1到1范围内。 double acos(double x); asin: 计算SIN-1(x)的值,返回计算结果,x应在-1到1范围内。 double asin(double x); atan: 计算TAN-1(x)的值,返回计算结果。double atan(double x); atan2: 计算TAN-1/(x/y)的值,返回计算结果。 double atan2(double x,double y); cos: 计算COS(x)的值,返回计算结果,x的单位为弧度。 double cos(double x); cosh: 计算x的双曲余弦COSH(x)的值,返回计算结果。 double cosh(double x); exp: 求e x的值,返回计算结果。 double exp(double x); fabs: 求x的绝对值,返回计算结果。 duoble fabs(fouble x); floor: 求出不大于x的最大整数,返回该整数的双精度实数。 double floor(double x); fmod: 求整除x/y的余数,返回该余数的双精度。 double fmod(double x,double y); frexp: 把双精度数val分解为数字部分(尾数)x和以2为底的指数n,即val=x*2n,n存放在eptr 指向的变量中。返回数字部分<=x<1。 double frexp(double x, double *eptr); log: 求log e x,ln x。返回计算结果。 double log(double x); log10: 求log10x。返回计算结果。 double log10(double x); modf: 把双精度数val分解为整数部分和小数部分,把整数部分存到iptr指向的单元。返回val 的小数部分。 double modf(double val,double *iptr); pow: 计算x y的值,返回计算结果。 double pow(double x,double y); rand: 产生-90到32767间的随机整数。返回随机整数。 int rand(void); sin: 计算SINx的值。返回计算结果。x单位为弧度。 double sin(double x); sinh: 计算x的双曲正弦函数SINH(x)的值,返回计算结果。 double sinh(double x); sqrt: 计算根号x。返回计算结果。x应>=0。 double sqrt(double x); tan: 计算TAN(x)的值,返回计算结果。x单位为弧度。 double tan(double x); tanh: 计算x的双曲正切函数tanh(x)的值。返回计算结果。 double tanh(double x);

相关文档
相关文档 最新文档