C语言头文件(15页).doc
-C语言头文件-第 15 页/判一个整数是否为回文素数#include <stdio.h>#include <math.h>/判一个整数是否为回文数,是返回真否则返回假char isPlalindrome(long n);/判一个整数是否为素数,是返回真否则返回假char isPrime(long n);int main() puts("29999之间的回文素数如下:"); for (long n=2;n<10000;n+) if (isPlalindrome(n)&&isPrime(n) printf("%-4ld ",n); putchar('n');/判一个整数是否为回文数,是返回真否则返回假char isPlalindrome(long n) long m=0; long s=(n>=0?n:-n); n=s; while (s) m=m*10+s%10; s/=10; return (m=n);/判一个整数是否为素数,是返回真否则返回假char isPrime(long n) if (n<2) return false; int i,k=(int)sqrt(n); for (i=2;i<=k;i+) if (n%i=0) return false; return true;/方法1:输出所有3位数的对称素数。例如:101、727都是素数并且是对称的。 #include <stdio.h>#include <math.h>/判n是否为素数,是返回真否则返回假int isPrime(long int n);int main() for (int i=100;i<1000;i+) if (isPrime(i)&&i%10=i/100) printf("%d是对称的素数n",i);/判n是否为素数,是返回真否则返回假int isPrime(long int n) long int k=(long int)sqrt(n); for (long int i=2;i<=k;i+) if (n%i=0) return false; return true;/方法2:输出所有3位数的对称素数。例如:101、727都是素数并且是对称的。 #include <stdio.h>/判n是否为素数,是返回真否则返回假char isPrime(long int n);int main() for (int i=1;i<=9;i+=2) for (int j=0;j<=9;j+) int k=101*i+10*j; if (isPrime(k) printf("%d是对称的素数n",k);/判n为素数,是素数返回真否则返回假char isPrime(long n) if (n<2) return false; if (n=2) return true; if (n%2=0) return false; for (long i=3;i*i<=n;i+=2) if (n%i=0) return false; return true;/功能:演示如何建立一个简单的菜单/编写者:王灿辉,版本号:1.0,编写时间:2011-1-6#include <stdio.h>#include <ctype.h> /toupper#include <string.h> /strchr#include <conio.h> /getche#define S_NUM 35 /选择菜单表头的星号数目#define MAX_MENU 255 /功能选择菜单的最大行数/显示表头的n个字符(ch)inline void show_table_head(int n,char ch);/显示功能选择菜单/入口参数:存放允许用户选择的所有(大写)字符,格式形如:“A,B,C,D,Q”void show_menu(char *);/获得用户的选择。返回值:用户按下的字符(被转为大写)char get_choice(void);int main() char choice; /用户按下的字符(被转为大写) while (choice=get_choice()!='Q') switch (choice) case 'I': printf("an输入信息。nn"); break; case 'O': printf("an输出信息。nn"); break; case 'T': printf("an输出统计信息。nn"); break; case 'F': printf("an查找并输出信息。nn"); break; case 'D': printf("an查找并删除信息。nn"); break;/显示表头的n个字符(ch)inline void show_table_head(int n,char ch) if (n<1) return; for (int i=0;i<n;i+) putchar(ch); putchar('n');/显示功能选择菜单/入口参数:存放允许用户选择的所有(大写)字符,格式形如:“A,B,C,D,Q”void show_menu(char *select_str) /存放功能选择菜单,要求:每行的第一个字符必须为选择字符,最后一行一般是“Q:退出系统”! const static char *menu= "I:输入信息", "O:输出信息", "T:输出统计信息", "F:查找并输出信息", "D:查找并删除信息", "Q:退出系统" show_table_head(S_NUM,'*'); /显示E_NUM个'*' for (int i=0,j=0;i<sizeof(menu)/sizeof(menu0);i+) printf("%-4s%-*s*n","*",S_NUM-5,menui); if (i>0) select_strj+=',' select_strj+=toupper(menui0); select_strj+='0' show_table_head(S_NUM,'*'); /显示E_NUM个'*' printf("请选择(%s):",select_str);/获得用户的选择。返回值:用户按下的字符(被转为大写)char get_choice(void) char select_strMAX_MENU*2; /存放允许用户选择的所有(大写)字符,格式形如:“A,B,C,D,Q” char choice; while (1) show_menu(select_str); /显示功能选择菜单 choice=toupper(getche(); /非缓冲有回显输入 putchar('n'); if (strchr(select_str,choice)&&choice!=',') break; printf("an选择错误,请重新选择.nn"); return choice;给定整数N(2=<N<=8),产生所有其前任意位都是质数的N位质数。如:7331就是一个这样的4位质数,因为7、73、733都是质数。要求:按升序输出所有符合要求的质数。例如:输入N=2,则必须按序输出下面的9个质数:23 29 31 37 53 59 71 73 79#include <stdio.h>/判n是否为质数,是返回真否则返回假。int isPrime(long int n) if (n<2) return false; for (long int i=2;i*i<=n;i+) if (n%i=0) return false; return true;int main() int n=0; printf("请输入一个28之间的整数:"); scanf("%d",&n); if (n<2|n>8) puts("输入的整数不在28之间!"); return -1; /计算下界(10n-1)和上界(10n) long int i=0,down=10; for (i=n-1;i>1;i-) down*=10; long int up=down*10; int count=0; /符合要求的质数的数目 for (i=down;i<up;i+) if (isPrime(i) /i是质数 /判其前任意位是质数? for (long int prime=i,j=down;j>=10;j/=10) if (!isPrime(prime/j) break; if (j<10) /其前任意位都是质数 printf("%dt",i); /输出 count+; printf("n符合要求的%d位质数共有%d个。n",n,count); return 0;/产生伪随机数的函数及其测试程序#include <stdio.h>static unsigned long int next=1; /种子int rand1(void) /产生伪随机数的魔术般的公式 next*=1103515245+12345; return (unsigned int)(next/65536)%32768;void srand1(unsigned int seed) next=seed;/跳过本行剩余的其他字符和<回车>键inline void eatline(void) while (getchar()!='n') continue;int main(void) unsigned int seed; printf("请输入你选定的种子:"); while (scanf("%u",&seed)=1) srand1(seed); /重置种子 for (int i=0;i<8;i+) printf("%hdt",rand1(); eatline(); printf("n请输入下一个种子(按q退出):");/“打鱼还是晒网”。某人从2000年1月1日20岁开始“三天打鱼两天晒网”,问某天该人在打鱼还是在晒网。#include<stdio.h>/从那一年开始“三天打鱼两天晒网”#define YEAR 2000 /开始“三天打鱼两天晒网”的年龄#define AGE 20/可以“三天打鱼两天晒网”的最大年龄#define MAX_AGE 100/判指定年份(year)是否为闰年?inline bool isLeapYear(int year);/获得指定年(year)、月(month)对应的天数,如:2011年5月有31天/错误条件:如果月份错误则返回-1int getDaynumOfMonth(int year,int month);int main() int i,y,m,d; while (1) printf("请输入日期(年.月.日),用q退出:"); if (scanf("%d.%d.%d",&y,&m,&d)!=3) break; while (getchar()!='n'); /跳过该行的其他输入和<回车>键 if (y<YEAR-AGE) puts("那一年他还没有出生!"); continue; if (y<YEAR) puts("那一年他还没有开始打鱼!"); continue; if (y-YEAR>MAX_AGE) printf("他已经超过%d岁,还能打鱼?n",MAX_AGE); continue; if (m<1|m>12) puts("月份只能在112之间"); continue; if (d<1) puts("日期必须大于0!"); continue; int days=getDaynumOfMonth(y,m); if (d>days) printf("%d年%d月只有%d天!n",y,m,days); continue; days=d; /加上前面几年的天数,每年365天或366天(闰年) for (i=y-1;i>=YEAR;i-) days+=365+isLeapYear(i); /加上前面几个月的天数 for (i=m-1;i>=1;i-) days+=getDaynumOfMonth(y,i); days %= 5; if (days=1|days=2|days=3) puts("他正在打鱼."); else puts("他正在晒网."); return 0;/判指定年份(year)是否为闰年?inline bool isLeapYear(int year) return (year%4=0 && year%100!=0)|(year%400=0);/获得指定年(year)、月(month)对应的天数,如:2011年5月有31天/错误条件:如果月份错误则返回-1int getDaynumOfMonth(int year,int month) static const int day_num=31,-1,31,30,31,30,31,31,30,31,30,31; if (month<1 | month>12) return -1; /月份错误 if (month!=2) return day_nummonth-1; else return (isLeapYear(year)?29:28);程序的运行过程和输出结果如下:请输入日期(年.月.日),用q退出:1977.7.7那一年他还没有出生!请输入日期(年.月.日),用q退出:1988.8.8那一年他还没有开始打鱼!请输入日期(年.月.日),用q退出:2111.1.1他已经超过100岁,还能打鱼?请输入日期(年.月.日),用q退出:2000.0.1月份只能在112之间请输入日期(年.月.日),用q退出:2000.1.0日期必须大于0!请输入日期(年.月.日),用q退出:2000.2.302000年2月只有29天!请输入日期(年.月.日),用q退出:2000.1.1他正在打鱼.请输入日期(年.月.日),用q退出:2000.1.3他正在打鱼.请输入日期(年.月.日),用q退出:2000.1.4他正在晒网.请输入日期(年.月.日),用q退出:2000.1.5他正在晒网.请输入日期(年.月.日),用q退出:2000.1.6他正在打鱼.请输入日期(年.月.日),用q退出:2000.2.1他正在打鱼.请输入日期(年.月.日),用q退出:2000.2.3他正在晒网.请输入日期(年.月.日),用q退出:2001.1.1他正在打鱼.请输入日期(年.月.日),用q退出:2001.1.2他正在打鱼.请输入日期(年.月.日),用q退出:2001.1.3他正在晒网.请输入日期(年.月.日),用q退出:2001.1.5他正在打鱼.请输入日期(年.月.日),用q退出:2011.10.10他正在打鱼.请输入日期(年.月.日),用q退出:q/利用全局变量实现swap函数。演示全局变量(外部变量)的定义、声明(说明)和使用/全局变量(外部变量)是实现函数之间数据通讯的有效手段,但绝不是一种好的手段。/外部变量可加强函数模块之间的数据联系,但是又使函数要依赖这些变量,/本例中的函数main、swap均依赖于(外部)全局变量x和y,因而使得函数的独立性降低#include <stdio.h>int x,y;/(外部)全局变量(的定义),初值为0void swap(void) /在函数前定义的全局变量,在该函数内使用可不再加以说明 int t=x; x=y; y=t; return;int main() extern int x,y; /该声明可省略,但明确写出来,可以知道这里有访问全局变量,这是一个好的习惯! x=3; y=5; printf("交换前全局变量x=%d,y=%dn",x,y); swap(); /利用全局变量实现值交换 printf("交换后全局变量x=%d,y=%dn",x,y); return; /可以省略,但最好写出来!/输入任意一个整数,输出不小于该整数的一对孪生素数。/孪生素数即相差2的一对素数。例如3和5 ,5和7,11和13,10016957和10016959等等都是孪生素数。 #include <stdio.h>#include <math.h>/判n是否为素数,是返回真否则返回假int isPrime(long int n);int main() long int n; printf("请输入一个整数:"); scanf("%ld",&n); while (!isPrime(n)|!isPrime(n+2) n+; printf("%ld,%ld是一对孪生素数n",n,n+2);/判n是否为素数,是返回真否则返回假int isPrime(long int n) long int k=(long int)sqrt(n); for (long int i=2;i<=k;i+) if (n%i=0) return false; return true;#include <stdio.h>/判一个整数是否为回文数char isPlalindrome(long n);int main() for (long n=-999;n<=999;n+) if (isPlalindrome(n) printf("%-4ld ",n); putchar('n');char isPlalindrome(long n) long m=0; long s=(n>=0?n:-n); n=s; while (s) m=m*10+s%10; s/=10; return (m=n);/全局变量和局部变量#include <stdio.h>static int x;/仅在本文件可以使用的全局变量int y=1;/在本程序(其他文件的函数)中都可以使用的全局变量int main() extern int x; /引用全局变量,该语句可以省略,但明确写出来是更好的习惯 /声明该变量在函数外部定义,不能进行初始化,也不能在该函数中再定义。 /extern int y; 如果有该语句则下面的int y=2;将报告重定义错误! printf("x=%dty=%dn",x,y); /输出(全局变量)x=0(未初始化的全局变量被自动初始化为0)和y=1 x=1; /修改全局变量的值 int y=2; /新定义的局部变量并初始化,将覆盖掉全局变量 printf("x=%dty=%dn",x,y); /输出x=1(全局变量)和y=2(局部变量)/输出130000之间的所有"亲密数"。/一个数A的所有因子之和为B,而B的所有因子之和正好是A,则称A和B是"亲密数"/如果A又正好等于B,则称A为“完数”,如:6=1+2+3则为“完数”。/220和284是"亲密数"。/220的所有因子之和:1+2+4+5+10+11+20+22+44+55+110=284/284的所有因子之和:1+2+4+71+142=220#include <stdio.h>#define MAX 30000/计算给定正整数的所有因子之和unsigned int func(unsigned int n) for (unsigned int s=0,i=1;i<=n/2;i+) if (n%i=0) s+=i; return s;int main() for (unsigned a=1;a<=MAX;a+) if (func(func(a)=a) printf("%dt%dn",a,func(a);/输出2-N之间的所有"完数",即:一个数正好等于其因子之和,如:6=1+2+3#include <stdio.h>/判给定的正整数是否是"完数"char func(int n) for (int s=0,i=1;i<=n/2;i+) if (n%i=0) s+=i; return (s=n);int main() int i,n; printf("Input integer value(>=2) : "); scanf("%d",&n); if (n>=2) for (i=2;i<=n;i+) if (func(i) printf("%8d",i); else printf("Input value error !"); printf("n");/演示全局变量、局部变量、语句块变量等及其相互覆盖(作用域)的规则!#include <stdio.h>int x=11; /全局变量/用于保存本程序中定义的所有5个不同的变量x的地址int *p1,*p2,*p3,*p4,*p5;void func(int x) p4=&x; printf("函数func中,全局变量:x的值为:%dt地址为:%pn",:x,&:x); printf("函数func的形式参数x的值为:%dtt地址为:%pn",x,&x); x=21; /改变函数func的形式参数(其实也是函数func的局部变量)x的值 printf("函数func的形式参数x的值为:%dtt地址为:%pn",x,&x); int x=22; /函数func语句块中的变量 p5=&x; /在语句块中无法访问“函数func的形式参数x” printf("函数func语句块中的变量x的值为:%dt地址为:%pn",x,&x); :x=13; /改变全局变量x的值 printf("函数func语句块中,全局变量:x的值为:%dt地址为:%pn",:x,&:x); :x=14; /改变全局变量x的值 printf("函数func中,全局变量:x的值为:%dt地址为:%pn",:x,&:x); printf("函数func的形式参数x的值为:%dtt地址为:%pn",x,&x); int main() p1=&:x; printf("函数main中,全局变量x的值为:%dtt地址为:%pn",x,&x); printf("函数main中,全局变量:x的值为:%dt地址为:%pn",:x,p1); x=12; /改变全局变量x的值 printf("函数main中,全局变量x的值为:%dtt地址为:%pn",x,&x); int x=31; /函数main的局部变量 p2=&x; printf("函数main的局部变量x的值为:%dtt地址为:%pn",x,&x); func(x); printf("函数main的局部变量x的值为:%dtt地址为:%pn",x,&x); int x=32; /函数main语句块中的变量 p3=&x; /在语句块中无法访问“函数main的局部变量x” printf("函数main语句块中的变量x的值为:%dt地址为:%pn",x,&x); :x=15; /改变全局变量x的值 printf("函数main语句块中,全局变量:x的值为:%dt地址为:%pn",:x,&:x); :x=16; /改变全局变量x的值 printf("函数main中,全局变量:x的值为:%dt地址为:%pn",:x,&:x); printf("函数main的局部变量x的值为:%dtt地址为:%pn",x,&x); printf("n 实际上,在本程序中共定义了5个不同的变量x:n"); printf("(1)全局变量%p:有变量覆盖时使用:x引用;n",p1); printf("(2)函数main的局部变量%p;n",p2); printf("(3)函数main语句块中的变量%p;n",p3); printf("(4)函数func的形式参数%p;n",p4); printf("(5)函数func语句块中的变量%p。n",p5);输出结果形如:函数main中,全局变量x的值为:11 地址为:00422A30函数main中,全局变量:x的值为:11 地址为:00422A30函数main中,全局变量x的值为:12 地址为:00422A30函数main的局部变量x的值为:31 地址为:0012FF7C函数func中,全局变量:x的值为:12 地址为:00422A30函数func的形式参数x的值为:31 地址为:0012FF28函数func的形式参数x的值为:21 地址为:0012FF28函数func语句块中的变量x的值为:22 地址为:0012FF1C函数func语句块中,全局变量:x的值为:13 地址为:00422A30函数func中,全局变量:x的值为:14 地址为:00422A30函数func的形式参数x的值为:21 地址为:0012FF28函数main的局部变量x的值为:31 地址为:0012FF7C函数main语句块中的变量x的值为:32 地址为:0012FF78函数main语句块中,全局变量:x的值为:15 地址为:00422A30函数main中,全局变量:x的值为:16 地址为:00422A30函数main的局部变量x的值为:31 地址为:0012FF7C 实际上,在本程序中共定义了5个不同的变量x:(1)全局变量00422A30:有变量覆盖时使用:x引用;(2)函数main的局部变量0012FF7C;(3)函数main语句块中的变量0012FF78;(4)函数func的形式参数0012FF28;(5)函数func语句块中的变量0012FF1C。#include <stdio.h>#include <math.h>/判n是否为素数,是返回真否则返回假int isPrime(long int n);int main() /输出2至2000之间的所有素数 puts("2至2000之间的所有素数:"); for (int i=2;i<=2000;i+) if (isPrime(i) printf("%5d",i); putchar('n'); /验证哥德巴赫猜想:任一充分大的偶数,可以用两个素数之和表示 long int n,p=1,q; printf("n请输入一个偶数:"); scanf("%ld",&n); do p+; q=n-p; while (!isPrime(p) | !isPrime(q); printf("%ld=%ld+%ldn",n,p,q);/判n是否为素数,是返回真否则返回假int isPrime(long n) if (n<2) return false; long int i,k,isPrimer; /变量与函数名相同! isPrimer=true,k=(int)sqrt(n); for (i=2;i<=k;i+) if (n%i=0) isPrimer=false;break; return isPrimer;/验证哥德巴赫猜想#include <stdio.h>/n是素数返回真,否则的返回假bool isprime(int n);int main() int n; printf("请输入一个大于2的偶数:"); scanf("%d",&n); if (n<2|n%2) printf("输入错误!n"); return -1; for(int i=2;i<=n/2;i+) if( isprime(i) && isprime(n-i) ) printf("%d = %d + %dn",n,i,n-i); break; return 0;/n是素数返回真,否则的返回假bool isprime(int n) for(int i=2;i*i<=n;i+) if(n%i=0) return false; return true;/验证哥德巴赫猜想:大于5的所有奇数均是三个素数之和#include <stdio.h>#include <math.h>/判n是否为素数,是返回真否则返回假int isPrime(long int n);int main() long int n,i,j,k; for (n=7;n<1000;n+=2) int found=false; for (i=2;i<=n-4&&!found;i+) for (j=2;j<=n-i-2&&!found;j+) k=n-i-j; if (isPrime(i)&&isPrime(j)&&isPrime(k) printf("%03ld=%ld+%ld+%ldt",n,i,j,k); found=true;/判n是否为素数,是返回真否则返回假int isPrime(long n) if (n<2) return false; long int i,k,isPrimer; /变量与函数名相同! isPrimer=true,k=(int)sqrt(n); for (i=2;i<=k;i+) if (n%i=0) isPrimer=false;break; return isPrimer;/已知函数poly是用递归方法计算x的n阶勒让德多项式的值,数学函数如下:/n=0 1 /n=1 ploy1(x)=x/n>1 (2n-1)*x*polyn-1(x)-(n-1)*polyn-2(x)/n#include <stdio.h>double poly(double x,int n) if (n<=0) return 1; if (n=1) return x; return (2*n-1)*x*poly(x,n-1)-(n-1)*poly(x,n-2)/n;int main() int n; double x; printf("n请输入一个实数x的值和多项式的系数n:"); scanf("%lf%d",&x,&n); printf("x的n阶勒让德多项式的值为:%lfn",poly(x,n);/用递归方法实现求和:1+2+.+n#include <stdio.h>int f(int n) if (n<=0) return 0; return