第五次实验~~
实验结论:
1.二分查找:
(1)
#include <stdio.h> const int N=5; int binarySearch(int x[], int n, int item); int main() { int a[N]={1,4,7,20,35}; 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); getchar(); 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> const int N=5; int binarySearch(int *x, int n, int item); int main() { int a[N]={1,5,13,17,31}; 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, 5, 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] = {"Aggie", "Jack", "John", "Mike", "Stark"}; int i; printf("输出初始名单:\n"); for(i=0; i<5; i++) printf("%s\n", name[i]); selectSort(name, 5); printf("按字典序输出名单:\n"); for(i=0; i<5; i++) printf("%s\n", name[i]); return 0; } void selectSort(char str[][20], int n) { int k,i,j; char temp[8]; 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.用指针处理字符串
认真理解阅读后回答老师在代码里让我思考的问题:
while(p<=head){ s[i]=*p; p++; i++; }
我认为这里的条件表达式要这样写的原因是:让后续判断p是否为*号时从不是*号的第一个字符开始,其次这一个循环的作用就是先把第一个字符之前的*号全都复制到s[i]里去(这里表达可能不准确),然后同时让p对应第一个非*的字符位置以便于后面的判断。
s[i] = '\0';
对于这一步在第二和第三个练习中都有出现,但是在第一个练习中没有,这里进行对比:
在第一个实验中关于赋值的表达式是这样的:
while( *target++ = *source++);
如此在赋值的最后到了/0这个结束符时,这个表达式会先赋值再判断,于是不用写上面的s[i]='/0'这个东西。
而对于第二三个练习中:
while(*p) { if(*p != '*') { `s[i] = *p; i++; } p++;
while(*p) { s[i] = *p; i++; p++; }
这样的条件表达式就会在结束符在被赋值之前就结束了,所以要加上上述的那个赋值表达式。
因为这是一个字符串,所以在字符串的最后必须要有一个结束符/0,所以需要这个表达式。
实验总结:
1.数组名作为参数 vs. 指针变量作为参数,在形参、实参写法,以及函数实现中数组元素表示的差异:
(1)数组名在作为参数时,其形参的写法为类似int sort ( int x[ ] , int x)或者int sort(int *x,int x),实参写法为类似sort(a,N)
(2)指针变量在作为参数时,其形参的写法int sort(int *,int *),实参的写法为类似sort(pa,pb)[其中的pa和pb为已经定义且有指向的指针变量]
(3)在以数组名为参数的函数里,数组元素表示为a[ i ]。在以指针变量为参数的函数里,数组元素表示为*(pa+i)。
2.在使用选择排序法时的注意事项:
(1)两次循环的范围:第一个循环的范围是i<n-1;第二个循环的范围是j<n>
3.使用指针变量对字符串进行处理注意事项总结:
(1)处理的思想应该是用另一个字符串数组来储存处理后的字符串,把处理好的字符串赋值到新的字符串数组中,而不是在本身内部变化。
(2)条件表达式的书写技巧,对于循环范围的观察是关键的细节,不然可能功亏一篑。
(3)在字符串的最后有结束符,结束符的存在与否也很关键且易错。
吐槽踩坑环节:visual studio真的用不来,各种可以在devc上正常的代码在那上面就是会不行,没有错误也不是危险警告,哎,visual studio本来看着高端一点想用,至此我放弃了。这次实验自己编写的部分较少所以没怎么踩坑,只是在想练习中的思考题的时候脑壳痛(还好想出来了,虽然不知道对不对,但是能说服我自己)。现在c语言的内容变得好难,痛苦。现在对指针的应用还是很不熟练,对很多的定义概念还是模糊不清。
https://www.cnblogs.com/rainbowhorse/p/10913360.html
https://www.cnblogs.com/sfyq/p/10931605.html
https://www.cnblogs.com/QYAS/p/10931318.html