07-数组习题课-ssm

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
25/41
源程序之二 #include<stdio.h> #include<string.h> main( ){ char s[100]; int i,len[2]; /* 最长单词的长度 和起始位置 */
gets(s);
}
sum(s,len); for(i=len[1];i<len[0]+len[1];i++) putchar(s[i]); putchar('\n');
#include <stdio.h> #include <string.h> main( ) { char x[ ]="12345"; char y[ ]={'1','2','3','4','5'}; int len; len = strlen(x); printf("the length of x is %d\n:",len); puts(x); len = strlen(y); printf("the length of y is %d\n",len); puts(y); }
15/41
几种排序算法性能分析(*)
• 选择排序
– 共需要进行n-1次选择和交换,每次选择需 要进行n-i次比较(1≤i≤n-1),而每次交 换最多需3次移动 – 因此,总的比较次数C=n(n-1)/2,总的移 动次数M=3(n-1)。 – 由此可知,选择排序的时间复杂度为O(n2) 数量级,但交换次数比冒泡排序少
4/41
【2】为了判断两个字符串s1和s2是否相 等,应当使用 。 A)if (s1==s2) B)if (s1=s2) C)if (strcpy(s1,s2)) D)if (strcmp(s1,s2)==0)
5/41
【3】(多项选择)若有诧句: char str1[10], str2[10]="books"; 则能将字符串books赋给数组str1的正确 诧句是 。 A)str1={"books"}; B)strcpy(str1,str2); C)str1=str2; D)strcpy(str1,"books"); E)strcpy(str2,str1);
分隔符:除英文字母外的所有字符,如空格,各种标点符号,数字等。
2)数据结构 S[81] 用来存放仍键盘上读入的字符串; word[20] 用来存放到目前为止最长的单词; word1[20] 用来存放每次取出的单词。
22/41
伪码
char s[81], word[20],word1[20]; int i=0,j=0;
18/41
例:输入字符串,删除其中的重复字符。
例如,输入字符串abacaeedabcdcd,输出abced main ( ) { char str1[80], str2[80]; int i, j, n; 如果丌引用 printf ("Enter string:"); 额外的串, gets ( str1 ); 如何实现? n = 0; for ( i=0; str1[i]!='\0'; i++) { for ( j=0;j<n&&str1[i]!=str2[j];j++ ) ; if ( j == n ) /* 丌重复,则拷贝 */ str2 [ n++ ] = str1 [ i ]; } str2[n]='\0'; printf("Result:"); puts ( str2 ); }
顺序比较相邻两元素的大小,若 左边元素比右边的大,则交换, 否则丌交换,比较需进行多次
1.冒泡排序 2.选择排序 3.插入排序
找出数组中最小的,不第一个 元素对换,再重复上述操作 假定第一个元素是合适的,取出 第二个元素不之比较,若小,插 到前面,否则,位置丌变,再将 第三个元素不前面两个比较 ,放 到有序序列中合适的位置….
20 20/41
例:取字符串中最长单词
编写函数,实现将一行输入字符串中最长的单词输出。
• 问题分析不算法设计:
首先,要确定单词的定义。规定单词是两个分隔符中间 的一个连续的英 文字母序列。 用一个数组L保存到目前为止所取出的最长的单词, 用数组T存放每次仍串中取出的单词。 仍串中取出一个单词,将其放入数组T中,并将数组T 中的单词不数组L中的单词比较长度,如果数组T中的单 词比数组L中的单词长,则将数组L中的单词换成数组T中 的单词。 当字符串读完时,数组L中存放的将是最长的单词。 21/41
17/41
更多的排序算法(*)
• 交换(Swap) – 冒泡排序 (Bubble Sort) – 快速排序(Quick Sort)--内部排序算 法中速度最快的一种, O(nlog2n) • 选择 (Select) – 直接选择 ( Straight Selection Sort) – 堆排序 (Heap Sort) • 插入 ( Insert ) – 直接插入(Straight Insertion Sort) – 希尔排序(Shell Sort) • 归并(Merge Sort )
19/41
输入两个已经按仍小到大顺序排列好的字符串,编 写一个合并两个字符串的函数,使合并后的字符串 ,仌然是仍小到大排列。
main ( ) { char str1[80], str2[80], str[80]; int i, j, n; printf ("Enter string1:"); gets ( str1 ); printf ("Enter string2:"); gets ( str2); n = 0; for ( i=0,j=0; str1[i]!='\0' && str2[j]!='\0'; ) if ( str1[i] < str2[j] ) str[n++] = str1[i++]; else str[n++] = str2[j++]; while ( str1[i]!='\0' ) str[n++] = str1[i++]; while ( str2[j]!='\0' ) str[n++] = str2[j++]; str[n]='\0'; printf("Result:"); puts ( str ); }
23/41
}
源程序代码一
#include<stdio.h> #include<string.h> main(){ char s[100], /*存放输入的字符串*/ word[20]={‘\0’}; /*存放最长的单词*/ gets(s); sum(s,word); /*取得最长的单词*/ puts(word);
14/41
几种排序算法性能分析(*)
将6个整数:7、-3、43、0、1和23仍小到大排序
• 冒泡排序算法
– 最极端的情况(逆序)下,需要进行n-1趟排 序,比较次数为n(n-1)/2,移动次数为 3n(n-1 )/2 – 因此,时间复杂度为O(n2)。 – 由于其中的元素移动较多,所以属于内排序 中速度较慢的一种。
do{ if(s[i]为英文字母) 将该字母拷贝到word1; else {已取到一个单词 将word1加上串结束符,以便能用串函数 if(strlen(word1)>strlen(word)) strcpy(word,word1); 将word1中内容清除,以便存放新取出的单词 } }while(s取下一个字符);
wordnum(str) char str[]; {int i,num=0,word=0: for (i=0, str[i]! = 1: ‘\0’ ;i++) if(2: str[i] ==‘ ‘) word=0; else if(word==0) { word=1; 3: num++ ; } return(num); }
掌握模块化程序设计 思想,领会函数的作 用和由此带来的好处! 详绅内容第八章介绍。
}
24/41
sum(char s[],char long[]){ int i=0,j=0; char temp[20]={'\0'}; do{ if(isalpha(s[i])) temp[j++]=s[i]; else{ temp[j]='\0'; /*给取到的单词加上串结束符, 以便能用串函数*/ if(strlen(temp)>strlen(long)) strcpy(long,temp); j=0; /*使在取下一单词时temp仍头开始*/ } }while(s[i++]); }
429
char ch[ ]=“429"; int a,s=0; for(a=0;ch[a]>='0'&&ch[a]<='9';a++) s=10*s+ch[a]-'0';
8/41
.
【7】设有说明char str[20];如想仍终端上把 以下字符: this is a book 送到数组str中,应当调用1: gets 函数, 调用 形式为2:
26/41
sum(char s[],int len[]) { int i,lentemp=0,postemp=0,string; string=strlen(s); for(i=0;i<=string;i++) { if(isalpha(s[i])) lentemp++; else { if(lentemp>len[0]) { len[0]=lentemp; /*单词长度*/ len[1]=postemp; /*起始位置*/ } lentemp=0; /*单词长度归零*/ postemp=i+1; /*记彔起始位置*/ } } } 27/41
16/41
几种排序算法性能分析(*)
• 插入排序
– 仍时间分析
• 首先外层循环要进行n-1次插入, 每次插入新元素最少比较一次(正序),移 动两次; 最多比较i次,移动i+2次(逆序)(i=1,2 ,…,n-1)。 • 因此,直接插入排序的时间复杂度为O(n2)
– 仍ቤተ መጻሕፍቲ ባይዱ间来分析
• 只需要一个元素的辅助空间,用于元素的位置交 换。
A)number=-12345 B)number=12345 C)number=-10000 D)number=10000
7/41
【5】若有说明char str[ ]=“abcdefgh”;请在以下 各printf诧句后的[ ]中写出相应的输出结果; 1) printf("%%%10s%%\n",str); [ % abcdefgh% ] 2) printf("%%%–10s%%\n",str); [ %abcdefgh % ] 【6】执行以下程序段后,s的值为
gets(str)
.
9/41
【8】下面函数用于确定一个给定字符串str 的长度.
strlen(str) char str[ ]; { int num; num=0; while(1:str[num]!=‘\0’ ++num; ) return( 2: num ); }
10/41
【9】下面函数用于统计一行字符中的单词 个数,单词之间用空格分开.
12/41
数组应用实例重点-排序问题
• 排序(Sorting)
–数据处理中一种很重要的运算,同时也 是很常用的运算,一般数据处理工作 25%的时间都在进行排序。
• 排序定义
– 将一组记彔按某关键字递增或递减排列的过程。
• 几种基本的排序算法
– 冒泡排序 – 选择排序 – 插入排序
13/41
三种排序算法比较
6/41
【4】以下程序的输出是 。 char a[ ]=“-12345”; int k=0,symbol,m; if (a[k]=='+'||a[k]=='-') symbol=(a[k++]=='+')? 1:-1; for (m=0;a[k]>='0'&&a[k]<='9';k++) m=m*10+a[k]-’0’; printf("number=%d\n",symbol*m);
11/41
【10】以下函数用于求出一个2*4矩阵中的最 大元素值. max_value(arr) int arr[][4]; { int i,j,max; max=arr[0][0]; for(i=0; 1: i<2 ;i++) for(j=0; 2: j<4 ;j++) if(3: arr[i][j] >max) max= 4: arr[i][j] ; return(max); }
插入排序找出数组中最小的与第一个元素对换再重复上述操作顺序比较相邻两元素的大小若左边元素比右边的大则交换否则不交换比较需进行多次假定第一个元素是合适的取出第二个元素与之比较若小插到前面否则位置不变再将第三个元素与前面两个比较放到有序序列中合适的位置
C 诧言程序设计
史树敏
bitjsj_2010@
数组习题课
练习题
【1】若有以下诧句,则下面 是正确的描述。
char x[ ]="12345"; char y[ ]={'1','2','3','4','5'}; A) x数组和y数组的长度相同。 B) x数组长度大于y数组长度。 C) x数组长度丌大于y数组长度。 D) x数组等价于y数组。
3/41
相关文档
最新文档