C语言与程序设计-第5章_数组
一般的排序方法:插入、交换、选择、合并等等。交换排序包含冒泡排序和快速排序。插入排序包含希尔排序,选择排序包括堆排序等。常见的选择排序细分为简单选择排序、树形选择排序(锦标赛排序)、堆排序。 交换排序包含冒泡排序和快速排序。 但是完全有可能编译、连接、甚至运行都不会有错误。例如: #include int main() {int a[3][4]; a[3][4]=3; printf("%d",a[3][4]); return 0; } 因为字符串是常量。 在VC中为正1和负1(-1). 3)若一个字符为 “非空格” ,而 “其前面”的字符“也非”空格,表示一个单词尚未结束,单词数不应增加, 因此: num=num 4) “其前面”的字符是否为空格,由word的值判断。 即设word=0 表示“前”一个字符为“是”空格 word=1 表示“前”一个字符为“非”空格 ##I#am##a#boy. 是空格:则表示未出现新单词; 否:可能为新单词; 也可能是原单词的继续。 因此要看前一字符是否为“0”(是空格)。 ##I#am##a#boy. 判断: 1)关键是判断“当前”字符是否为空格; 2)然后再判断是否新单词; 3)要对字符串中的每个字符逐一进行上述判断。 把上述判断过程图示如下: 当前字符 ==空格? 是:未出现新单词,使word=0,num=num。 1)前一个字符为空格(即word=0时)则此时已出现新单词,应使word=1 并使num=num+1 2)前一个字符为非空格(即仍在原单词中,此时word=1),未出新单词,应使num=num ##I#am##a#boy. 程序设计要点: 1)在分析中,已定义了计数单词个数的变量num。 2)已定义了标志是否为单词的逻辑量word。 3)由于对一个字符串需逐个判断每个字符(即使每个字符顺序地成为当前字符),因此需要有循环结构,并定义循环变量i,以使循环能趋于结束。 4)由图可以看出,程序结构中包含有分支结构(如 yes、no)。 5)分支结构应包含在循环结构之内。 ##I#am##a#boy. 算法: 1)定义一个字符数组,并输入一个字符串。 2)定义一个临时字符变量,用来存放“当前字符”。 3)定义循环i、标志word、计数num变量。 输出 num i =i+ 1 word=1 num=num+1 word = 0 当(( c=string [ i ] ) ≠ ‘\0’ ) i = 0 输入一个字符串给 string c==空格 word==0 真 真 假 假 ##I#am##a#boy. #include void main() {char string[81]; int i,num=0,word=0; char c; gets(string); for(i=0;(c=string[i])!=‘\0’;i++) if(c==‘ ’) word=0; else if(word==0) { word=1;num=num+1;} } 输入一个字符串。 scanf只把一个字符串中空格或回车前的字符送入数组中。gets(string)函数只能用回车结束输入,允许输入空格。 ##I#am##a#boy. 例5.15 有3个字符串,要求出其中最大者。 分析: 1)设一个二维字符数组str,大小为3x20。因此可以把str[0]、str[1]、str[2]看成3个一维字符数组。 2)用gets函数分别读入3个字符串。 3)算法与求3个整数中的最大者相同。 #include #include void main() {char string[20]; 定义一个临时数组 char str[3][20]; 定义一个二维数组 int i; for(i=0;i<3;i++) gets(str[i]); 输入3个字符串 if(strcmp(str[0],str[1])>0) strcpy(string,str[0]); else strcpy(string,str[1]); 把比较后的大者放入string数组中 if(strcmp(str[2],string)>0) strcpy(string,str[2]); printf(“\nthe largest string is:\n%s\n”,string);} 例5.16 求子串。 char s