tceic.com
简单学习网 让学习变简单
当前位置:首页 >> 学科竞赛 >>

李秉璋《C程序设计与训练》(第二版)各章例题


第2章 【例 2-1】分析程序并运行。 #include <stdio.h> int main () { printf("%c %c %s %s\n", '\' ', return 0; }

'\\',

"ab\"c\"",

"a\\b");

【例 2-2】符号常量的使用。 #include <stdio.h> #define PI 3.14 int main() { float r,s,v; scanf (" %f", &r); // 输入圆球的半径 s= 4 * PI * r * r; // 求圆球的表面积 v= s * r / 3; // 求圆球的体积 printf(" s=%f, v=%f \n", s, v); return 0; } 【例 2-3】 整型变量的定义与使用。 #include <stdio.h> int main() { int a, b; // 定义有符号整型变量 a 和 b long c; // 定义有符号长整型变量 c unsigned e; // 定义无符号整型变量 e a=-1; b=523; c=623789; e=89; printf("a=%d, b=%d, c=%ld, e=%u\n", a, b, c, e); return 0; } 【例 2-4】写出下列程序的运行结果。 #include <stdio.h> int main() { int a=2147483647, b; b=a+1; printf(“a=%d, b=%d\n”,a,b); return 0; }

【例 2-5】 大小写字母的转换。

#include <stdio.h> int main() { char c1,c2; c1='a'; c2='b'; c1=c1-32; c2=c2-32; // 字符型数据进行减法运算 printf("%c %c\n",c1,c2); printf("%d %d\n",c1,c2); return 0; } 【例 2-6】 整型数的五种算术运算。 #include <stdio.h> int main() { int x, y ; x = 11; y = 6; printf("x=%d,y=%d\n",x,y); printf("x+y=%d\n",x+y); printf("x-y=%d\n",x-y); printf("x*y=%d\n",x*y); printf("x/y=%d, 余数=%d\n",x/y, x%y); return 0; } 【例 2-7】自增、自减运算符前置、后置形式的差异。 #include <stdio.h> int main() { int k1,k2, x, y; k1=10 ; k2=10; x=k1++; y=++k2; printf("k1=%d, k2=%d, x=%d, y=%d\n",k1++, ++k2,x,y); k1=10 ; k2=10; x=--k1;y=k2--; printf("k1=%d, k2=%d, x=%d, y=%d\n",--k1,k2--,x,y); return 0; } 【例 2-8】sizeof 运算符应用举例(在 VC++ 6.0 环境下调试运行) 。
#include <stdio.h> int main() { char ch,str[20]; int T1, T2[10]; float F[10]; double D[10]; // str 为字符数组 // T2 为整型数组 // F 为单精度浮点型数组 // D 为双精度浮点型数组

printf("%d\t%d\t%d\t%d\n",sizeof(char),sizeof(int),sizeof(float),sizeof(double)); printf("%d\t%d\t%d\n", sizeof(ch), sizeof str, sizeof "abcd"); printf("%d\t%d\n",sizeof(F),sizeof(D)); return 0; }

【例 2-9】 输入两个数,输出其中最大的数。 #include <stdio.h> int main(){ int a,b; printf("\n Input two numbers: "); scanf("%d%d",&a,&b); printf("Max=%d",a>b?a:b); return 0; } 【例 2-10】指针的简单应用。 #include <stdio.h> int main(){ int *p1, *p2, *p, a,b; printf("请输入 a 和 b 的值:"); scanf("%d %d",&a, &b); p1=&a; p2=&b; // p1 指向 a,p2 指向 b printf("%d\t%d\n",*p1,*p2);// 间接访问 a,b 输出 a,b 的值 if (a<b){ // 如果 a<b,交换 p1,p2 的值,使 p1 指向 b,p2 指向 a p=p1; p1=p2; p2=p; } printf("%d\t%d\n",a,b);// 直接访问 a,b 输出 a,b 的值 printf("%d\t%d\n",*p1,*p2); // 间接访问 p1 指向的变量和 p2 指向的变量 return 0; }

【例 2-11】 位运算应用。 #include <stdio.h> int main() { char a='a',b='b'; // 'a'的 ASCII 码值为 0x61,'b'的 ASCII 码值为 0x62 int p,c,d; short f=0xa0a0, g= 0x0a0a; p=a; p=(p<<8)|b; // p 的值向左移动 8 位,结果为 0x6100,再与 b 进行位或运算,结果为 0x6162 d=(p&0xff) + 2; // p 的值为 0x6162, 其值与 0xff 位与运算再加 2 的结果为 0x64,

// 赋值给变量 d c=((p&0xff00)>>8) +2 ; // p 的值为 0x6162,其值与 0xff00 位与结果为 0x6100,向右 移 // 动 8 再加 2 结果为 0x63, 并赋值给变量 c printf("a=%x b=%x c=%x d=%x\n",a,b,c,d); printf("f>>3=%hx f<<3=%hx g>>3=%hx g<<3=%hx\n",f>>3,f<<3,g>>3,g<<3); printf("f=%hx g=%hx \n",f, g); return 0; } 【例 2-12】 强制类型转换示例。 #include <stdio.h> int main() { float x; int i; x=13.62; i=(int)x; printf("x=%f,i=%d\n",x,i); return 0; } 第3章 【例 3-1】单个字符输入、输出示例(getchar( )和 putchar( )函数)。 #include <stdio.h> int main() { char c; c=getchar(); putchar(c); return 0; } 【例 3-2】 printf()函数应用示例。
#include <stdio.h> #define PI 3.141593 int main() { int num=9; float exp=13.5; int cost=3100; printf("The %d CEOs drank %f cups of coffee.\n",num,exp); printf("The value of PI is %f.\n", PI); printf("It is fine today. \n"); printf("%c%d%c",'$', 2*cost, '\n' ); return 0;

}

【例 3-3】用 scanf( )函数应用示例。 #include <stdio.h> int main() { int age; float assets; printf("请输入年龄和资产: "); scanf("%d %f",&age,&assets); printf("%d $%.2f \n",age,assets); return 0; }

// 非格式控制字符串 // 仅有格式控制字符串

【例 3-4】输入三角形的三边,用海伦公式求三角形面积。 #include <math.h> #include <stdio.h> int main() { float a,b,c,p,area; printf("请输入三角形三边 a,b,c 的长度:"); scanf("%f,%f,%f",&a,&b,&c); p=(a+b+c)/2.0; area=sqrt(p*(p-a)*(p-b)*(p-c)); printf("a=%7.2f\t b=%7.2f\t c=%7.2f\t p=%7.2f\n",a,b,c,p); printf("三角形面积=%7.2f\n",area); return 0; } 【例 3-5】从键盘输入一个大写字母,改用小写字母输出。 #include <stdio.h> #include <conio.h> int main() { char c1,c2; c1=getch(); printf("\n%c,%d\n",c1,c1); c2=c1+32; printf("%c,%d\n",c2,c2); return 0; } 【例 3-6】编写程序,输入一个三位正整数,将该数逆序后输出。如输入 123,则输出 321。 #include <stdio.h> int main()

{

int n; printf("请输入一个三位正整数:"); scanf("%3d", &n); printf("这个三位正整数的值是:%d%d%d\n",n%10, n%100/10, n/100); return 0;

} 【例 3-7】 写出下面程序的输出结果。 #include <stdio.h> int main() { int a=4,b=7,c=-5; float x=12.3456, y=-246.135; char ch='B'; long n=7654321; unsigned u=65535; printf("%d\t%d\t%d\n",a,b,c); printf("%3d%3d%3d\n",a,b,c); printf("%f,%f\n",x,y); printf("%8.2f,%8.2f,%4f,%4f\n,%3f,%3f\n",x,y,x,y,x,y); printf("%e,%10.2e\n",x,y); printf("%c,%d,%o,%x\n",ch,ch,ch,ch); printf("%ld,%lo,%lx\n",n,n,n); printf("%u,%o,%x,%d\n",u,u,u,u); printf("%s,%7s\n","Over!","Thanks"); return 0; } 【例 3-8】用“scanf("%4d%4d%c%c%f%f%*f%f", &a, &b, &ch1, &ch2, &x, &y, &z);” 输入数据,使 a=22,b=44,ch1= 'A ',ch2='z ',x=2.24,y=-4.5,z=12.3。请问在键盘上如 何输入? #include <stdio.h> int main() { int a, b; float x, y, z; char ch1, ch2; scanf("%4d%4d%c%c%f%f%*f%f", &a, &b, &ch1, &ch2, &x, &y, &z); printf("%4d%4d% c%c%f %f %f\n", a,b, ch1, ch2,x, y,z); return 0; } 【例 3-9】 分析下列程序中运行结果。 #include <stdio.h> int main()

{

int a=2,b=4,c=6; a+=b+=c; printf("%d\n",a<b?b:a); printf("%d\n",a<b?a++:b++); printf("%d,%d\n",a,b); printf("%d\n",c+=a>b?a++:b++); printf("%d,%d\n",b,c); a=5;b=c=7; return 0;

//A 行 // B 行 // C 行 // D 行 // E 行 // F 行 // G 行

} 【例 3-10】分析下列程序运行结果。 #include <stdio.h> int main() { int a=3, b=7, x, y; x=a++*a++*a++; y=--b*--b*--b; printf("a=%d, x=%d\n",a, x); printf("b=%d, y=%d\n",b, y); return 0; } 【例 3-11】输入两个整数,请按从小到大的顺序输出。 方法一: #include<stdio.h> int main() { int x,y,t; printf("\n 请输入 x,y: "); scanf("%d,%d",&x,&y); t=(x<y)?x:y; // 求出 x 和 y 的最小值 t y=x+y-t; // 求 x 和 y 的最大值,赋值给 y x=t; printf("从小到大输出这两个数是:%d %d \n",x,y); return 0; } 方法二: #include <stdio.h> #include <math.h> int main() { int x,y,z,t; printf("\n 请输入 x,y: "); scanf("%d,%d",&x,&y); t=(x+y-abs(x-y))/2; y=x+y-t;

x=t; printf("从小到大输出这两个数是:%d %d\n",x,y); return 0; } 第4章 【例 4-3】编写程序,从键盘输入三个互不相同的整数,如果这三个数是按从大到小顺 序输入,则输出 1,否则输出 0。 #include <stdio.h> int main() { int a,b,c; printf("请输入 3 个不相同的整数:"); scanf("%d %d %d", &a,&b,&c); printf("%d\n", (a>b)&&(b>c)); return 0; } 【例 4-4】输入一个整数,若该整数为正数则输出,否则不输出。 #include <stdio.h> int main() { int x; scanf("%d", &x); if(x>0) printf("%d \n", x); return 0; } 【例 4-5】输入一个学生的成绩,判断其是否合格。 #include <stdio.h> int main() { int x; scanf("%d", &x); if(x>=60) printf("该生成绩合格。\n"); else printf("该生成绩不合格。\n"); return 0; } 【例 4-6】输入一个学生的成绩(分数) ,输出该成绩对应的等级。 #include <stdio.h> int main() { int x; scanf("%d",&x); if(x>=90) printf("A");

else if(x>=80) printf("B"); else if(x>=70) printf("C"); else if(x>=60) printf("D"); else printf("E"); return 0; } 【例 4-7】比较两个数的大小。 程序 1。 #include <stdio.h> int main() { int a,b; printf("Please input a,b: "); scanf("%d,%d",&a,&b); if(a!=b) if(a>b) printf("a>b\n"); else printf("a<b\n"); else printf("a=b\n"); return 0; } 程序 2。 #include <stdio.h> int main() { int a,b; printf("Please input a,b: "); scanf("%d,%d",&a,&b); if(a==b) printf("a=b\n"); else if(a>b) printf("a>b\n"); else printf("a<b\n"); return 0; } 【例 4-8】根据下列分段函数,输入 x 的值,计算并输出 y 的值。
? x ? 63 ( x能同时被7和9整除) ? y ? ?7 x ( x不能被7整除) ?x (其他) ?
#include <stdio.h> int main() { int x,y; printf("请输入一个数 x: "); scanf("%d",&x); y=x; if (x%7==0) { // A // B x 能被 7 整除

if (x%9==0) // C x 能同时被 7 和 9 整除

y=x+63; }else y=7*x; //D x 不能被 7 整除

printf("x=%d,\ty=%d",x,y); return 0; }

【例 4-9】从键盘输入公元年数,判断该年是否为闰年。 #include <stdio.h> int main() { int year,leap = 0; printf("请输入年数:"); scanf("%d",&year); if (year%4==0) { // A if (year%100==0) { if (year%400==0) { leap = 1; } }else { leap =1; } } // B if (leap) { printf("%d 年是闰年!\n",year); }else{ printf("%d 年不是闰年!\n",year); } return 0; } 【例 4-10】从键盘输入一个 0 到 6 之间的整数,输出对应星期的英文单词。 程序如下: #include <stdio.h> int main() { int day; printf("请输入一个 0~6 之间的整数:"); scanf("%d",&day); switch (day) { case 0: printf("Sunday\n"); case 1: printf("Monday\n"); case 2: printf("Tuesday\n"); case 3: printf("Wednesday\n"); case 4: printf("Thursday\n"); case 5: printf("Friday\n");

case 6: printf("Saturday\n"); default: printf("error\n"); } return 0; } #include <stdio.h> int main() { int day ; printf("请输入一个数字:"); scanf("%d",&day); switch (day) { case 0: printf("Sunday\n"); break; case 1: printf("Monday\n"); break; case 2: printf("Tuesday\n"); break; case 3: printf("Wednesday\n"); break; case 4: printf("Thursday\n"); break; case 5: printf("Friday\n"); break; case 6: printf("Saturday\n"); break; default: printf("error\n"); break; } return 0; } 【例 4-11】例 4-6 利用 if 语句计算成绩对应的等级,用 switch 语句实现,其源程序 如下。

#include <stdio.h> int main() { int x; scanf("%d",&x); switch (x/10) { case 10: case 9: printf("A\n"); break; case 8: printf("B\n"); break; case 7: printf("C\n"); break; case 6: printf("D\n"); break; default:printf("E\n"); } return 0; }

// x=100 // x>=90 && x<100 // x>=80 && x<90 // x>=70 && x<80 // x>=60 && x<70 // x<60

【例 4-12】分析下列两个程序,写出其运行结果。 程序 1 #include <stdio.h> int main() { int a=3,b=2,c=1; printf("%d\t%d\t%d\t%d\n",a>b>c, a<b<c, a==b==c, a=b=c); return 0; } 程序 2 #include <stdio.h> int main() { int a=3,b=2,c=1; printf("%d\t", a>b>c); printf("%d\t", a<b<c); printf("%d\t", a==b==c); printf("%d \n",a=b=c); return 0; } 【例 4-13】输入三个整数,按从小到大的顺序输出。 #include<stdio.h>

main() { int x,y,z,t; printf("\n 请输入 x,y,z: "); scanf("%d,%d,%d",&x,&y,&z); if (x>y) {t=x;x=y;y=t;} /*交换 x、y 的值*/ if(x>z) {t=z;z=x;x=t;} /*交换 x、z 的值*/ if(y>z) {t=y;y=z;z=t;} /*交换 z、y 的值*/ printf("从小到大输出:%d %d %d\n",x,y,z); return 0; } 【例 4-14】 写一个程序,求一元二次方程的根。 #include <stdio.h> #include <math.h> int main() { float a,b,c,d,term1,term2; printf("请输入 a,b,c:"); scanf("%f,%f,%f",&a,&b,&c); if (a==0) printf("不是一元二次方程\n"); else { d=b*b-4*a*c; term1=-b/(2*a); term2=sqrt(fabs(d))/(2*a); if (d<0) { printf(" 方程的两个共轭复根是:%8.2f+%8.2fi\n",term1,term2); printf("\t\t\t%8.2f-%8.2fi\n",term1,term2); }else{ printf(" 方程的两个实根是:%8.2f\n",term1+term2); printf("\t\t %8.2f\n",term1-term2); } } return 0; } 【例 4-15】输入一个小于 1000 的正整数,要求: #include <stdio.h> int main() { int n,n2,n1,n0, digit,rn; printf("请输入一个小于 1000 的正整数 n:");

scanf("%d",&n); n2=n/100; n1=n%100/10; n0=n%10; digit=3; if(n2==0) { digit=2; if (n1==0) digit=1; } printf("\n%d 是%d 位数\n",n,digit); printf("该数的每一位数字分别是:"); switch(digit) { case 3: printf("%d,%d,%d",n2,n1,n0); break; case 2: printf("%d,%d",n1,n0); break; case 1: printf("%d",n0); } // 求该数的逆数 switch(digit) { case 3: rn = n0*100+n1*10+n2; break; case 2: rn = n0*10+n1; break; case 1: rn = n0; } printf("\n 按逆序输出该数为:%d\n", rn); return 0; } 【例 4-16】编写一个菜单控制程序,根据输入的选择项,程序完成不同的功能。假设 菜单的形式为: L——装入文件 E——编辑文件 S——保存文件 P——打印文件 X——退出
#include <stdio.h> void main( ) { char key; printf(" printf(" printf(" L——装入文件\n"); E——编辑方式\n"); S——保存文件\n");

printf(" printf(" printf(" switch(key) { case 'L': case 'l':

P——打印文件\n"); X——退出\n"); ——请输入一个选项:");

key=getchar( );

printf("您选择了装入文件选项。\n"); case 'E': case 'e': printf("您选择了编辑方式选项\n"); case 'S': case 's': printf("您选择了保存文件选项。\n"); case 'P': case 'p': printf("您选择了打印文件选项。\n"); case 'X': case 'x': printf("您选择了退出程序选项。\n"); default: printf("请您选择了错误的选项!\n"); } }

break;

break;

break;

break;

break;

第5章 【例 5-1】 用 while 语句求 n 的阶乘。 #include <stdio.h> int main() { int n, m; float fact; printf("请输入 n 的值: "); scanf("%d",&n); m = n; fact=1; while(m>0) fact*=m--; printf("%d!=%10.0f\n", n,fact); return 0; } 【例 5-2】 用 do-while 语句求 n 的阶乘。 #include <stdio.h> int main()

{

int n, m; float fact; printf("请输入 n 的值: "); scanf("%d",&n); m = n; fact=1; do fact*=m--; while (m>0); printf("%d!=%10.0f\n", n,fact); return 0; 【例 5-3】 用 for 语句求 n 的阶乘。 形式 1:for 语句中有完整的三个表达式。 // 5-3a.cpp #include <stdio.h> int main() { int n, i; float fact=1; printf("请输入 n 的值: "); scanf("%d",&n); for (i=1; i<=n; i++) fact*=i; printf("%d!=%10.0f\n", n,fact); return 0; } 形式 2:表达式 1 从 for 语句中移到 for 语句的前面,但表达式 1 后的分号要保留。 // 5-3b.cpp #include <stdio.h> int main() { int n, i; float fact=1; printf("请输入 n 的值: "); scanf("%d",&n); i=1; for ( ; i<=n; i++) fact*=i; printf("%d!=%10.0f\n", n,fact); return 0; } 形式 3:表达式 1 移到 for 语句的前面,表达式 3 移到循环体中,分号保留,这时 for // 5-3c.cpp #include <stdio.h> int main() { int n, i;

}

float fact=1; printf("请输入 n 的值: "); scanf("%d",&n); i=1; for ( ; i<=n; ) { fact*=i; i++; } printf("%d!=%10.0f\n", n,fact); return 0; } 形式 4: 表达式 1 移到 for 语句的前面, 表达式 2 和表达式 3 都移到循环体中, 这时 for 后面括号中仅保存分隔三个表达式的分号。 // 5-3d.cpp #include <stdio.h> int main() { int n, i; float fact=1; printf("请输入 n 的值: "); scanf("%d",&n); i=1; for ( ; ; ) { fact*=i; i++; if (i>n) break; } printf("%d!=%10.0f\n", n,fact); return 0; } 形式 5:表达式 1、表达式 2 和表达式 3 可以是逗号表达式。 // 5-3e.cpp #include <stdio.h> int main() { int n, i; float fact; printf("请输入 n 的值: "); scanf("%d",&n); for (i=1, fact=1; i<=n; fact*=i, i++); printf("%d!=%10.0f\n", n,fact); return 0; } // 5-3f.cpp #include <stdio.h>

int main() { int n, i; float fact=1; printf("请输入 n 的值: "); scanf("%d",&n); i=1; while( i<=n) { fact*=i; i++; } printf("%d!=%10.0f\n", n,fact); return 0; } 【例 5-4】输出下列图案。 ********** ********** ********** ********** #include <stdio.h> int main() { int i,j; for(i=1; i<=4; i++) { // 外循环控制输出行数 for(j=1; j<=10; j++) // 内循环控制每行输出字符数 { printf("%c", '*'); // 输出内容 } printf("\n"); // 换行 } return 0; } 【例 5-5】计算算式 xyz+yzz=532 中的 x、y、z 值(其中 xyz 和 yzz 分别代表一个三位 数)。 #include <math.h> #include <stdio.h> int main() { int x,y,z,result=532; for(x=1; x<5; x++) { y=1; while (y<5) { z=1; do { if (532 ==100*x+10*y+z+100*y+10*z+z) {

printf("x=%d,y=%d,z=%d\n",x,y,z); } z++; }while(z<3); y++; } } return 0; } 【例 5-6】 计算 s=1+2+3+?+100,若 s>=1000,则跳出循环。 #include <stdio.h> int main() { int n=1,s=0; for (;n<=100;n++) { s+=n; if (s>=1000) break; } printf("s=%d\n", s); return 0; } 【例 5-7】 求 100 以内的素数。素数又称为质数,是指只能被 1 和其本身整除的数(1 除外) 。 #include <stdio.h> int main() { int n,i; for(n=2;n<=100;n++) //A 行,外循环 { for(i=2;i<n;i++) //B 行,内循环 if(n%i==0) break; //C 行 if(i==n) printf("%d\t",n); //D 行 } return 0; } 。改进后的程序如下: #include <stdio.h> #include <math.h> int main() { int n,i,k; printf("2\t"); for(n=3;n<=100;n+=2)

{ k=(int) sqrt(n); for(i=2;i<=k;i++) if(n%i==0) break; if(i>k) printf("%d\t",n); } return 0; } 【例 5-8】 输入一个字符串,统计其中小写字母的个数。 #include <stdio.h> int main() { char c; int num=0; while ((c=getchar())!='\n') { if (c<'a' || c>'z') continue; num++; } printf("%d\n",num); return 0; } 【例 5-9】从键盘输入 5 组数,每组数由 3 个奇数组成,计算每组数之和并输出。 #include <stdio.h> #include <math.h> int main() { int i,j,num,total; for(i=1;i<=5;i++) // 5 组数 { j=1; total =0; while(j<=3) { printf("请输入第%d 组数中的第%d 个数:",i,j); scanf("%d",&num); if (num%2==0) // 如果 num 是偶数 continue; // 执行 continue 语句,转到 while(j<=3)处运行 total += num; j++; } printf("第%d 组数之和为:%d\n",i,total); } return 0;

} 【例 5-10】 用 goto 语句配合使用 if 语句求 n 的阶乘。 #include <stdio.h> int main() { int n, m; float fact=1; printf("请输入 n 的值: "); scanf("%d",&n); m=n; loop: if (m>0) { fact *=m--; goto loop; } printf("%d!=%10.0f\n", n, fact); return 0; } 【例 5-11】编程统计由 4 个数字 1、2、3 和 4 可以组成多少个互不相同且各位数字无 重复的 3 位数? #include "stdio.h" void main() { int bw,gw,sw, jsj=0; for (bw=1; bw<5; bw++) for (sw=1; sw<5; sw++) for (gw=1; gw<5; gw++) { if (bw!=sw && bw!=gw && sw!=gw) { jsj++; printf("%d ",bw*100+sw*10+gw); if (jsj%5==0) printf("\n"); } } printf("\n 无重复的数字共有%d 个\n",jsj); } 【例 5-12】试求两个已知正整数 a、b 的最大公约数与最小公倍数。 #include <stdio.h> int main() { int a,b,k,t; printf("请输入正整数 a,b:"); scanf("%d,%d",&a,&b); if (a<b) { t=a;

}else { t=b; } // t 为 a 和 b 中值较小的数 for (k=t; k>=1; k--) { if (a%k + b%k ==0) { printf("%d 和%d 的最大公约数是:%d\n", a, b, k); printf("%d 和%d 的最小公倍数是:%d\n", a, b, a*b/k); break; } } return 0; } 【例 5-13】用欧几里得算法求解两个整数 a,b 的最大公约数。 #include <stdio.h> int main() { int a,b,a1,b1,r; printf("请输入正整数 a,b:"); scanf("%d, %d",&a,&b); if (a==0 || b==0) { printf("输入参数错\n"); } else { a1=a, b1=b; while(r=a%b) { a=b; b=r; } printf("%d 和%d 的最大公约数是:%d\n", a1, b1, b); printf("%d 和%d 的最小公倍数是:%d\n", a1, b1, a1*b1/b); } return 0; } 【例 5-14】输入一行字符,分别统计其中字母、空格、数字及其他字符的个数。 #include <stdio.h> void main() { char c; int letters=0,space=0,digit=0,other=0; printf("请输入一行字符:\n"); while((c=getchar())!='\n') { if(c>='a'&&c<='z'||c>='A'&&c<='Z') letters++; else if(c==' ') space++; else if(c>='0'&&c<='9')

digit++; else other++; } printf("字母数:%d\n 空格数:%d\n 数字数:%d\n 其他字符数:%d\n", letters,space,digit,other); } 【例 5-15】 利用公式

?

1 1 1 ? 1 ? ? ? ? … 求 ? 的近似值,直到最后一项的绝对值小 4 3 5 7

于 10-6 为止。 #include <stdio.h> #include <math.h> int main() { int sign=1; // 第 1 项为正数 float t=1,n=1,pi=0; while(fabs(t)>=1e-6) { t=sign/(2*n-1); // 求第 n 项的值 pi+=t; // 求累加和 n++; // 下一项 sign =-sign; // 变换符号 } pi*=4; printf("pi=%10.6f\n",pi); return 0; } 【例 5-16】输入一个正整数,按逆序输出,例如,输入 2468 输出 8642。 #include <stdio.h> int main() { unsigned number; printf("请输入一个正整数: "); scanf("%d", &number); do { printf("%d", number%10); // 输出低位 number/=10; } while(number!=0); printf("\n"); return 0; } 【例 5-17】输出菱形。 #include <stdio.h> int main() { int i,j,k; for(i=0;i<=3;i++){ // i 控制行数,从第 0 行到第 3 行依次循环控制 for(j=0;j<=2-i;j++) printf(" "); // 控制在第 i 行上输出空格的个数

for(k=0;k<=2*i;k++) printf("*"); // 控制在第 i 行上输出"*"个数 printf("\n"); // 换行 } for(i=0;i<=2;i++) { // 控制后三行,行 i 从第 0 到第 2 行 for(j=0;j<=i;j++) printf(" "); // 控制在第 i 行上输出空格的个数 for(k=0;k<=4-2*i;k++) printf("*"); // 控制输出"*"个数 printf("\n"); // 换行 } return 0; } 【例 5-18】从键盘输入一个 3 行 4 列矩阵的 12 个元素,从该矩阵中找出元素的最大值 和最小值。 #include <stdio.h> int main() { int i,j; // 循环变量 int data; // 接收键盘输入的元素 int min,max; // 存放矩阵中的最大值和最小值 int flag=0; // 标志,其值为 0,表明变量 min 和 max 未赋初值,为 1 表明已赋值 for (i=1;i<=3;i++) { printf("请输入第%d 行的 4 个元素:",i); for(j=1;j<=4;j++) { scanf("%d",&data); if (!flag) // 当 flag 为 0 时,将第一个输入的数赋值给 min 和 max { min=data; max=data; flag=1; // 设置 flag 为 1,表明 min 和 max 已赋初值 } if (min>data) min=data; if (max<data) max=data; } } printf("该矩阵元素的最大值为%d\n",max); printf("该矩阵元素的最小值为%d\n",min); return 0; } 第6章 【例 6-1】顺序给数组 a 各元素输入位置值,并逆序输出各元素值。

#include <stdio.h> int main() { int i,a[10]; for(i=0;i<=9;i++) a[i]=i; for(i=9;i>=0;i--) printf("%d ",a[i]); printf("%d ",a[i]); return 0; } 【例 6-2】从键盘输入 10 个非零值赋給数组 a,随后分别统计元素的正数和与负数和。 #include <stdio.h> int main() { int i,x,a[10]; int posi,nega; for(i=1;i<=10;){ printf("输入第%d 个元素: ",i); scanf("%d",&x); if(x!=0){ a[i-1]=x; i++; } } posi=nega=0; for(i=9;i>=0;i--) if(a[i]>0) posi+=a[i]; else nega+=a[i]; printf("正数和=%d\n",posi); printf("负数和=%d\n",nega); return 0; } 【例 6-3】顺序查找例

#include <stdio.h> #define N 8 int main() { int a[N]={-3,12,9,7,38,65,-97,0}; int i,x; printf("输入要查找的数: "); scanf("%d",&x); i=0; while(i<N && a[i]!=x) i++; if(i<N)printf("%d 是第%d 个元素\n",x,i); else printf("没有找到%d\n",x); return 0; } 【例 6-4】折半查找示例。 #include <stdio.h> #define N 8 int main() { int x,a[N]={-21,-13,-9,-2,0,3,8,15}; int left=0,right=N-1,mid; printf("输入要查找的数:"); scanf("%d",&x); while(left<=right){ mid=(left+right)/2; if(x==a[mid])break; if(x<a[mid]) right=mid-1; else left=mid+1; } if(left<=right)printf("%d 是第%d 个元素\n",x,mid); else printf("没有找到%d\n",x); return 0; } 【例 6-5】在数组的指定位置上插入数据例。 #include <stdio.h> #define N 8 int main() { int a[N]={-3,12,9,7,38}; int i,x,n,pos; printf("输入要插入的数: ");

scanf("%d",&x); printf("输入插入位置: "); scanf("%d",&pos); n=5; for(i=n;i>pos;i--) //A a[i]=a[i-1]; a[i]=x; n++; for(i=0;i<n;i++) printf("%3d",a[i]); printf("\n"); return 0; } 【例 6-6】在升序数组中插入一个数据例。 #include <stdio.h> #define N 8 int main() { int a[N]={-3,7,9,12,38}; int i,x,n; printf(" 输入要插入的数: "); scanf("%d",&x); n=5; i=n-1; while(a[i]>x && i>=0){ a[i+1]=a[i]; i--; } a[i+1]=x; n++; for(i=0;i<n;i++) printf("%3d",a[i]); printf("\n"); return 0; } 【例 6-7】删除数组指定位置上的元素例。

#include <stdio.h> #define N 8 int main() { int a[N]={-3,12,9,7,38}; int i,n,pos; printf("输入删除位置: "); scanf("%d",&pos); n=5; for(i=pos;i<n-1;i++) //A a[i]=a[i+1]; n--; for(i=0;i<n;i++) printf("%3d",a[i]); printf("\n"); return 0; } 【例 6-8】在一维数组中删除值为 x 的元素。为简单起见,假定数组中元素互不相同, 且值为 x 的元素肯定存在。 #include <stdio.h> #define N 8 int main() { int a[N]={-3,12,9,7,38}; int i,n,x,pos; printf("输入要删除的数: "); scanf("%d",&x); n=5; pos=0; while(a[pos]!=x) pos++; for(i=pos;i<n-1;i++) a[i]=a[i+1]; n--; for(i=0;i<n;i++) printf("%3d",a[i]); printf("\n"); return 0; } 【例 6-9】直接插入排序例 #include <stdio.h> #define N 8 int main() { int i,j,k,a[N];

printf("输入 8 个整数:"); for(i=0;i<N;i++) scanf("%d",&a[i]); printf("排序前:\n"); for(i=0;i<N;i++) printf("%d\t",a[i]); printf("\n"); for(i=1;i<N;i++){ //A k=a[i];j=i-1; while(a[j]>k && j>=0){ a[j+1]=a[j]; j--; } a[j+1]=k; } printf("排序后:\n"); for(i=0;i<N;i++) printf("%d\t",a[i]); printf("\n"); return 0; } 【例 6-10】直接选择排序例

#include <stdio.h> #define N 8 int main() { int i,j,k,temp,a[N]; printf("输入 8 个整数:"); for(i=0;i<N;i++) scanf("%d",&a[i]); printf("排序前:\n"); for(i=0;i<N;i++) printf("%d\t",a[i]); printf("\n"); for(i=0;i<N-1;i++){ //A k=i; for(j=i+1;j<N;j++) if(a[j]<a[k])k=j; temp=a[k]; a[k]=a[i]; a[i]=temp; } printf("排序后:\n"); for(i=0;i<N;i++) printf("%d\t",a[i]); printf("\n"); return 0; } 【例 6-11】冒泡排序示例 #include <stdio.h> #define N 8 int main() { int i,j,k,a[N]; printf("输入 8 个整数:"); for(i=0;i<N;i++) scanf("%d",&a[i]); printf("排序前:\n"); for(i=0;i<N;i++) printf("%d\t",a[i]); printf("\n"); for(i=N-1;i>0;i--){ //A for(j=N-1;j>N-1-i;j--) if(a[j]<a[j-1]){ k=a[j];a[j]=a[j-1];a[j-1]=k; }

} printf("排序后:\n"); for(i=0;i<N;i++) printf("%d\t",a[i]); printf("\n"); return 0; } 【例 6-12】一维数组 a 长度为 10,一维数组 b 长度为 5,对 a、b 数组中的元素作如下处理: (1)将 a 数组中下标为 0、2、4、6、8 的 5 个元素分别和 b 数组中的 5 个元素相加,和存入 c 数组的 0、2、4、6、8 下标处; (2)a 数组的其余元素如果是正数,则乘 2,如果是负数,则求其相反数,计算结果分别存入 c 数组的 1、3、5、7、9 下标处。 (3)最后以每行 5 个数据的格式输出 c 数组元素。 #include <stdio.h> int main() { int i; double a[10]={-2.34,15.29,9.0,-13,0.78,0.0,-8.2,14.16,-7.63,1.28}; double b[5]={1.09,4.13,0,-5.02,6.64},c[10]; for(i=0;i<10;i++){ if(i%2==0) //A c[i]=a[i]+b[i/2]; //B else c[i]=(a[i]>=0 ? a[i]*2 : -a[i]);//C if((i+1)%5==0) //D printf("\n"); printf("%8.2f",c[i]); } return 0; } 【例 6-13】将数组 a 中的元素作如下处理: (1)将各元素的奇数位取出来,形成一个新数,高奇数位变成低位,低奇数位变成高位, 例如 654321 处理后变成 135,新数仍然存放在数组原来位置。 (2)对新数组进行升序排序。

int main() { int i,j,t; long a[10]={204,15824,944371,480025,0,823961,14167,128,93,40665}; for(i=0;i<10;i++){ //A t=0; while(a[i]!=0){ t=t*10+a[i]%10; a[i]=a[i]/100; } a[i]=t; } printf("处理后:\n"); for(i=0;i<10;i++) printf("%d\t",a[i]); for(i=9;i>0;i--){ //B for(j=0;j<i;j++) if(a[j]>a[j+1]){ t=a[j];a[j]=a[j+1];a[j+1]=t; } } printf("排序后:\n"); for(i=0;i<10;i++) printf("%d\t",a[i]); printf("\n"); return 0; } 【例 6-14】输入 10 个整数,找出其中最小值以及最小值元素的位置。并将该元素和数 组第一个元素交换位置。 #include <stdio.h> int main() { int i,k,x,a[10]; printf("输入 10 个整数:\n"); for(i=0;i<10;i++) //A scanf("%d",&a[i]); k=0; //B for(i=1;i<10;i++) //C if(a[i]<a[k])k=i; printf("下标=%d\t 最小值=%d\n",k,a[k]); x=a[0];a[0]=a[k];a[k]=x; for(i=0;i<10;) printf("%d\t",a[i++]); return 0;

} 【例 6-15】利用一维数组求斐波那契数列的前 20 项,并以每行显示 5 个数据的形式输 #include <stdio.h> int main() { long f[20]={1,1}; int i; printf("%12d%12d",f[0],f[1]); for(i=2;i<20;i++){ f[i]=f[i-2]+f[i-1]; if(i%5==0)printf("\n"); printf("%12d",f[i]); } printf("\n"); return 0; } 【例 6-16】将一维数组 a 中的正数移动到数组的右侧,负数移动到数组的左侧。 方法一: #include <stdio.h> #define N 10 int main() { int a[N]={4,10,-3,7,-12,4,-6,2,8,-8}; int b[N]; int i,l,r; for(l=0,r=N-1,i=0;i<N;i++) if(a[i]<0)b[l++]=a[i]; else b[r--]=a[i]; for(i=0;i<N;i++) printf("%d\t",b[i]); printf("\n"); return 0; } 方法二: #include <stdio.h> #define N 10 int main() { int a[N]={4,10,-3,7,-12,4,-6,2,8,-8}; int l=0,r=N-1,t; while(l<r){ //A while(l<r && a[l]<0) //B l++; while(l<r && a[r]>0) //C

r--; if(l<r){ t=a[l];a[l]=a[r];a[r]=t; l++; r--; } } for(l=0;l<N;l++) printf("%d\t",a[l]); printf("\n"); return 0; } 【例 6-17】对二维数组 a[6][6]赋值:对角线上元素为 0;对角线右上角元素为 1;对 角线左下角元素为-1。最后输出数组元素。 #include <stdio.h> int main() { int a[6][6]; int i,j; for(i=0;i<6;i++) for(j=0;j<6;j++) a[i][j]=(i==j)? 0:(i<j)? 1 : -1; for(i=0;i<6;i++){ for(j=0;j<6;j++) printf("%d\t",a[i][j]); printf("\n"); } return 0; } 【例 6-18】 从键盘上输入 6 个数据存入二维数组 a[2][3]中, 再将数组 a 中每行元素放 入数组 b 的每列中。数组 b 是 3 行 2 列的二维数组。 #include<stdio.h> int main() { int a[2][3],b[3][2]; int i,j; for(i=0;i<2;i++) /*输入 6 个数据*/ for(j=0;j<3;j++) scanf("%d",&a[i][j]); for(i=0;i<2;i++) /*a 数组存入数组 b */ for(j=0;j<3;j++) b[j][i]=a[i][j]; for(i=0;i<2;i++){ /*输出 a 数组*/ for(j=0;j<3;j++) printf("%d\t",a[i][j]);

printf("\n"); } for(i=0;i<3;i++){ /*输出 b 数组*/ for(j=0;j<2;j++) printf("%d\t",b[i][j]); printf("\n"); } return 0; } 【例 6-19】显示杨辉三角形的前 8 行 #include <stdio.h> #define N 8 int main() { int yh[N][N]; int i,j; for(i=0;i<N;i++){ //A yh[i][0]=yh[i][i]=1;//第 1 列和对角线上元素赋值 1 for(j=1;j<i;j++) // B yh[i][j]=yh[i-1][j-1]+yh[i-1][j];其他元素赋值 } for(i=0;i<N;i++){ //C for(j=0;j<=i;j++) //D printf("%2d\t",yh[i][j]); printf("\n"); } return 0; } 【例 6-20】一个学习小组有 5 个学生,每个学生 3 门课程的考试成绩见表 6-1。求全组分科 的平均成绩和各科总平均成绩。 #include <stdio.h> int main() { int i,j,average=0,ave[3]={0},score[3][5]; printf("输入 5 人 3 门课程成绩\n"); for(i=0;i<3;i++){ for(j=0;j<5;j++){ scanf("%d",&score[i][j]); ave[i]+=score[i][j]; } average+=ave[i]; ave[i]/=5; } average/=15;

printf("数学:%d\n 语文:%d\n 英语:%d\n", ave[0], ave[1], ave[2]); printf("总平均:%d\n", average); return 0; } 【例 6-21】在 8*8 的矩阵中寻找极点与鞍点。极点:如某元素在所在行相邻点中与所 在列相邻点中均为最大或最小;鞍点:如某元素在所在行(或列)相邻点中为最大,同时在所 在列(或行)相邻点中为最小。如图 6-12 所示,[4][1]为极点,[2][5]为鞍点。 #include <stdio.h> int main () { int i,j,k,l; int mat[8][8]={{0,3,5,7,11,13,17,19},{1,2,3,9,16,17,21,18}, {3,5,4,14,22,19,26,15},{5,11,9,6,16,15,23,12}, {9,12,8,7,8,9,10,11},{7,6,15,14,13,10,9,10}, {13,4,7,24,20,18,12,12},{15,10,9,8,25,19,16,14}}; for(i=1;i<=6;i++) for(j=1;j<=6;j++){ if(mat[i][j-1]>mat[i][j] && mat[i][j]<mat[i][j+1])k=-1;// mat[i][j]所在行最小 else if(mat[i][j-1]<mat[i][j] && mat[i][j]>mat[i][j+1])k=1; // mat[i][j]所在行最大 else k=0; //不具备上述关系 if(mat[i-1][j]>mat[i][j]&&mat[i][j]<mat[i+1][j])l=-1; // mat[i][j]所在列最小 else if(mat[i-1][j]<mat[i][j]&&mat[i][j]>mat[i+1][j])l=1; // mat[i][j]所在列最大 else l=0; //不具备上述关系 if(k==0 ||l==0)continue; if(k==1&&l==1) printf("极大点:i=%d;j=%d;%3d\n",i,j,mat[i][j]); else if(k==-1&&l==-1) printf("极小点:i=%d;j=%d;%3d\n",i,j,mat[i][j]); else printf("鞍 点:i=%d;j=%d;%3d\n",i,j,mat[i][j]); } return 0; } #include <stdio.h> int main () { int i,j,k,l; int mat[8][8]={{0,3,5,7,11,13,17,19},{1,2,3,9,16,17,21,18}, {3,5,4,14,22,19,26,15},{5,11,9,6,16,15,23,12}, {9,12,8,7,8,9,10,11},{7,6,15,14,13,10,9,10}, {13,4,7,24,20,18,12,12},{15,10,9,8,25,19,16,14}}; for(i=1;i<=6;i++) for(j=1;j<=6;j++){ if(mat[i][j-1]>mat[i][j] && mat[i][j]<mat[i][j+1])k=-1;// mat[i][j]所在行最小

else if(mat[i][j-1]<mat[i][j] && mat[i][j]>mat[i][j+1])k=1; // mat[i][j]所在行最大 else k=0; //不具备上述关系 if(mat[i-1][j]>mat[i][j]&&mat[i][j]<mat[i+1][j])l=-1; // mat[i][j]所在列最小 else if(mat[i-1][j]<mat[i][j]&&mat[i][j]>mat[i+1][j])l=1; // mat[i][j]所在列最大 else l=0; //不具备上述关系 if(k==0 ||l==0)continue; if(k==1&&l==1) printf("极大点:i=%d;j=%d;%3d\n",i,j,mat[i][j]); else if(k==-1&&l==-1) printf("极小点:i=%d;j=%d;%3d\n",i,j,mat[i][j]); else printf("鞍 点:i=%d;j=%d;%3d\n",i,j,mat[i][j]); } return 0; } #include <stdio.h> int main() { char c[9]={'c',' ','p','r','o','g','r','a','m'},d[9]; int i; for(i=0;i<9;i++) printf("%c",d[i]=c[i]); printf("\n"); return 0; } 【例 6-23】输出二维字符数组 char num[][5]中的字符。 #include <stdio.h> int main() { char num[][5]={{' ',' ','1', ' ',' '}, {' ','1','2','1'}, {'1','2','3', '2','1'}, {' ','1','2','1'}, {' ',' ','1'}}; int i,j; for(i=0;i<5;i++){ for(j=0;j<5;j++) printf("%c",num[i][j]); printf("\n"); } return 0; } 【例 6-24】从键盘上输入一串字符(少于 50 个字符,以回车换行结束)存入数组 str 中,将其中大写字母转换为对应的小写字母,其他字符不变,然后逆向输出。

#include <stdio.h> int main() { char str[50]; int i=0; do{ scanf("%c",&str[i]); if(str[i]>='A' && str[i]<='Z') str[i]+=32; }while(str[i++]!='\n'); i-=2; while(i>=0){ printf("%c",str[i--]); } printf("\n"); return 0; } 【例 6-25】 对一维字符数组 a 中的 26 个大写英文字母作如下转换: A->e、 B->f、 ...W->a、 X->b、Y->c、Z->d。并输出转换后的字符。 #include<stdio.h> int main() { char a[26]; int i; for(i=0;i<26;i++){ a[i]=i+'A'; printf("%c",a[i]); } printf("\n"); for(i=0;i<26;i++){ a[i]=(a[i]+4-65)%26+'a';//A printf("%c",a[i]); } printf("\n"); return 0; } 【例 6-26】使用 printf 函数输出字符串 #include <stdio.h> int main() { char c[]="C program"; printf("%s\n",c); return 0; }

#include <stdio.h> int main() { char c[]="C program design."; printf("%s\n",c);//A c[9]='\0'; //或者 c[9]=0; printf("%s\n",c);//B return 0; } 【例 6-27】使用 scanf 函数输入字符串。 #include <stdio.h> int main() { char st[15]; printf("输入字符串:\n"); scanf("%s",st); printf("%s\n",st); return 0; } #include <stdio.h> int main() { char st1[6],st2[6],st3[6],st4[6]; printf("输入字符串:"); scanf("%s%s%s%s",st1,st2,st3,st4); //输入"this is a book" printf(" 输出字符串 :%s %s %s %s\n",st1,st2,st3,st4); // 输出 "this is a book" return 0; } 【例 6-28】改写例 6-27,使用 gets 函数输入字符串。 #include <stdio.h> int main() { char s[20]; printf("输入字符串:\n"); gets(s); printf("%s\n",s); return 0; }

//输入"this is a book"

【例 6-29】求出数组 a 中存放的字符串长度,并比较数组 a 中字符串和数组 b 中字符 串的大小。

#include <stdio.h> int main() { char a[20]; int i=0; gets(a); while(a[i]!=0)i++; printf("数组 a 的长度为: %d\n",i); return 0; } #include <stdio.h> int main() { char a[20],b[20]; int i=0; gets(a); gets(b); while(a[i]==b[i] && a[i]!=0 && b[i]!=0) i++; if(a[i]>b[i]) printf("%s>%s\n”,a,b); else if(a[i]<b[i]) printf("%s<%s\n”,a,b); else printf("%s=%s\n”,a,b); return 0; } 【例 6-30】改写上例,使用 puts 函数输出字符串。 #include<stdio.h> int main(){ char s[20]; printf("输入字符串:\n"); gets(s); //输入"this is a book" puts(s); //输出"this is a book" return 0; } 【例 6-31】使用 strcat 实现字符串的合并。

#include<stdio.h> #include<string.h> int main() { char st1[30]="我的姓名是:"; char st2[10]; printf("输入你的姓名:"); gets(st2); //输入字符串到 st2 strcat(st1,st2); //将输入的字符串 st2 连接到 st1 后部 puts(st1); //输出 st1 return 0; } 【例 6-32】使用 strcpy 函数将 st2 中的字符串复制到 st1 中。 #include<stdio.h> #include<string.h> int main() { char st1[15],st2[]="C Language"; strcpy(st1,st2); //将 st2 中的字符串复制到 st1 中 puts(st1); return 0; } 【例 6-33】使用 strcmp 函数比较两个字符串的大小。 #include<stdio.h> #include<string.h> int main() { int k; char st1[15],st2[]="C Language"; printf("输入字符串:\n"); gets(st1); k=strcmp(st1,st2); if(k==0) printf("%s=%s\n",st1,st2); if(k>0) printf("%s>%s\n",st1,st2); if(k<0) printf("%s<%s\n",st1,st2); return 0; } 【例 6-34】使用 strlen 函数求出字符串的长度。

#include<stdio.h> #include<string.h> int main() { int k; char st[]="C language"; k=strlen(st); printf("字符串长度是 %d\n",k); return 0; } 【例 6-35】输入一段由英文字母和其他字符组成的字符串,统计这段字符串中 26 个英文字 母和其他符号出现的次数, 其中英文字母不区分大小写, 非英文字母的字符都作为其他字符。 #include <stdio.h> #include <ctype.h> int main() { char str[300],c; int num[27]={0}; int i; gets(str); for(i=0;str[i]!=0;i++){ c=toupper(str[i]); if(isalpha(c)) num[c-'A']++; else num[26]++; } for(i=0;i<26;i++) printf("%c= %d\n",i+'A',num[i]); printf("其他字符= %d\n",num[26]); return 0; } 【例 6-36】输入一字符串和一个字符,要求将字符串中出现的该字符删除。 #include <stdio.h> #include <string.h> int main() { char str[100],c; int i,j; printf(" 输入字符串 "); gets(str); printf(" 要删除的字符 "); scanf("%c",&c); for(i=j=0;str[i]!=0;i++)

if(str[i]!=c)str[j++]=str[i]; str[j]=0; //A printf(" 输出字符串 %s\n",str); return 0; } 【 例 6-37 】 在 二 维 数 组 Class 中 存 放 5 个 字 符 串 ”Chinese”、”Math”、”English”、”computer”、”electronics”,对 Class 中的 5 个字符串进 行降 序排序并输 出。排序后 输出如下结 果: electronics computer Math English Chinese #include <stdio.h> #include <string.h> #define N 5 int main() { char Class[N][20]={"Chinese","Math","English","computer","electronics"}; char temp[20]; int i,j; for(i=0;i<N-1;i++){ for(j=0;j<N-1-i;j++) if(strcmp(Class[j],Class[j+1])<0){ //以下是交换 Class[j]和 Class[j+1] strcpy(temp,Class[j]); strcpy(Class[j],Class[j+1]); strcpy(Class[j+1],temp); } } for(i=0;i<N;i++) printf("%s\t",Class[i]); printf("\n"); return 0; } 【例 6-38】从键盘输入 10 个整数赋給数组 a[10],判断该数组元素是否对称相等,即 a[i] 是 否等于 a[9-i](i=0~9)。

#include <stdio.h> #define N 10 int main() { int i,a[N]; for(i=0;i<N;i++){ printf("a[%d]= ",i); scanf("%d",&a[i]); } for(i=0;i<N/2;i++) if(a[i]!=a[N-1-i]) break; if(i>=N/2) printf("是对称数组\n"); else printf("不是对称数组\n"); return 0; } 【例 6-39】将一维数组 a[16]中的元素按行顺序放入二维数组 b[4][4]中。 #include <stdio.h> int main() { int a[16]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16},b[4][4]; int i,j; for(i=0;i<16;i++) b[i/4][i%4]=a[i]; for(i=0;i<4;i++){ for(j=0;j<4;j++) printf("%4d",b[i][j]); printf("\n"); } return 0; } 【例 6-40】将一维数组 a 中最大元素移到指定位置。但最大元素和数组中其他元素的 相对位置不能改变。

#include <stdio.h> int main() { int a[8]={3,16,-87,65,-4,32,11,25}; int i,t,maxpos,pos; printf(" 输入最大元素新位置: "); scanf("%d",&pos); printf(" 移动前\n"); for(i=0;i<8;i++) printf("%4d",a[i]); printf("\n"); maxpos=0; for(i=1;i<8;i++) //A if(a[i]>a[maxpos])maxpos=i; while(maxpos!=pos){ //B t=a[7]; for(i=6;i>=0;i--) //C a[i+1]=a[i]; a[0]=t; maxpos=(maxpos+1)%8; } printf(" 移动后\n"); for(i=0;i<8;i++) printf("%4d",a[i]); printf("\n"); return 0; } 【例 6-41】统计字符串 str 中单词的数量、最长单词的字母数、最短单词字母数。单 词之间至少有一个空格。假设字符串中最长单词不超过 20 个字母,并且 str 中最后一个符 号不是字母。

#include <stdio.h> #include <ctype.h> int main() { int i,len=0; int numofword,maxlen,minlen; char str[1000]="Robots can \"feel\" happy, sad, angry, drowsy, hungry or fearful. They also have various personalities."; numofword=0; maxlen=0; minlen=20; for(i=0;str[i]!=0;i++){ if(!isalpha(str[i]) && isalpha(str[i-1])){ maxlen=len>maxlen? len: maxlen; minlen=len<minlen? len: minlen; len=0; numofword++; } else if(isalpha(str[i])) len++; } printf("单词=%d 个,最长=%d 个字母,最短=%d 个字母\n",numofword,maxlen,minlen); return 0; } 【6-42】编写程序,按如下格式将整数存放在二维数组 x[N][N]中。 #include<stdio.h> #define N 5 int main() { int x[N][N]={0},i,j,m; m=N/2; for(i=0;i<m;i++) //A for(j=i;j<N-1-i;j++) //B x[j][i]=x[N-1-i][j]=x[N-1-j][N-1-i]=x[i][N-1-j]=i+1; if(N%2!=0) //C x[N/2][N/2]=(N+1)/2; for(i=0;i<N;i++){ for(j=0;j<N;j++) printf("%4d",x[i][j]); printf("\n"); } return 0; } 【6-43】prime 是一个二维数组,其中数组的第一行存放了若干个正整数,判断这些正

整数是否是素数,如果是素数,则在 prime 数组的第二行相应列上置 1,否则置 0。并输出 其中的素数和素数个数。 #include<stdio.h> #include<math.h> int main() { int prime[2][10]={{23,77,101,49,53,62,5,97,63,19}}; int i,j,k,n; for(n=i=0;i<10;i++){ k=(int)sqrt(prime[0][i]); for(j=2;j<=k;j++) if(prime[0][i]%j==0) break; prime[1][i]=j>k ? 1: 0; n=prime[1][i]==1 ? n+1 : n; } printf("一共有%d 个素数:\n",n); for(n=i=0;i<10;i++) if(prime[1][i]) printf("%5d",prime[0][i]);//A printf("\n"); return 0; } 【例 6-44】电视台举办大奖赛。大奖赛题目的计分规则如下: 1.每位选手都有 10 分的起评分。 2.每位选手必须回答 10 个问题(其题号分为 1 到 10) 。答对某题,当前分数翻倍;答错 某题,则扣掉与题号相同的分数。 现在已知某位选手最终得分刚好是 100 分,要求推断出这位选手所有可能的答题结果。

#include<stdio.h> int main() { int ans[10]={0},n,result; int i,j; for(i=1;i<1023;i++){ //A n=i; j=9; while(n!=0){ ans[j--]=n%2; //将 1 或 0 作为答对或答错的标识,存入数组 ans n/=2; } result=10; //result=10 为起评分 for(j=0;j<10;j++) //按规则计算得分 if(ans[j]==1) result+=result; else result-=(j+1); if(result==100){ //判断得分是否等于 100 分 for(j=0;j<10;j++) printf("%d",ans[j]); printf("\n"); } } return 0; } 第7章 【例 7-1】无参数、无返回值函数例。 void printchar() { printf ("**********\n");/*执行语句部分*/ } 【例 7-2】无参数、有返回值函数例。 int sumodd() { int sum,i; /*数据定义部分*/ for(sum=0,i=1;i<100;i+=2)/*执行语句部分*/ sum+=i; return sum; /*返回语句*/ } 【例 7-3】有参数、无返回值函数例。

void printanychar(char c) { int i; for(i=0;i<10;i++) printf("%c",c); printf("\n"); } 【例 7-4】有参数、有返回值函数例。 int max(int a,int b) { int c ; c=a>b ? a: b ; return c ; } 【例 7-5】使用语句方式调用上节无返回值函数 void printanychar(c)。 #include<stdio.h> void printanychar(char c) /*函数定义*/ { int i; for(i=0;i<10;i++) printf("%c",c); printf("\n"); } int main() { char c; void printanychar(char c); /*函数声明*/ for(c='A';c<='E';c++) printanychar(c); /*函数调用*/ return 0 ; } 【例 7-6】调用上节求最大值的 int max(int a,int b)函数,求 2 个整数的最大值。

#include<stdio.h> int max(int a,int b) { int c; c=a>b ? a: b; return c; } int main() { int x,y,z; printf("输入 2 个整数:\n"); scanf("%d%d",&x,&y); z=max(x,y); printf("最大值=%d\n",z); return 0 ; } 【例 7-7】改写例 7-5,先声明 printanychar 函数,再定义 printanychar 函数。 #include <stdio.h> void printanychar(char); int main() { char c; for(c='A';c<='E';c++) printanychar(c); return 0 ; } void printanychar(char c) { int i; for(i=0;i<10;i++) printf("%c",c); printf("\n"); } /*函数声明*/

/*函数调用*/

/*函数定义*/

【例 7-8】在 swap 函数中交换形参的值。通过图 7-3 观察实参和形参的变化。

#include <stdio.h> void swap(int,int); int main() { int a,b; scanf("%d%d",&a,&b); printf("交换前:\ta= %d,b= %d\n",a,b); swap(a,b); //A 调用 swap 函数 printf("交换后:\ta= %d,b= %d\n",a,b); return 0; } void swap(int a,int b) //B swap 函数定义 { int t; t=a;a=b;b=t; } 【例 7-9】改写例 7-5 中的 void printanychar(char c)函数,使其可以输出任意多个 任意字符。 #include <stdio.h> void printanychar(char,int);// printanychar 函数声明 int main() { int i; for(i=1;i<6;i++){ printanychar(' ',5-i); //调用 printanychar 函数输出 5-i 个空格*/ printanychar('0'+i,2*i-1);//调用 printanychar 函数输出 2*i-1 个'0'+i 字符 printanychar('\n',1); //调用 printanychar 函数输出一个换行*/ } return 0; } void printanychar(char c,int n) //printanychar 函数定义 { int i; for(i=0;i<n;i++) printf ("%c",c); } 【例 7-10】不采用辗转相除法,计算正整数 a、b 的最大公约数和最小公倍数。要求最 大公约数和最小公倍数由自定义函数完成。 #include <stdio.h> int gcd(int , int);//gcd 函数声明 int lcm(int , int);//lcm 函数声明 int main() { int a,b,x;

printf("输入两个正整数 a,b: "); scanf("%d %d",&a,&b); printf("%d,%d 的最大公约数= %d\n", a,b,gcd(a,b)); x=lcm(a,b); printf("%d,%d 的最小公倍数= %d\n", a,b,x); return 0; } int gcd(int a, int b) { while (a!=b){ if (a>b) a-=b; else b-=a; } return a; } int lcm(int a, int b) { int x; x=a*b/gcd(a,b); return x; } 【例 7-11】输入一个数,判断其是否是回文数。所谓回文数是指其左右对称的数,如 11、123321 等即为回文数。

#include <stdio.h> int Ispalind(long i); long Reverse(long n); int main() { long x; printf("输入一个整数:"); scanf("%ld",&x); if(Ispalind(x)) //调用 Ispalind 函数 printf("%ld 是回文数\n",x); else printf("%ld 不是回文数\n",x); return 0; } int Ispalind(long i) { return i==Reverse(i);//调用 Reverse 函数 } long Reverse(long n) { long m=0; while(n>0){ m=m*10+n%10; n/=10; } return m; } 【例 7-12】计算 sum=1!+2!+?n!=

? i!
i ?1

n

#include <stdio.h> long fact(int i) { int j; long f=1; for(j=2;j<=i;j++) f=f*j; return f; //返回至 sumfact 函数 } long sumfact(int n) { int i; long s=0; for(i=1;i<=n;i++) s=s+fact(i); //调用 fact 函数 return s; //返回至 main 函数 } int main() { int n; long sum; printf("输入 n="); scanf("%d",&n); sum=sumfact(n); //调用 sumfact printf("1-%d 的阶乘和=%ld\n",n,sum); return 0; } 【例 7-13】采用递归的算法计算 4! 。 int fac(int n) { if(n==0|| n==1) return 1; else return n*fac(n-1); } #include<stdio.h> int main() { int n; long y; printf("输入 n= "); scanf("%d",&n); y=fac(n); printf("%d!=%ld\n",n,y);

return 0; } 【例 7-14】使用递归方法计算最大公约数。 #include <stdio.h> int gcd(int a,int b) { if(a==b) return a; else if(a>b) return gcd(a-b,b); //递归调用 gcd else return gcd(a,b-a); //递归调用 gcd } int main() { int a,b,c; printf("输入 a,b:"); scanf("%d%d",&a,&b); c=gcd(a,b); printf("%d,%d 的最大公约数=%d\n",a,b,c); return 0; } 【例 7-15】判别一个整数数组中各元素的值,若大于 0 则输出该值,若小于等于 0 则输出 0 值。编程如下: #include<stdio.h> void nzp(int v) { if(v>0) printf("%d ",v); else printf("%d ",0); } int main() { int a[5],i; printf("输入 5 个整数\n"); for(i=0;i<5;i++){ scanf("%d",&a[i]); nzp(a[i]); } return 0; } 【例 7-16】对一维数组的元素进行逆序。其中逆序操作在自定义函数 reverse 中完成。

#include<stdio.h> void reverse(int [],int);//reverse 声明,省略形参名,第一个参数是一维数组 void print(int [],int); int main() { int arr[10]={-13,-5,-3,0,2,7,8,11,16,19}; print(arr,10);//调用 print 函数,实参只需写上一维数组名 arr reverse(arr,10); print(arr,10); return 0; } void print(int array[],int n) { int i; for (i=0;i<n;i++) printf("%d\t",array[i]); printf("\n"); } void reverse(int array[],int n) { int i,temp; for(i=0;i<n/2;i++){ temp=array[i]; array[i]=array[n-i-1]; array[n-i-1]=temp; } } 【例 7-17】定义一个 cal 函数完成第 6 章例 6-20 的成绩计算。

#include<stdio.h> int cal(int s[][5],int a[],int row);//s 是二维数组,a 是一维数组 int main() { int average,score[3][5],ave[3]={0}; average=cal(score,ave,3);//A 调用 cal 函数,实参只需写上二维和一维数组名 printf("数学: %d\n 语文: %d\n 英语: %d\n",ave[0],ave[1],ave[2]); printf("总均分: %d\n",average); return 0; } int cal(int s[][5],int a[],int n) { int i,j,aveg=0; printf("输入成绩\n"); for(i=0;i<n;i++){ for(j=0;j<5;j++){ scanf("%d",&s[i][j]); a[i]+=s[i][j]; } aveg+=a[i]; a[i]/=5; } aveg/=15; return aveg; } 【例 7-18】局部变量应用例 1。 #include<stdio.h> int main() { int i=2,j; //A j=i+3; { int j=8; //B i++; //C printf("j=%d\ti=%d\n",j,i); } printf("j=%d\ti=%d\n",j,i); return 0; } 【例 7-19】局部变量应用例 2。

#include<stdio.h> void changei() { int i; for(int j=1;j<=10;j++) i+=j; printf(“调用 changei 中 i=%d\n”,i); } int main() { int i=0; printf(“调用 changei 前 i=%d\n”,i); changei(); printf(“调用 changei 后 i=%d\n”,i); return 0; } 【例 7-20】全局变量应用例。 #include<stdio.h> int i; void changei() { for(int j=1;j<=10;j++) i+=j; } int main() { printf("调用 changei 前 i=%d\n",i); changei(); printf("调用 changei 后 i=%d\n",i); return 0; } 【例 7-21】静态局部变量示例。

#include<stdio.h> int f(int a) { auto b=0; static c=3; b=b+1; c=c+1; return (a+b+c); } int main() { int a=2,i; for(i=0;i<3;i++) printf("%d\n",f(a)); return 0; } 【例 7-22】改写例 7-12,使用静态局部变量计算阶乘。 #include<stdio.h> long fact(int n) { static long f=1; f=f*n; return f; } long sumfact(int n) { int i; long s=0; for(i=1;i<=n;i++) s=s+fact(i); return s; } int main() { int n; long sum; printf("输入 n="); scanf("%d",&n); sum=sumfact(n); printf("1-%d 的阶乘和=%ld\n",n,sum); return 0; } 【例 7-23】改写例 6-3,设计一个函数,实现在一维数组上顺序查找值为 x 的元素。 #include <stdio.h>

#define N 8 int seqsearch(int r[],int n,int x) { int i=0; while(i<n && r[i]!=x) i++; if(i<n)return i; return -1; } int main() { int a[N]={-3,12,9,7,38,65,-97,0}; int n,x; printf("输入要查找的数: "); scanf("%d",&x); n=seqsearch(a,N,x); if(n>=0)printf("%d 是第%d 个元素\n",x,n); else printf("没有找到%d\n",x); return 0; } 【例 7-24】改写例 6-9,设计排序函数,完成直接插入排序。 #include <stdio.h> #define N 8 void straisort(int r[],int n) { int i,j,k; for(i=1;i<n;i++){ k=r[i];j=i-1; while(r[j]>k && j>=0){ r[j+1]=r[j]; j--; } r[j+1]=k; } } int main() { int i,j,a[N]; printf("输入 8 个整数:"); for(i=0;i<N;i++) scanf("%d",&a[i]); printf("排序前:\n"); for(i=0;i<N;i++) printf("%d\t",a[i]);

printf("\n"); straisort(a,N); printf("排序后:\n"); for(i=0;i<N;i++) printf("%d\t",a[i]); printf("\n"); return 0; } 【例 7-25】调用上例 straisort 函数,完成二维数组中各行元素的排序。 #include <stdio.h> #define N 8 void straisort(int r[],int n) { int i,j,k; for(i=1;i<n;i++){ k=r[i];j=i-1; while(r[j]>k && j>=0){ r[j+1]=r[j]; j--; } r[j+1]=k; } } int main() { int mat[3][4]={{1,-2,15,9},{13,0,6,-8},{14,5,7,11}}; int i,j; for(i=0;i<3;i++){ straisort(mat[i],4); //A 调用 straisort 函数对 mat[i]排序 for(j=0;j<4;j++) printf("%5d",mat[i][j]); printf("\n"); } return 0; } 【7-26】 编写函数 int trans(char a[],int b[]),将字符串 a 中数字子串, 转换为相应的整数, 保存数组 b 中,函数返回整数个数。例如 a 为"ECC250MP148RFC259G37YY",整数 250、 148、259、37 保存在 b 中,函数返回整数个数 4。

#include<stdio.h> #include<stdlib.h> #include<ctype.h> int trans(char a[],int b[]) { int sum, pos,k; pos=k=0; while(a[pos]!=0){ //A while(a[pos]!=0 && !isdigit(a[pos]))//B 行 pos++; if(a[pos]!=0){ //C sum=0; while(isdigit(a[pos])) //D sum=sum*10+a[pos++]-'0'; b[k++]=sum; //E } } return k; } int main() { char t[]="ECC250MP148RFC259G37YY"; int b[10]={0}; int num,i=0; num=trans(t,b); for(i=0;i<num;i++){ printf("%5d",b[i]); } printf("\n"); return 0; } 【7-27】编写函数 void check(int b[],int n),该函数检查数组 b 中 n 个元素是否具有如下 性质:每个元素是其平方数的子序列。例如 250 的平方数是 62500,62500 中包含 250,那 么 250 就是 62500 的子序列。37 的平方数 1369,1369 中不包含 37,所以 37 不是 1369 的子 序列。

#include<stdio.h> void check(int b[],int n) { int i,t1,t2,power=10; for(i=0;i<n;i++){ t1=b[i]; t2=t1*t1; while(t1>=power) //A power*=10; while(t2>=t1){ //B if(t2%power==t1){ //C printf("%4d 是%6d 的子串\n",t1,t1*t1); break; } else t2/=10; //D } } } int main() { int b[4]={250,37,148,259}; check(b,4); return 0; } 【例 7-28】编写函数,判断一个字符串是否是另一个字符串的子串,是子串,则返回 在另一个字符串的位置,不是子串,则返回-1 。

#include<stdio.h> #include<string.h> int find(char s[],char t[]) { int len,i,j; len=strlen(s)-strlen(t); if(len<0)return -1; //A for(i=0;i<=len;i++){ //B j=0; while(s[i+j]==t[j] && t[j]) //C j++; if(t[j]==0)return i; //D } return -1; } int main() { char s[]="C program"; char t1[]="gra",t2[]="grb"; int pos; pos=find(s,t1); if(pos==-1)printf(" %s 不是 %s 的子串 else printf(" %s 是 %s 的子串,起始位置 pos=find(s,t2); if(pos==-1)printf(" %s 不是 %s 的子串 else printf(" %s 是 %s 的子串,起始位置 return 0; }

\n",t1,s); %d\n",t1,s,pos+1); \n",t2,s); %d\n",t2,s,pos+1);

【例 7-29】设计完成整数加减乘除运算的函数,并在主函数中输入两个要进行操作的 操作数,调用相应的函数完成运算。

#include<stdio.h> int add(int,int); int sub(int,int); int mul(int,int); int div(int,int); int main() { int num1,num2,opera,result; printf("选择运算: 1: 加 2: 减 3: 乘 4: 除\n"); scanf("%d",&opera); printf("输入操作数:\n"); scanf("%d%d",&num1,&num2); switch(opera){ case 1:result=add(num1,num2);break; case 2:result=sub(num1,num2);break; case 3:result=mul(num1,num2);break; case 4:result=div(num1,num2);break; } printf("结果= %d\n",result); return 0; } int add(int a,int b){return a+b;}; int sub(int a,int b){return a-b;}; int mul(int a,int b){return a*b;}; int div(int a,int b){return (b==0? 0:a/b);} 【例 7-30】全局变量、静态局部变量和自动局部变量的区别。 #include<stdio.h> void func(); int c=1; int main() { int a=0,b=-10; printf("a=%d\tb=%d\tc=%d\n",a,b,c); func(); printf("a=%d\tb=%d\tc=%d\n",a,b,c); func(); return 0; } void func() { int static a=2; int b=5; a+=2,b+=5; c+=12;

printf("a=%d\tb=%d\tc=%d\n",a,b,c); } 【例 7-31】汉诺塔问题。这是一个十分古老的问题。传说古印度的主神梵天作了这么一个 游戏。他在黄铜板上竖了 3 根针,其中一根针上从上到下按从小到大的顺序摆放了 64 个盘 子。 梵天要求僧侣们把所有盘子从一根针上借助于第二根针移到第三根针上, 规定一次只能 移一个盘子,且不许将大盘压在小盘上。 #include<stdio.h> void move(char,char); void hanoi(int,char,char,char); int main() { int n; printf("输入盘子数: "); scanf("%d",&n); hanoi(n,'A','B','C'); printf("\n"); return 0; } void hanoi(int n,char A,char B,char C) { if(n==1)move(A,C); else{ hanoi(n-1,A,C,B); //递归调用将 n-1 个盘子从 A 柱借助 C 柱移到 B 柱 move(A,C); //将最后一个盘子从 A 柱移到 C 柱 hanoi(n-1,B,A,C); //递归调用将 n-1 个盘子从 B 柱借助 A 柱移到 C 柱 } } void move(char A,char C) { printf("%c->%c\t",A,C); } 第8章 【例 8-1 】使用 fgetc 和 fputc 函数将第 1 章例 1-4 源程序文件”ex1-4.c”复制 为”dex1-4.c”。同时将文件内容在屏幕上显示。 #include<stdio.h> #include<stdlib.h> int main() { FILE *fpr,*fpw; //A char ch; if((fpr=fopen("d:\\c\\example\\ex1-4.c","r"))==NULL){ printf("\n 无法打开源文件,按任意键退出!\n"); getchar(); exit(1);

} if((fpw=fopen("d:\\c\\example\\dex1-4.c","w"))==NULL){ printf("\n 无法打开目的文件,按任意键退出!\n"); getchar(); exit(1); } ch=fgetc(fpr); while(ch!=EOF){ putchar(ch); fputc(ch,fpw); ch=fgetc(fpr); } fclose(fpr); fclose(fpw); return 0; } 【例 8-2】从键盘输入一行字符,写入一个文件,再将该文件内容读出显示在屏幕上。 #include<stdio.h> #include<stdlib.h> int main() { FILE *fp; char ch; if((fp=fopen("d:\\c\\example\\string.txt","w+"))==NULL){ printf("无法打开文件,按任意键退出!\n"); getchar(); exit(1); } printf("输入字符串:\n"); while ((ch=getchar())!='\n'){ fputc(ch,fp); putchar(ch); } fclose(fp); return 0; } 【例 8-3】使用 fprintf 和 fscanf 函数保存并读取杨辉三角形(为了简化程序,从本例起, 不再对文件是否正确打开进行判断) 。 #include <stdio.h> #define N 8 int main() { int yh[N][N],yh1[N]; FILE *fp;

int i,j; for(i=0;i<N;i++){ yh[i][0]=yh[i][i]=1; for(j=1;j<i;j++) yh[i][j]=yh[i-1][j-1]+yh[i-1][j]; } fp=fopen("d:\\yh.txt","w"); for(i=0;i<N;i++){ for(j=0;j<=i;j++) fprintf(fp,"%3d",yh[i][j]); fprintf(fp,"%c",'\n'); //A } fclose(fp); fp=fopen("d:\\yh.txt","r"); for(i=0;i<N;i++){ for(j=0;j<=i;j++){ fscanf(fp,"%d",&yh1[j]); printf("%3d",yh1[j]); } printf("\n"); } fclose(fp); return 0; } 【例 8-4】改写【例 8-3】 ,使用 fwrite 函数将杨辉三角形数据以一行 8 个元素的方式 写入文件,再用 fread 函数以一行的方式读入。
#include<stdio.h> #define N 8 int main() { int yha[N][N],yhb[N][N],i,j; int len=sizeof(int)*N; FILE *fp; for(i=0;i<N;i++){ yha[i][0]=yha[i][i]=1; for(j=1;j<i;j++) yha[i][j]=yha[i-1][j-1]+yha[i-1][j]; } fp=fopen("d:\\yh.dat","wb+"); for(i=0;i<N;i++) fwrite(yha[i],len,1,fp); rewind(fp); for(i=0;i<N;i++){ fread(yhb[i],len,1,fp); //B //A

for(j=0;j<=i;j++) printf("%3d",yhb[i][j]); printf("\n"); } fclose(fp); return 0; }

【例 8-5】使用 fgets 函数读入由【例 8-3】程序建立的文本文件”yh.txt”,读入的字 符串再用 fputs 函数复制到文本文件”yh1.txt”中。 #include<stdio.h> int main() { char yh[100],i; FILE *fpr,*fpw; fpr=fopen("d:\\yh.txt","r"); fpw=fopen("d:\\yh1.txt","w"); for(i=0;i<8;i++){ fgets(yh,100,fpr); fputs(yh,fpw); printf("%s",yh); } fclose(fpr); fclose(fpw); return 0; } 【例 8-6】首先建立一个二进制文件,存放前 50 个素数。然后再打开该文件,随机输 入 1 个 1-50 之间的整数 n,表示要在文件中找到第 n 个素数,并显示。 #include<stdio.h> #include<math.h> #define N 50 bool IsPrime(int); int main() { int i,k,n; int p[N]={2}; FILE *fp; for(k=1,i=3; ;i=i+2) if(IsPrime(i)){ p[k++]=i; if(k>=N)break; } fp=fopen("d:\\prime.dat","wb+"); for(i=0;i<5;i++) fwrite(&p[i*10],sizeof(int)*10,1,fp);//A

rewind(fp); printf("输入 n(1~%d)= ",N); scanf("%d",&n); while(n>0 && n<N+1){ fseek(fp,(n-1)*sizeof(int),SEEK_SET); fread(&k,sizeof(int),1,fp); //B printf("第%d 个素数是%d\n",n,k); printf("输入 n(1~%d)= ",N); scanf("%d",&n); } fclose(fp); return 0; } bool IsPrime(int n) { int i,k; k=(int)sqrt(n);i=1; while (++i<=k) if (n%i==0) return false; return true; } 【例 8-7】有两个文本文件 in1.txt、in2.txt,两个文件中的字符均已经按 ASCII 码升 序排列,现将这两个文件内容合并成一个文件 out.txt。要求 out.txt 中的内容仍然是升序 排列,同时显示合并后的内容。 #include <stdio.h> #include <stdlib.h> int main() { FILE *fa,*fb,*fc; char ca,cb,cc; if((fa=fopen("in1.txt","r"))==NULL) { printf("无法打开 in1.txt 文件\n"); exit(0); } if((fb=fopen("in2.txt","r"))==NULL){ printf("无法打开 in2.txt 文件\n"); exit(0); } if((fc=fopen("out.txt","w"))==NULL){ printf("无法打开 out.txt 文件\n"); exit(0); } ca=fgetc(fa);cb=fgetc(fb);

while((ca!=EOF)&&(cb!=EOF)){//A if (ca<=cb){ cc=ca; ca=fgetc(fa); } else{ cc=cb; cb=fgetc(fb); } fputc(cc,fc); putchar(cc); } if(ca==EOF){ //B while(cb!=EOF){ cc=cb; fputc(cc,fc); putchar(cc); cb=fgetc(fb); } } if(cb==EOF){ //C while(ca!=EOF){ cc=ca; fputc(cc,fc); putchar(cc); ca=fgetc(fa); } } putchar('\n'); fclose(fa); fclose(fb); fclose(fc); return 0; } 【例 8-8】改写第 4 章例 4-14,从文本文件 coeff.txt 中分别读入 3 组 a、b、c,计算 对应的一元二次方程的根 x1、x2,并将 3 组 a、b、c 连同 3 组根保存在文本文件 solu.txt 中。

#include <stdio.h> #include <stdlib.h> #include <math.h> int main() { float a,b,c,d,term1,term2; FILE *fin,*fout; if((fin=fopen("coeff.txt","r"))==NULL){ printf("无法打开系数文件\n"); exit(0); } if((fout=fopen("root.txt","w"))==NULL){ printf("无法打开结果文件\n"); exit(0); } while(!feof(fin)){ fscanf(fin,"%f %f %f",&a,&b,&c); if(a==0) printf("不是一元二次方程\n"); else{ d=b*b-4*a*c; term1=-b/(2*a); term2=(float)sqrt(fabs(d))/(2*a); if (d<0){ printf(" 方程的两个共轭复根是:%8.2f+%8.2fi\n",term1,term2); printf("\t\t\t%8.2f-%8.2fi\n",term1,term2); fprintf(fout,"%8.2f %8.2f %8.2f %8.2f %8.2f\n",a,b,c,term1,term2); } else{ printf(" 方程的两个实根是:%8.2f\n",term1+term2); printf("\t\t %8.2f\n",term1-term2); fprintf(fout,"%8.2f %8.2f %8.2f %8.2f %8.2f\n",a,b,c,term1+term2,term1-term 2); } } } fclose(fin); fclose(fout); return 0; } 第9章 【例 9-1】设计菜单控制程序。

#include <stdio.h> enum Choice{ADD=1,EDIT,DELETE,END}; int main() { Choice choice; int i; printf("1.ADD 2.EDIT 3.DELETE 4.END\n"); // 显示菜单 printf("输入选项(1-4)"); scanf("%d",&i); while((choice=(Choice)i)!=END) { switch(choice){ case ADD: printf("ADD 处理\n"); break; case EDIT: printf("EDIT 处理\n"); break; case DELETE: printf("DELETE 处理\n"); break; default: printf("输入选项错误,请重新输入\n"); } printf("1.ADD 2.EDIT 3.DELETE 4.END\n"); // 再次显示菜单 printf("输入选项(1-4)"); scanf("%d",&i); } return 0; } 【例 9-2】对结构体变量的访问。 #include <stdio.h> struct Child { int id; int year; char gender; float height; float weight; }kid1,kid2={1,2009, 'f',0.8,10}; int main(){ printf("请输入小孩的编号,出生年,性别(f/m),身高,体重:"); scanf("%d,%d,%c,%f,%f", &kid1.id,&kid1.year,&kid1.gender, &kid1.height,&kid1.weight); if(kid1.weight>kid2.weight) { Child t; t=kid1; kid1=kid2; kid2=t; } printf("%d \t%d\t%c\t", kid1.id, kid1.year, kid1.gender); printf("%6.1f \t%6.1f\n", kid1.height, kid1.weight); printf("%d \t%d\t%c\t", kid2.id, kid2.year, kid2.gender); printf("%6.1f \t%6.1f\n", kid2.height, kid2.weight);

return 0; } 【例 9-3】给定学生成绩如表 9-1 所示。利用结构体数组计算表 9-1 中给定的每个学生 三门课程的平均成绩,最后输出成绩单。 #include <stdio.h> struct student { int num; char name[10]; char gender; float score[3]; float average; }; int main() { int i; struct student stu[8]={ {112101,"胡秋印",'F',90,98,99}, {112102,"王月红",'F',78,95,78}, {112103,"陈祎良",'M',64,89,94}, {112104,"姚婷", 'F',78,95,68}, {112105,"陈龙", 'M',98,89,78}, {112106,"吴静", 'F',76,79,98}, {112107,"顾新荣",'M',88,98,76}, {112109,"刘康", 'M',78,90,78} }; for(i=0; i<8; i++) { stu[i].average=(stu[i].score[0] + stu[i].score[1] + stu[i].score[2])/3; printf("%8d %10s %2c %5.1f %5.1f %5.1f %5.1f\n", stu[i].num, stu[i].name, stu[i].gender, stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].average); } return 0; } 【例 9-4】有 m 个孩子围成一圈并依次编号(从 1 开始编号) ,教师指定从第 n(n<=m) 个孩子从 1 开始报数,当报到 s 时,即令其出列,然后从下一个孩子开始重新报数,报到第 s 个孩子时再令其出列,依次类推直到所有孩子都出列,编写程序求孩子出列顺序,这个问 题称为约瑟夫问题。 #include <stdio.h> int main() { struct child // 定义结构体 child { int nextp; // 圆圈中的下一个孩子的编号 int no; // 孩子的编号 }link[80]; // 说明结构体数组 link int m,n,i,s,k,count=0; // count 为计数器 printf("请输入小孩数:"); scanf("%d",&m); printf("请输入起始报数编号:"); scanf("%d",&n);

printf("请输入计数值:"); scanf("%d",&s); for(i=1;i<=m;i++) { if(i!=m) link[i].nextp=i+1; else link[i].nextp=1; link[i].no=i; } printf("\n 出列次序为:\n"); if(n==1) k=m; else k=n-1; while (count !=m) { for(i=0;i!=s;) { k=link[k].nextp; if(link[k].no!=0)i++; } printf("%7d",link[k].no); link[k].no=0; if(++count%5==0) printf("\n"); } return 0; // // // // 根据孩子数目 m 初始化数组 第 i 个,下一个是第 i+1 人 最后一个,下一个是第 1 人 第 i 个人的编号为 i

// k 指开始计数的前一个人

// 未出列时 no 为非零

// 设置为 0,表示出列 // 每行输出 5 个值

} 【例 9-5】有一兴趣小组,有 m 个老师和 n 个学生,用结构体类型数组存放师生数据。结构 体由 3 个成员组成,其中: 1.name 姓名 字符数组, 2.flag 师生标识 字符,’1’为老师,’2’为学生, 3.study 课程/班级 共用体类型, 若是老师, 此成员存放该老师任教的课程名(字 符数组),若是学生,此成员存放该学生的班级(整型) 。 要求在程序中输入相关数据,输出所有老师的信息。 #include <stdio.h> #include <string.h> union choice { char course[20]; // 老师的课程信息 int num; // 学生的班级信息 }; struct inter { char name[20]; // 姓名 char flag; // 描述信息 union choice study; // 课程或班级信息 }array[100]; int main()

{

int i,t,s; printf("请输入老师人数:"); scanf("%d",&t); printf("请输入学生人数:"); scanf("%d",&s); for(i=0; i<t+s;i++) { printf("请输入名字:"); fflush(stdin); gets(array[i].name); printf("请输入描述信息:"); fflush(stdin); array[i].flag=getchar(); if(array[i].flag=='1') { printf("请输入老师所任课程名称:"); fflush(stdin); gets(array[i].study.course); } if(array[i].flag =='2') { printf("请输入学生所在班级信息:"); scanf("%d",&array[i].study.num); } } for(i=0;i<t+s;i++) if(array[i].flag=='1') printf("%s,%s\n",array[i].name,array[i].study.course); return 0;

}


推荐相关:

李秉璋《C程序设计与训练》(第二版)各章例题

李秉璋《C程序设计与训练》(第二版)各章例题_学科竞赛_高中教育_教育专区。李秉璋《C程序设计与训练》(第二版)各章例题第2章 【例 2-1】分析程序并运行。 #...


李秉璋《C程序设计与训练》(第二版)教材练习答案

李秉璋《C程序设计与训练》(第二版)教材练习答案_其它课程_高中教育_教育专区。不编入教材中 第 1 章 C 程序设计概述略 第2章一、单项选择题 1. D 2. B...

网站首页 | 网站地图
All rights reserved Powered by 简单学习网 www.tceic.com
copyright ©right 2010-2021。
文档资料库内容来自网络,如有侵犯请联系客服。zhit325@126.com