《 程序设计基础( c 语言) 》

78
程程程程程程C 程程程程程程程 2010.1.15 初初 2010.1.20 初初

Upload: preston-burch

Post on 16-Mar-2016

200 views

Category:

Documents


0 download

DESCRIPTION

《 程序设计基础( C 语言) 》. 学生函数库 2010.1.15 初稿 2010.1.20 二稿. isprime :素数判断 swap :交换 sca :输入 prt :输出 sum :累加和 max :最大值 min :最小值 find :查找. count :计数 sort :排序 select :筛选 / 选择 copy :复制 shift :移位 issym :对称判断 reverse :逆序 split :分解 merge :合并. 函数名与函数功能. 学生学习、编程、考试时常用的函数库. 前缀用于说明类型 正常: int - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 《 程序设计基础( C 语言) 》

《程序设计基础( C 语言)》学生函数库

2010.1.15 初稿2010.1.20 二稿

Page 2: 《 程序设计基础( C 语言) 》

函数名与函数功能 isprime :素数判断 swap :交换 sca :输入 prt :输出 sum :累加和 max :最大值 min :最小值 find :查找

count :计数 sort :排序 select :筛选 / 选择 copy :复制 shift :移位 issym :对称判断 reverse :逆序 split :分解 merge :合并

学生学习、编程、考试时常用的函数库

Page 3: 《 程序设计基础( C 语言) 》

函数名的前缀与后缀 前缀用于说明类型 正常: int 前缀“ l” : long 前缀“ f” : float 前缀“ p” :指针 前缀“ str_” :字符串 前缀“ strs_” :多字串 前缀“ stu_” :学生

后缀用于说明额外条件 后缀“ _p” :素数 后缀“ _a” :大于 后缀“ _ae” :大于等于 后缀“ _b” :小于 后缀“ _be” :小于等于 后缀“ _n” : n 个 后缀“ _0” :直到 0

Page 4: 《 程序设计基础( C 语言) 》

函数列表( 1 )1. int isprime(int n);2. void sca(int a[],int n);3. void prt(int a[],int n);4. void prt_p(int a[],int n);5. void prt_m(int a[],int n,int m);6. int sca_n(int a[]);7. int sca_0(int a[]);8. long sum(int a[],int n);9. int max(int a[],int n);10.int min(int a[],int n);

判断素数输入函数输出函数条件输出按行输出输入 n 个输入至 0累加和最大值最小值

练习 1,2练习 3练习 4练习 3a练习 5练习 6练习 7练习 8练习 9

Page 5: 《 程序设计基础( C 语言) 》

1. 素数函数, isprime int isprime(int n) { int i; if (n<2) return 0; for (i=2;i<n;i++) if (n%i==0) return 0; return 1; }

判断整数 n 是否为素数,是则返回 1 ,否则返回 0 。 熟练

调用模板 int n;…… if (isprime(n))

Page 6: 《 程序设计基础( C 语言) 》

练习 1 输入整数 n ,如果 n 是素数,则输出 Yes ,否则输出 No 。 如输入: 5 则输出: Yes 如输入: 6 则输出: No

Page 7: 《 程序设计基础( C 语言) 》

程序 1: 输入整数 n, 若 n 为素数则输出 Yes, 否则输出 No #include <stdio.h> int isprime(int n) { …… } main() { int n; scanf("%d",&n); if (isprime(n)) printf("Yes\n"); else printf("No\n"); }

每个程序都应该具备 , 不再重复 被调用子函数放在主函数之前 不再重复说明 代码见前 主函数一般放在最后,自底向上 整数 n 定义 输入整数 n 调用并判断 n 是否素数 是则输出 Yes 否则 输出 No

Page 8: 《 程序设计基础( C 语言) 》

练习 2: 将 4 到 100 的所有偶数分解为两个素数之和 main() { int n, i; for ( n=4; n<=100; n+=2 ) for ( i=2; i<n; i++ ) if ( isprime(i) && isprime(n-i) ) { printf("%2d=%2d+%2d\t",n,i,n-i); break; } }

#include 等略

n 分解 i 与 n-i 和

i 与 n-i 均为素数 只需一个公式

Page 9: 《 程序设计基础( C 语言) 》

2. 输入函数, sca void sca(int a[],int n) { int i; for (i=0;i<n;i++) scanf("%d",&a[i]); }

从键盘上输入 n 个整数到数组 a 中 熟练

调用模板 int a[10]; sca(a,10);

Page 10: 《 程序设计基础( C 语言) 》

练习 3 输入 10 个整数,输出其中素数。 如输入: 2 6 9 91 101 81 71 61 51 41 则输出: 2 101 71 61 41

Page 11: 《 程序设计基础( C 语言) 》

程序 3: 输入 10 个整数,输出其中素数。 main() { int a[10], i; sca(a,10); for (i=0;i<10;i++) if (isprime(a[i])) printf("%d ",a[i]); printf("\n"); }

Page 12: 《 程序设计基础( C 语言) 》

3. 输出函数, prt void prt(int a[],int n) { int i; for (i=0;i<n;i++) printf("%d ", a[i]); printf("\n"); }

输出 a 数组的n 个整数,并换行。 熟练

调用模板 int a[10]; …… prt(a,10);

有 "%d " 或 "%d\t" 或 "8d" 等不同格式

Page 13: 《 程序设计基础( C 语言) 》

练习 4 先输入 10 个整数,再输出这 10 个整数。 如输入:( 10 个整数可分多行输入) 2 6 9 91 101 81 71 61 51 41 则输出:( 10 个整数在一行内输出) 2 6 9 91 101 81 71 61 51 41

Page 14: 《 程序设计基础( C 语言) 》

程序 4 main() { int a[10]; sca(a,10); prt(a,10); }

Page 15: 《 程序设计基础( C 语言) 》

4. 条件输出函数, prt_p void prt_p(int a[],int n) { int i; for (i=0;i<n;i++) if (isprime(a[i])) printf("%d ", a[i]); printf("\n"); }

输出数组中的所有素数。 掌握

调用模板 int a[10]; …… prt_p(a,10);

有 "%d " 或 "%d\t" 或 "8d" 等不同格式

Page 16: 《 程序设计基础( C 语言) 》

程序 3a: 输入 10 个整数,输出其中素数。 main() { int a[10]; sca(a,10); prt_p(a,10); }

Page 17: 《 程序设计基础( C 语言) 》

调用模板 int a[10];… prt_m(a,10,?);

5. 按行输出函数, prt_m void prt_m(int a[],int n,int m) { int i; for (i=0;i<n;i++) if (i%m==m-1||i==n-1) printf("%d\n",a[i]); else printf("%d\t",a[i]); }

按每行 m 个数的形式输出数组中的所有数。 掌握 每行最后一数 或最后一数 输出后换行 否则 输出后跳格

Page 18: 《 程序设计基础( C 语言) 》

练习 5: 输入 10 数 , 按每行 3 数输出 main() { int a[10]; sca(a,10); prt_m(a,10,3); }

Page 19: 《 程序设计基础( C 语言) 》

6. 输入函数, sca_n int sca_n(int a[]) { int n, i; scanf("%d",&n); for (i=0;i<n;i++) scanf("%d",&a[i]); return n; }

从键盘上输入整数 n ,再输入 n个整数到数组 a中,然后返回 n 。 掌握

调用模板 int a[100],n; n=sca_n(a);

Page 20: 《 程序设计基础( C 语言) 》

练习 6 输入 n 和 n 个整数,输出 n 个整数中的素数。 如输入:( n 和 n 个整数可分多行输入) 7 2 6 9 91 101 81 71 则输出:(在一行内输出) 2 101 71

Page 21: 《 程序设计基础( C 语言) 》

程序 6 main() { int a[100], n; n=sca_n(a); prt_p(a,n); }

合理假设: 设 n 不超过 100 定义 a 数组的元素个数为该假设的上限 验证 n 是否超界的代码可以省略

Page 22: 《 程序设计基础( C 语言) 》

7. 输入函数, sca_0 int sca_0(int a[]) { int n; for (n=0;1;n++) { scanf("%d",&a[n]); if (a[n]==0) break; } return n; }

从键盘上输入整数到数组 a中,直到输入0 时终止,返回 0 之前整数个数。 掌握

调用模板 int a[100],n; n=sca_0(a);

Page 23: 《 程序设计基础( C 语言) 》

练习 7 输入连续一批整数,直至输入 0 时终止,按每行 5数形式输出 0 之前的所有整数。 如输入:(所有数据可分多行输入) 7 2 6 9 91 101 81 71 0 则输出:( 8 个整数在分 2 行输出) 7 2 6 9 91 101 81 71

Page 24: 《 程序设计基础( C 语言) 》

程序 7 main() { int a[100], n; n=sca_0(a); prt_m(a,n,5); }

合理假设: 设 n 不超过 100 定义 a 数组的元素个数为该假设的上限 验证 n 是否超界的代码可以省略

Page 25: 《 程序设计基础( C 语言) 》

8. 累加和函数, sum long sum(int a[],int n) { long s=0; int i; for (i=0;i<n;i++) s += a[i]; return s; }

计算 a 数组中n 个整数的累加和并返回。 熟练

调用模板 int a[10];long s; …… s=sum(a,10);

Page 26: 《 程序设计基础( C 语言) 》

练习 8 输入 n 和 n 个整数 , 计算并输出累加和和平均值(保留一位小数)。 如输入: 5 20 10 40 50 30 则输出: Sum=150 Average=30.0

Page 27: 《 程序设计基础( C 语言) 》

程序 8 main() { int a[100], n; long s; n=sca_n(a); s=sum(a,n); printf("Sum=%ld\n",s); printf("Average=%.1f\n",(float)s/n); }

Page 28: 《 程序设计基础( C 语言) 》

9. 最大值函数, max int max(int a[],int n) { int x, i; x=a[0]; for (i=0;i<n;i++) if (x<a[i]) x=a[i]; return x; }

计算并返回 a数组中 n 个整数的最大值。 熟练

调用模板 int a[10],x; …… x=max(a,10);

Page 29: 《 程序设计基础( C 语言) 》

10. 最小值函数, min int min(int a[],int n) { int x, i; x=a[0]; for (i=0;i<n;i++) if (x>a[i]) x=a[i]; return x; }

计算并返回 a数组中 n 个整数的最小值。 熟练

调用模板 int a[10],x; …… x=min(a,10);

Page 30: 《 程序设计基础( C 语言) 》

练习 9 输入 10 个整数 , 输出 10 个整数的最大值和最小值 如输入: 6 9 91 101 81 71 2 61 51 41 则输出: Max=101, Min=2

Page 31: 《 程序设计基础( C 语言) 》

程序 9 main() { int a[10], mx, mn; sca(a,10); mx=max(a,10); mn=min(a,10); printf("Max=%d, Min=%d\n",mx,mn); }

Page 32: 《 程序设计基础( C 语言) 》

函数列表( 2 )11. int find(int a[],int n,int x)12. int count(int a[],int n,int x);13. void swap(int *p,int *q);14. void sort(int a[],int n);15. int select_a(int b[],int a[],int n);16. int select_p(int b[],int a[],int n,int x);17. void copy(int b[],int a[],int n);18. void shift(int b[],int a[],int n,int m);19. int issym(int a[],int n);20. void reverse(int a[],int n);

顺序查找统计次数交换数据冒泡排序 筛选 条件 复制 移位 对称 逆序

练习 10练习 11,12练习 13练习 14练习 15,16练习 17练习 18练习 19练习 20练习 21

Page 33: 《 程序设计基础( C 语言) 》

11.顺序查找函数, find int find(int a[],int n,int x) { int i; for (i=0;i<n;i++) if (a[i]==x) return i; return -1; }

查找 n 个整数的数组a 中值为 x 的元素并返回其下标,如果没找到则返回 -1 。 熟练

调用模板 int a[10],x,k; …… k=find(a,10,x);

Page 34: 《 程序设计基础( C 语言) 》

练习 10: 输入 10 个整数 , 输出最大值及其下标 main() { int a[10], mx, k; sca(a,10); mx=max(a,10); k=find(a,10,mx); printf("Max: a[%d]=%d\n",k,mx); }

Page 35: 《 程序设计基础( C 语言) 》

12.统计函数, count int count(int a[],int n,int x) { int ct=0, i; for (i=0;i<n;i++) if (a[i]==x) ct++; return ct; }

统计 n 个整数的数组a 中值为 x 的元素并返回其个数。 熟练

调用模板 int a[10],x,m; …… m=count(a,10,x);

Page 36: 《 程序设计基础( C 语言) 》

练习 11: 输入 10 个整数,输出其中只出现一次的数 main() { int a[10], i; sca(a,10); for (i=0;i<10;i++) if (count(a,10,a[i])==1) printf("%d ",a[i]); printf("\n"); }

输入 遍历 统计 a[i] 出现次数 并输出

Page 37: 《 程序设计基础( C 语言) 》

练习 12: 输入 10 个整数,输出其中正好出现 2次的数(仅第一次出现时输出) main() { int a[10], i; sca(a,10); for (i=0;i<10;i++) if (count(a,i,a[i])==0 && count(a+i,10-i,a[i])==2) printf("%d ",a[i]); printf("\n"); }

输入 遍历 之前次数 =0 本身与之后出现 2次 输出

Page 38: 《 程序设计基础( C 语言) 》

13. 交换函数, swap void swap(int *p,int *q) { int t; t=*p; *p=*q; *q=t; }

交换指针 p 和 q 所指变量的值。 可用于重写 reverse 与 sort 函数 掌握

调用模板 int x,y;…… swap(&x,&y);

Page 39: 《 程序设计基础( C 语言) 》

练习 13: 输入整数 x 和 y, 交换顺序后输出 main() { int x, y; scanf("%d%d",&x,&y); swap(&x,&y); printf("x=%d, y=%d\n",x,y); }

Page 40: 《 程序设计基础( C 语言) 》

14.冒泡排序函数, sort void sort(int a[],int n) { int i, j, t; for (i=0;i<n-1;i++) for (j=0;j<n-1-i;j++) if (a[j]>a[j+1]) { t=a[j]; a[j]=a[j+1]; a[j+1]=t; } }

对 a 数组的 n 个整数按从小到大顺序排序。 熟练 swap(&a[j], &a[j+1]);

调用模板 int a[10]; …… sort(a,10);

Page 41: 《 程序设计基础( C 语言) 》

使用 swap 函数的 sort void sort(int a[],int n) { int i, j; for (i=0;i<n-1;i++) for (j=0;j<n-1-i;j++) if (a[j]>a[j+1]) swap(&a[j],&a[j+1]); }

对 a 数组的 n个整数按从小到大顺序排序。 掌握

调用模板 int a[10];… sort(a,10);

Page 42: 《 程序设计基础( C 语言) 》

练习 14: 输入 10 个整数 , 从小到大排序后输出 main() { int a[10]; sca(a,10); sort(a,10); prt(a,10); }

Page 43: 《 程序设计基础( C 语言) 》

15. 筛选函数, select_a int select_a(int b[],int a[],int n,int x) { int i, k=0; for (i=0;i<n;i++) if (a[i]>x) b[k++]=a[i]; return k; }

将 a 数组 n 个整数中值大于 x 的元素复制到数组 b中,并返回满足条件的个数。 熟练

调用模板 int a[10],b[10],k;…… k=select_a(b,a,10,?);

Page 44: 《 程序设计基础( C 语言) 》

练习 15: 输入 n 和 n 个整数 , 选择其中正数部分 , 排序后输出 main() { int a[100], b[100], n, m; n=sca_n(a); m=select_a(b,a,n,0); sort(b,m); prt(b,m); }

Page 45: 《 程序设计基础( C 语言) 》

练习 16:091机试, 1-B-3 程序功能:输入 10 个整数(存贮在一维数组 a 中),按示例格式计算并输出以下结果。 ( 1 )输出最大值及其所在下标(输入的第一个整数对应下标 0 ); ( 2 )计算并输出平均值(浮点数,输出时保留 1 位小数); ( 3 )输出 10 个整数中大于平均值并且最接近平均值的数; ( 4 )按从小到大的顺序排序并输出这 10 个整数。 如输入: 50 60 70 80 90 95 85 75 65 55 则输出: Max=a[5]=95 Average=72.5 X=75 Sort: 50 55 60 65 70 75 80 85 90 95 示例说明:输入 10 个整数放在 a 数组中,最大值 95 对应的下标为 5 ,平均值为 72.5 ,大于平均值且最接近平均值的数为 75 。

Page 46: 《 程序设计基础( C 语言) 》

main() { int a[10], b[10], k, x, n, m; long s; float ave; sca(a,10); x=max(a,10); k=find(a,10,x); s=sum(a,10); ave=(float)s/10; n=select_a(b,a,10,ave); m=min(b,n); sort(a,10); printf("Max=a[%d]=%d\n",k,x); printf("Average=%.1f\n",ave); printf("X=%d\nSort: ",m); prt(a,10); }

Page 47: 《 程序设计基础( C 语言) 》

16. 条件筛选, select_p int select_p(int b[],int a[],int n) { int i, k=0; for (i=0;i<n;i++) if (isprime(a[i])) b[k++]=a[i]; return k; }

将 a 数组 n 个整数中的素数元素复制到数组 b 中,并返回满足条件的个数。 掌握

调用模板 int a[10],b[10],k;…… k=select_a(b,a,10);

Page 48: 《 程序设计基础( C 语言) 》

练习 17: 输入 10 个整数,按每行 3 数形式输出其中素数 main() { int a[10], b[10], k; sca(a,10); k=select_p(b,a,10); prt_m(b,k,3); }

输入 选择素数 输出素数

Page 49: 《 程序设计基础( C 语言) 》

17. 复制函数, copy void copy(int b[],int a[],int n) { int i; for (i=0;i<n;i++) b[i]=a[i]; }

a 数组的 n 个整数复制到b 数组中。 熟练

调用模板 int a[10],b[10]; …… copy(b,a,10);

Page 50: 《 程序设计基础( C 语言) 》

练习 18 输入 9 个整数,输出大小居中的整数及其在原序中的下标位置。 如输入: 66 77 88 99 100 90 80 70 60 则输出: Midd: a[6]=80

Page 51: 《 程序设计基础( C 语言) 》

程序 18 main() { int a[9],b[9],k; sca(a,9); copy(b,a,9); sort(b,9); k=find(a,9,b[4]); printf("Midd: a[%d]=%d\n", k, a[k]); }

输入 复制 排序 查找 输出

Page 52: 《 程序设计基础( C 语言) 》

18. 移位函数, shift void shift(int b[],int a[],int n,int m) { int i; for (i=0;i<n;i++) b[(i+m+n)%n]=a[i]; }

a 数组的 n 个整数右移 m个位置后复制到数组 b 中。m 为负表示左移。 掌握,公式分析

调用模板 int a[10],b[10]; …… shift(b,a,10,1);

Page 53: 《 程序设计基础( C 语言) 》

练习 19: 输入整数 m 和 10 个整数 ,右移m 个位置后输出 ,m 为负表示左移 main() { int a[10],b[10],m; scanf('%d",&m); sca(a,10); shift(b,a,10,m); prt(b,10); }

Page 54: 《 程序设计基础( C 语言) 》

19. 对称函数, issym int issym(int a[],int n) { int i, j; for (i=0,j=n-1;i<j;i++,j--) if (a[i]!=a[j]) return 0; return 1; }

判断 a 数组 n 个整数是否对称排列,是返回1 ,否则返回 0 。 掌握 调用模板 int a[10];…… if (issym(a,10))

Page 55: 《 程序设计基础( C 语言) 》

练习 20: 输入 n 和 n 个整数 , 如果 n 个整数首尾对称 , 则输出 Yes, 否则输出 No main() { int a[100], n; n=sca_n(a); if (issym(a,n)) printf("Yes\n"); else printf("No\n"); }

Page 56: 《 程序设计基础( C 语言) 》

20. 逆序函数, reverse void reverse(int a[],int n) { int i, j, t; for (i=0,j=n-1;i<j;i++,j--) { t=a[i]; a[i]=a[j]; a[j]=t; } }

将 a 数组 n 个整数逆序排列。

掌握 调用模板 int a[10];…… reverse(a,10);

Page 57: 《 程序设计基础( C 语言) 》

使用 swap 函数实现逆序, reverse void reverse(int a[],int n) { int i, j; for (i=0,j=n-1;i<j;i++,j--) swap(&a[i],&a[j]); }

将 a 数组 n 个整数逆序排列。

掌握 调用模板 int a[10];…… reverse(a,10);

Page 58: 《 程序设计基础( C 语言) 》

练习 21: 输入 10 个整数 , 从小到大排序输出 , 再从大到小排序输出 main() { int a[10]; sca(a,10); sort(a,10); prt(a,10); reverse(a,10); prt(a,10); }

Page 59: 《 程序设计基础( C 语言) 》

函数列表( 3 )21.int split(int a[],long d,int m);

进制分解,练习 2222.long merge(int a[],int n,int m);

进制合并,练习 23,24,25

Page 60: 《 程序设计基础( C 语言) 》

21.进制分解函数, split int split(int a[],long d,int m) { int i; for (i=0;1;i++) { a[i]=d%m; d=d/m; if (d<=0) return i+1; } }

将长整数 d拆分 n 位m进制,数值存于 a数组中,长度返回, a[0]存最低位 掌握

调用模板 int a[10];… split(a,?,10);

Page 61: 《 程序设计基础( C 语言) 》

练习 22 :输入一个长整数,从低到高逐位输出该数的各个位数 main() { long d; int a[10],n; scanf("%d",&d); n=split(a,d,10); prt(a,n); }

Page 62: 《 程序设计基础( C 语言) 》

22.进制合并函数, merge long merge(int a[],int n,int m) { long s=0, k=1; int i; for (i=0;i<n;i++) { s+=k*a[i]; k*=m; } return s; }

将 m 位 n进制数转换为长整数, a[0] 对应最低位 掌握

调用模板 int a[10],n;… s=merge(a,n,10);

Page 63: 《 程序设计基础( C 语言) 》

练习 23 输入一个整数,输出该整数各个倍数重新组成构成的最大值与最小值 如输入: 123987 则输出: Max: 987321 Min: 123789

Page 64: 《 程序设计基础( C 语言) 》

程序 23 main() { long d, mx, mn; int a[10], n; scanf("%ld",&d); n=split(a,d,10); sort(a,n); mx=merge(a,n,10); reverse(a,n); mn=merge(a,n,10); printf("Max: %ld\n",mx); printf("Min: %ld\n",mn); }

输入 按 10进制分解 从小到大排序 合并成最大值 逆序 合并成最小值 输出

Page 65: 《 程序设计基础( C 语言) 》

练习 24 :输入 10进制长整数,转换为7进制数并输出 main() { long d; int a[10],n; scanf("%ld",&d); n=split(a,d,7); reverse(a,n); prt(a,n); }

或 d=merge(a,n,10); printf("%ld\n",d);

Page 66: 《 程序设计基础( C 语言) 》

练习 25 :输入 7进制整数,转换为 10进制数并输出 main() { long d; int a[10],n; scanf("%ld",&d); n=split(a,d,10); d=merge(a,n,7); printf("%ld\n",d); }

Page 67: 《 程序设计基础( C 语言) 》

模拟练习( 1 ) 输入一批整数直至输入 0 为止,输出 0 之前的所有素数并计算其累加和与平均值。 如输入: 2 6 61 71 81 91 101 0 则输出: 2 61 71 101 Sum=235 Averge=58.8

Page 68: 《 程序设计基础( C 语言) 》

参考程序 /1 main() { int a[100],b[100],n,k; long s; n=sca_0(a); k=select_p(b,a,n); prt(b,k); s=sum(b,k); printf("Sum=%ld\n",s); printf("Average=%.1f\n",(float)s/k); }

#include <stdio.h> int isprime(int n) { int i; if (n<2) return 0; for (i=2;i<n;i++) if (n%i==0) return 0; return 1; } int sca_0(int a[]) { int n; for (n=0;1;n++) { scanf("%d",&a[n]); if (a[n]==0) break; } return n; } void prt(int a[],int n) { int i; for (i=0;i<n;i++) printf("%d ", a[i]); printf("\n"); } long sum(int a[],int n) { long s=0; int i; for (i=0;i<n;i++) s += i; return s; } int select_p(int b[],int a[],int n) { int i, k=0; for (i=0;i<n;i++) if (isprime(a[i])) b[k++]=a[i]; return k; } main() { int a[100],b[100],n,k; long s; n=sca_0(a); k=select_p(b,a,n); prt(b,k); s=sum(b,k); printf("Sum=%ld\n",s); printf("Average=%.1f\n",(float)s/k); }

Page 69: 《 程序设计基础( C 语言) 》

模拟练习( 2 ) 输入 n 和 n 个整数,按从小到大顺序输出其中素数,同时删除其中重复的素数。 如输入: 10 91 61 41 31 21 41 101 61 7 2 则输出: 2 7 31 41 61 101

Page 70: 《 程序设计基础( C 语言) 》

参考程序 /2 main() { int a[100],b[100],n,k,i; n=sca_n(a); k=select_p(b,a,n); sort(b,k); for (i=0;i<k;i++) if (count(b,i,b[i])==0) printf("%d ",b[i]); printf("\n"); }

#include <stdio.h> int isprime(int n) { int i; if (n<2) return 0; for (i=2;i<n;i++) if (n%i==0) return 0; return 1; } int select_p(int b[],int a[],int n) { int i, k=0; for (i=0;i<n;i++) if (isprime(a[i])) b[k++]=a[i]; return k; } int sca_n(int a[]) { int n, i; scanf("%d",&n); for (i=0;i<n;i++) scanf("%d",&a[i]); return n; } void sort(int a[],int n) { int i, j, t; for (i=0;i<n-1;i++) for (j=0;j<n-1-i;j++) if (a[j]>a[j+1]) { t=a[j]; a[j]=a[j+1]; a[j+1]=t; } } int count(int a[],int n,int x) { int ct=0, i; for (i=0;i<n;i++) if (a[i]==x) ct++; return ct; } main() { int a[100],b[100],n,k,i; n=sca_n(a); k=select_p(b,a,n); sort(b,k); for (i=0;i<k;i++) if (count(b,i,b[i])==0) printf("%d ",b[i]); printf("\n"); }

Page 71: 《 程序设计基础( C 语言) 》

模拟练习( 3 ) 输入 n 和 n 个成绩,按成绩高低输出这些成绩及其名次 如输入: 5 90 99 88 99 90 则输出: 1 : 99 1 : 99 3 : 90 3 : 90 5 : 88

Page 72: 《 程序设计基础( C 语言) 》

参考程序 /3 void sort_b(int a[],int n) { int i, j, t; for (i=0;i<n-1;i++) for (j=0;j<n-1-i;j++) if (a[j]<a[j+1]) { t=a[j]; a[j]=a[j+1]; a[j+1]=t; } } main() { int a[100],n,i,r; n=sca_n(a); sort_b(a,n); for (i=0;i<n;i++) { if (i==0||a[i]!=a[i-1]) r=i+1; printf("%d: %d\n",r,a[i]); } }

#include <stdio.h> int sca_n(int a[]) { int n, i; scanf("%d",&n); for (i=0;i<n;i++) scanf("%d",&a[i]); return n; } void sort_b(int a[],int n) { int i, j, t; for (i=0;i<n-1;i++) for (j=0;j<n-1-i;j++) if (a[j]<a[j+1]) { t=a[j]; a[j]=a[j+1]; a[j+1]=t; } } main() { int a[100],n,i,r; n=sca_n(a); sort_b(a,n); for (i=0;i<n;i++) { if (i==0||a[i]!=a[i-1]) r=i+1; printf("%d: %d\n",r,a[i]); } }

Page 73: 《 程序设计基础( C 语言) 》

模拟练习( 4 ) 输入 n 和 n 个成绩,按原顺序输出这些成绩及其名次 如输入: 5 90 99 88 99 90 则输出: 90 : 3 99 : 1 88 : 5 99 : 1 90 : 3

Page 74: 《 程序设计基础( C 语言) 》

参考程序 /4 int count_a(int a[],int n,int x) { int ct=0, i; for (i=0;i<n;i++) if (a[i]>x) ct++; return ct; } main() { int a[100], n, i, k; n=sca_n(a); for (i=0;i<n;i++) { k=count_a(a,n,a[i]); printf("%d: %d\n",a[i],k+1); } }

#include <stdio.h> int sca_n(int a[]) { int n, i; scanf("%d",&n); for (i=0;i<n;i++) scanf("%d",&a[i]); return n; } int count_a(int a[],int n,int x) { int ct=0, i; for (i=0;i<n;i++) if (a[i]>x) ct++; return ct; } main() { int a[100], n, i, k; n=sca_n(a); for (i=0;i<n;i++) { k=count_a(a,n,a[i]); printf("%d: %d\n",a[i],k+1); } }

Page 75: 《 程序设计基础( C 语言) 》

模拟练习( 5 ) 输入一个 10进制整数,各个倍数逆序后组成一个新的数,输出该数的 2倍 如输入: 23456 则输出: 130864

注: 65432 的 2倍

Page 76: 《 程序设计基础( C 语言) 》

参考程序 /5 main() { int a[10], n; long d; scanf("%ld",&d); n=split(a,d,10); reverse(a,n); d=merge(a,n,10); printf("%ld\n",2*d); }

#include <stdio.h> void swap(int *p,int *q) { int t; t=*p; *p=*q; *q=t; } void reverse(int a[],int n) { int i, j; for (i=0,j=n-1;i<j;i++,j--) swap(&a[i],&a[j]); } int split(int a[],long d,int m) { int i; for (i=0;1;i++) { a[i]=d%m; d=d/m; if (d<=0) return i+1; } } long merge(int a[],int n,int m) { long s=0, k=1; int i; for (i=0;i<n;i++) { s+=k*a[i]; k*=m; } return s; } main() { int a[10], n; long d; scanf("%ld",&d); n=split(a,d,10); reverse(a,n); d=merge(a,n,10); printf("%ld\n",2*d); }

Page 77: 《 程序设计基础( C 语言) 》

模拟练习( 6 ) 输入一个 10进制整数,转换为 16 位 2进制,并按 4 位一组的方式输出。 如输入: 1234 则输出: 0000-0100-1101-0010

Page 78: 《 程序设计基础( C 语言) 》

参考程序 /6 main() { int a[20]={0},i; long d; scanf("%ld",&d); split(a,d,2); reverse(a,16); for (i=0;i<16;i++) { printf("%d",a[i]); if (i==15) printf("\n"); else if (i%4==3) printf("-"); } }

#include <stdio.h> int split(int a[],long d,int m) { int i; for (i=0;1;i++) { a[i]=d%m; d=d/m; if (d<=0) return i+1; } } void swap(int *p,int *q) { int t; t=*p; *p=*q; *q=t; } void reverse(int a[],int n) { int i, j; for (i=0,j=n-1;i<j;i++,j--) swap(&a[i],&a[j]); } main() { int a[20]={0},i; long d; scanf("%ld",&d); n=split(a,d,2); reverse(a,16); for (i=0;i<16;i++) { printf("%d",a[i]); if (i==15) printf("\n"); else if (i%4==3) printf("-"); } }