1 / 78

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

《 程序设计基础( 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

Télécharger la présentation

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

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 《程序设计基础(C语言)》 学生函数库 2010.1.15 初稿 2010.1.20二稿

  2. isprime:素数判断 swap:交换 sca:输入 prt:输出 sum:累加和 max:最大值 min:最小值 find:查找 count:计数 sort:排序 select:筛选/选择 copy:复制 shift:移位 issym:对称判断 reverse:逆序 split:分解 merge:合并 函数名与函数功能 学生学习、编程、考试时常用的函数库

  3. 前缀用于说明类型 正常:int 前缀“l”:long 前缀“f”:float 前缀“p”:指针 前缀“str_”:字符串 前缀“strs_”:多字串 前缀“stu_”:学生 后缀用于说明额外条件 后缀“_p”:素数 后缀“_a”:大于 后缀“_ae”:大于等于 后缀“_b”:小于 后缀“_be”:小于等于 后缀“_n”:n个 后缀“_0”:直到0 函数名的前缀与后缀

  4. 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

  5. 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))

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

  7. #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

  8. 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的所有偶数分解为两个素数之和

  9. 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);

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

  11. 程序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"); • }

  12. 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" • 等不同格式

  13. 练习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

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

  15. 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" • 等不同格式

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

  17. 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,?);

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

  19. 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);

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

  21. main() { int a[100], n; n=sca_n(a); prt_p(a,n); } 合理假设: 设n不超过100 定义a数组的元素个数为该假设的上限 验证n是否超界的代码可以省略 程序6

  22. 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);

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

  24. main() { int a[100], n; n=sca_0(a); prt_m(a,n,5); } 合理假设: 设n不超过100 定义a数组的元素个数为该假设的上限 验证n是否超界的代码可以省略 程序7

  25. 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);

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

  27. 程序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); • }

  28. 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);

  29. 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);

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

  31. 程序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); • }

  32. 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

  33. 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);

  34. 练习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); • }

  35. 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);

  36. 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个整数,输出其中只出现一次的数

  37. 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次的数(仅第一次出现时输出)

  38. 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);

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

  40. 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);

  41. 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);

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

  43. 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,?);

  44. 练习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); • }

  45. 练习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。

  46. 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); • }

  47. 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);

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

  49. 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);

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

More Related