780 likes | 917 Views
《 程序设计基础( 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
E N D
《程序设计基础(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 前缀“l”:long 前缀“f”:float 前缀“p”:指针 前缀“str_”:字符串 前缀“strs_”:多字串 前缀“stu_”:学生 后缀用于说明额外条件 后缀“_p”:素数 后缀“_a”:大于 后缀“_ae”:大于等于 后缀“_b”:小于 后缀“_be”:小于等于 后缀“_n”:n个 后缀“_0”:直到0 函数名的前缀与后缀
int isprime(int n); void sca(int a[],int n); void prt(int a[],int n); void prt_p(int a[],int n); void prt_m(int a[],int n,int m); int sca_n(int a[]); int sca_0(int a[]); long sum(int a[],int n); int max(int a[],int n); int min(int a[],int n); 判断素数 输入函数 输出函数 条件输出 按行输出 输入n个 输入至0 累加和 最大值 最小值 函数列表(1) 练习1,2 练习3 练习4 练习3a 练习5 练习6 练习7 练习8 练习9
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。 熟练 1.素数函数,isprime • 调用模板 • int n;…… • if (isprime(n))
练习1 • 输入整数n,如果n是素数,则输出Yes,否则输出No。 • 如输入:5 • 则输出:Yes • 如输入:6 • 则输出: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 程序1:输入整数n,若n为素数则输出Yes,否则输出No
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均为素数 只需一个公式 练习2:将4到100的所有偶数分解为两个素数之和
void sca(int a[],int n) { int i; for (i=0;i<n;i++) scanf("%d",&a[i]); } 从键盘上输入n个整数到数组a中 熟练 2.输入函数,sca • 调用模板 • int a[10]; • sca(a,10);
练习3 • 输入10个整数,输出其中素数。 • 如输入: • 2 6 9 91 101 81 71 61 51 41 • 则输出: • 2 101 71 61 41
程序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"); • }
void prt(int a[],int n) { int i; for (i=0;i<n;i++) printf("%d ", a[i]); printf("\n"); } 输出a数组的n个整数,并换行。 熟练 3.输出函数,prt • 调用模板 • int a[10]; • …… • prt(a,10); • 有"%d "或"%d\t"或"8d" • 等不同格式
练习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
程序4 • main() • { • int a[10]; • sca(a,10); • prt(a,10); • }
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"); } 输出数组中的所有素数。 掌握 4.条件输出函数,prt_p • 调用模板 • int a[10]; • …… • prt_p(a,10); • 有"%d "或"%d\t"或"8d" • 等不同格式
程序3a:输入10个整数,输出其中素数。 • main() • { • int a[10]; • sca(a,10); • prt_p(a,10); • }
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个数的形式输出数组中的所有数。 掌握 每行最后一数 或最后一数 输出后换行 否则 输出后跳格 5.按行输出函数,prt_m • 调用模板 • int a[10];… • prt_m(a,10,?);
练习5:输入10数,按每行3数输出 • main() • { • int a[10]; • sca(a,10); • prt_m(a,10,3); • }
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。 掌握 6.输入函数,sca_n • 调用模板 • int a[100],n; • n=sca_n(a);
练习6 • 输入n和n个整数,输出n个整数中的素数。 • 如输入:(n和n个整数可分多行输入) • 7 2 6 • 9 91 101 81 • 71 • 则输出:(在一行内输出) • 2 101 71
main() { int a[100], n; n=sca_n(a); prt_p(a,n); } 合理假设: 设n不超过100 定义a数组的元素个数为该假设的上限 验证n是否超界的代码可以省略 程序6
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之前整数个数。 掌握 7.输入函数,sca_0 • 调用模板 • int a[100],n; • n=sca_0(a);
练习7 • 输入连续一批整数,直至输入0时终止,按每行5数形式输出0之前的所有整数。 • 如输入:(所有数据可分多行输入) • 7 2 6 • 9 91 101 • 81 71 0 • 则输出:(8个整数在分2行输出) • 7 2 6 9 91 • 101 81 71
main() { int a[100], n; n=sca_0(a); prt_m(a,n,5); } 合理假设: 设n不超过100 定义a数组的元素个数为该假设的上限 验证n是否超界的代码可以省略 程序7
long sum(int a[],int n) { long s=0; int i; for (i=0;i<n;i++) s += a[i]; return s; } 计算a数组中n个整数的累加和并返回。 熟练 8.累加和函数,sum • 调用模板 • int a[10];long s; • …… • s=sum(a,10);
练习8 • 输入n和n个整数,计算并输出累加和和平均值(保留一位小数)。 • 如输入: • 5 20 10 40 50 30 • 则输出: • Sum=150 • Average=30.0
程序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); • }
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个整数的最大值。 熟练 9.最大值函数,max • 调用模板 • int a[10],x; • …… • x=max(a,10);
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个整数的最小值。 熟练 10.最小值函数,min • 调用模板 • int a[10],x; • …… • x=min(a,10);
练习9 • 输入10个整数,输出10个整数的最大值和最小值 • 如输入: • 6 9 91 101 81 71 2 61 51 41 • 则输出: • Max=101, Min=2
程序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); • }
int find(int a[],int n,int x) int count(int a[],int n,int x); void swap(int *p,int *q); void sort(int a[],int n); int select_a(int b[],int a[],int n); int select_p(int b[],int a[],int n,int x); void copy(int b[],int a[],int n); void shift(int b[],int a[],int n,int m); int issym(int a[],int n); void reverse(int a[],int n); 顺序查找 统计次数 交换数据 冒泡排序 筛选 条件 复制 移位 对称 逆序 函数列表(2) 练习10 练习11,12 练习13 练习14 练习15,16 练习17 练习18 练习19 练习20 练习21
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。 熟练 11.顺序查找函数,find • 调用模板 • int a[10],x,k; • …… • k=find(a,10,x);
练习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); • }
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的元素并返回其个数。 熟练 12.统计函数,count • 调用模板 • int a[10],x,m; • …… • m=count(a,10,x);
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] 出现次数 并输出 练习11:输入10个整数,输出其中只出现一次的数
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次 输出 练习12:输入10个整数,输出其中正好出现2次的数(仅第一次出现时输出)
void swap(int *p,int *q) { int t; t=*p; *p=*q; *q=t; } 交换指针p和q所指变量的值。 可用于重写reverse 与sort函数 掌握 13.交换函数,swap • 调用模板 • int x,y;…… • swap(&x,&y);
练习13:输入整数x和y,交换顺序后输出 • main() • { • int x, y; • scanf("%d%d",&x,&y); • swap(&x,&y); • printf("x=%d, y=%d\n",x,y); • }
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]); 14.冒泡排序函数,sort • 调用模板 • int a[10]; • …… • sort(a,10);
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个整数按从小到大顺序排序。 掌握 使用swap函数的sort • 调用模板 • int a[10];… • sort(a,10);
练习14:输入10个整数,从小到大排序后输出 • main() • { • int a[10]; • sca(a,10); • sort(a,10); • prt(a,10); • }
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中,并返回满足条件的个数。 熟练 15.筛选函数,select_a • 调用模板 • int a[10],b[10],k;…… • k=select_a(b,a,10,?);
练习15:输入n和n个整数,选择其中正数部分,排序后输出练习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); • }
练习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。
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); • }
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中,并返回满足条件的个数。 掌握 16.条件筛选,select_p • 调用模板 • int a[10],b[10],k;…… • k=select_a(b,a,10);
main() { int a[10], b[10], k; sca(a,10); k=select_p(b,a,10); prt_m(b,k,3); } 输入 选择素数 输出素数 练习17:输入10个整数,按每行3数形式输出其中素数
void copy(int b[],int a[],int n) { int i; for (i=0;i<n;i++) b[i]=a[i]; } a数组的n个整数复制到b数组中。 熟练 17.复制函数,copy • 调用模板 • int a[10],b[10]; • …… • copy(b,a,10);
练习18 • 输入9个整数,输出大小居中的整数及其在原序中的下标位置。 • 如输入: • 66 77 88 99 100 90 80 70 60 • 则输出: • Midd: a[6]=80