实验5 数组和指针
1.二分查找
实现方式1:形参是数组,实参是数组名,使用数组元素直接访问方式实现。
#include <stdio.h> const int N=5; int binarySearch(int x[], int n, int item); int main() { int a[N]={1,5,6,17,29}; int i,index, key; printf("数组a中的数据:\n"); for(i=0;i<N;i++) printf("%d ",a[i]); printf("\n"); printf("输入待查找的数据项: "); scanf("%d", &key); index=binarySearch(a,N,key) ; if(index>=0) printf("%d在数组中,下标为%d\n", key, index); else printf("%d不在数组中\n", key); return 0; } int binarySearch(int x[], int n, int item) { int low, high, mid; low = 0; high = n-1; while(low <= high) { mid = (low+high)/2; if (item == x[mid]) return mid; else if(item<x[mid]) high = mid - 1; else low = mid + 1; } return -1; }
实现方式2:形参是指针变量2,实参是数组名,使用指针变量间接访问方式实现。
补足line20和line45
#include <stdio.h> const int N=5; int binarySearch(int *x, int n, int item); int main() { int a[N]={2,23,26,45,67}; int i,index, key; printf("数组a中的数据:\n"); for(i=0;i<N;i++) printf("%d ",a[i]); printf("\n"); printf("输入待查找的数据项: "); scanf("%d", &key); index=binarySearch(a,N,key); if(index>=0) printf("%d在数组中,下标为%d\n", key, index); else printf("%d不在数组中\n", key); return 0; } int binarySearch(int *x, int n, int item) { int low, high, mid; low = 0; high = n-1; while(low <= high) { mid = (low+high)/2; if (item == *(x+mid)) return mid; else if(item<*(x+mid)) high = mid - 1; else low = mid + 1; } return -1; }
2.选择排序法
#include <stdio.h> #include <string.h> void selectSort(char str[][20], int n ); // 函数声明,形参str是二维数组名 int main() { char name[][20] = {"John", "Alex", "Joseph", "Candy", "Geoge"}; int i; printf("输出初始名单:\n"); for(i=0; i<5; i++) printf("%s\n", name[i]); selectSort(name, 5); // 调用选择法对name数组中的字符串排序 printf("按字典序输出名单:\n"); for(i=0; i<5; i++) printf("%s\n", name[i]); return 0; } // 函数定义 // 函数功能描述:使用选择法对二维数组str中的n个字符串按字典序排序 void selectSort(char str[][20], int n) { int i, j, k; char temp[20]; for(i=0; i<n-1; i++) { k = i; for(j=i+1; j<n; j++) if (strcmp(str[j] , str[k])<0 ) k = j; if(k != i) { strcpy(temp ,str[i]); strcpy(str[i] ,str[k]); strcpy(str[k] , temp); } } }
3.用指针处理字符串
练习1
#include <stdio.h> void delPrefixStar(char []); // 函数声明(函数声明中可以省略数组名不写) int main() {char string[80]; printf("输入一个字符串:\n"); gets(string); printf("\n删除前导*之前的字符串:\n"); puts(string); delPrefixStar(string); // 调用函数,删除前导*; 注意实参的写法 printf("\n删除前导*之后的字符串:\n"); puts(string); return 0; } // 函数定义 // 函数功能描述 // 删除字符数组s中前导* void delPrefixStar(char s[]) { char *target, *source; // 从字符串开始找到不是*的位置 source = s; while(*source == '*') source++; // 从这个位置开始将余下的字符前移 target = s; while( *target++ = *source++); }
实验总结和体会:
1.二分法查找算法:数组名作为参数与指针变量作为参数:
形参数组名用int a[],指针变量用int*p;实参数组名用suma[i],指针变量用*(p+1)。。。
数组元素表示数组名用啊a[i],指针变量用*(p+1)
(这部分非原创,,,自己也不知道怎么总结,查了百度)
2.其他总结也不好说了,,,感觉还是不懂,云里雾里的。指针好难。
互评链接:
https://www.cnblogs.com/husky139/p/10931200.html
https://www.cnblogs.com/96ldc/p/10928425.html
https://www.cnblogs.com/333y/p10925726.html