实验六
task1.
#include <stdio.h> #define N 5 int binarySearch(int *x, int n, int item); // 函数声明 int main() { int a[N] = {2, 7, 19, 45, 66}; 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; } // 函数功能描述: // 使用二分查找算法在从地址x开始的连续n个数据项中,查找特定数据项item // 如果找到,返回其下标; 如果没找到,返回-1 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; }
task2.
#include <string.h> #include <stdio.h> #include <stdlib.h> void fun(char *a) { /*****ERROR********/ int i=0; char *p = a; /****ERROR***/ while (*p!='\0' && *p == '*')//将前导*复制给a[] { a[i] = *p; i++; p++; } while (*p)//删除字符间的*,将非*字符复制给a[] { /******ERROR*******/ if (*p != '*') { a[i] = *p; i++; } p++; } /******ERROR*******/ a[i] = '\0';//把结束标志复制给a[] } int main() { char s[81]; printf("Enter a string :\n"); gets(s); /***ERROR******/ fun(s);//传给函数一个地址即指针 printf("The string after deleted:\n"); puts(s); return 0; }
task3.
#include <stdio.h> #include <stdlib.h> #include <string.h> void fun(char *a) { /**ERROR******/ int i=0; char *t = a, *f = a; char *q = a;//将字符串分成三部分,即前导*,中间部分,后导* while (*t)//让t指向结束标记'/0'的前一个单元格 t++; t--;//t指向结束标记'/0'的前一个单元格 while (*t == '*')//找到尾部非*字符 t--; while (*f == '*')//找到头部非*字符 f++; /***ERROR***/ while (q < f)//将前导*复制给a[] { a[i] = *q; q++; i++; } while (q < t)//将中间部分的*删除,非*字符复制给a[] { /***ERROR**/ if (*q != '*') { a[i] = *q; i++; } q++; } while (*q)//将后导*复制给a[] { a[i] = *q; i++; q++; } /**ERROR**/ a[i] = '\0';//复制结束标志 } int main() { char s[81]; printf("Entre a string:\n"); gets(s); /**ERROR**/ fun(s); printf("The sting after deleted:\n"); puts(s); return 0; }
task4.
#include <stdio.h> #include <string.h> #define N 80 int isPalindrome(char *s); // 函数声明 int main() { char str[N]; int flag; printf("Enter a string:\n"); gets(str); flag = isPalindrome(str); // 函数调用 if (flag) printf("YES\n"); else printf("No\n"); return 0; } // 函数定义 // 功能:判断指针s指向的字符串是否是回文串,如果是,返回1;否则,返回0。 int isPalindrome(char *s) { int i,I; I=strlen(s); for(i=0;i<I/2;i++) if(s[i]!=s[I-1-i]) return 0; return 1; }
task5.
#include <stdio.h> #define N 80 int count(char *str, char *substr); // 函数声明 int main() { char str[N], substr[N]; int n; gets(str); // 输入母串 gets(substr); // 输入子串 n = count(str, substr); // 函数调用 printf("%d\n", n); return 0; } //函数功能:实现统计子串在母串中出现的次数 int count(char *str, char *substr) { int i, j, k; int num = 0; for(i=0;str[i]!='\0'; ++i)//外层循环取遍母串中的所有字符 for(j=i, k=0; substr[k] == str[j]; k++, j++)//内层循环:子串元素与母串相等时循环成立 if(substr[k+1] == '\0')// 子串元素与母串都相等,下一个元素为'\0'时,记子串在母串中出现一次 { num++; break; } return(num); }