6 指针_参考程序
- 格式:doc
- 大小:63.04 KB
- 文档页数:8
习题解答一、单项选择题1.若定义了int n=2, *p=&n, *q=p;则下面【】的赋值是非法的。
A.p=qB. *p=*qC. n=*qD. p=n【答案】D2.若定义了double *p, a;则能通过scanf函数给输入项读入数据的程序段是【】。
A.p=&a; scanf(“%1e”,p);B. *p=&a; scanf(“%1f”,p);C. p=&a; scanf(“%f”,p);D. p=&a; scanf(“%1f”,a);【答案】C3.若定义了int a[10], i=3, *p; p=&a[5];下面不能表示为a数组元素的是【】。
A.p[-5]B. a[i+5]C. *p++D. a[i-5]【答案】D4.若有如下定义:int n[5]={1,2,3,4,5},*p=n;则值为5的表达式是【】。
A.*+5B. *(p+5)C. *p+=4D. p+4【答案】C5.设变量b的地址已赋给指针变量ps,下面为“真”的表达式是【】。
A.b==&psB. b==psC. b==*psD. &b==&ps【答案】C6.设有以下定义和语句:int a[3][2]={1,2,3,4,5,6},*p[3];p[0]=a[1];则*(p[0]+1)所代表的数组元素是【】。
A.a[0][1]B. a[1][0]C. a[1][1]D. a[1][2]【答案】C7.若定义了char *str=”Hello!”;下面程序段中正确的是【】。
A.char c[ ], *p=c; strcpy(p,str);B.char c[5], *p; strcpy(p=&c[1],&str[3]);C.char c[5]; strcpy(c,str);D.char c[5]; strcpy(p=c+2,str+3);【答案】B8.若有下面的程序段,则不正确的fxy函数的首部是【】。
数据结构(第4版)习题及实验参考答案数据结构复习资料完整版(c语言版)数据结构基础及深入及考试习题及实验参考答案见附录结论1、数据的逻辑结构是指数据元素之间的逻辑关系。
即从逻辑关系上描述数据,它与数据的存储无关,是独立于计算机的。
2、数据的物理结构亦称存储结构,是数据的逻辑结构在计算机存储器内的表示(或映像)。
它依赖于计算机。
存储结构可分为4大类:顺序、链式、索引、散列3、抽象数据类型:由用户定义,用以表示应用问题的数据模型。
它由基本的数据类型构成,并包括一组相关的服务(或称操作)。
它与数据类型实质上是一个概念,但其特征是使用与实现分离,实行封装和信息隐蔽(独立于计算机)。
4、算法:是对特定问题求解步骤的一种描述,它是指令的有限序列,是一系列输入转换为输出的计算步骤。
5、在数据结构中,从逻辑上可以把数据结构分成(C)A、动态结构和表态结构B、紧凑结构和非紧凑结构C、线性结构和非线性结构D、内部结构和外部结构6、算法的时间复杂度取决于(A)A、问题的规模B、待处理数据的初态C、问题的规模和待处理数据的初态线性表1、线性表的存储结构包括顺序存储结构和链式存储结构两种。
2、表长为n的顺序存储的线性表,当在任何位置上插入或删除一个元素的概率相等时,插入一个元素所需移动元素的平均次数为(E),删除一个元素需要移动的元素的个数为(A)。
A、(n-1)/2B、nC、n+1D、n-1E、n/2F、(n+1)/2G、(n-2)/23、“线性表的逻辑顺序与存储顺序总是一致的。
”这个结论是(B)A、正确的B、错误的C、不一定,与具体的结构有关4、线性表采用链式存储结构时,要求内存中可用存储单元的地址(D)A、必须是连续的B、部分地址必须是连续的C一定是不连续的D连续或不连续都可以5、带头结点的单链表为空的判定条件是(B)A、head==NULLB、head->ne某t==NULLC、head->ne某t=headD、head!=NULL6、不带头结点的单链表head为空的判定条件是(A)A、head==NULLB、head->ne某t==NULLC、head->ne某t=headD、head!=NULL7、非空的循环单链表head的尾结点P满足(C)A、p->ne某t==NULLB、p==NULLC、p->ne某t==headD、p==head8、在一个具有n个结点的有序单链表中插入一个新结点并仍然有序的时间复杂度是(B)A、O(1)B、O(n)C、O(n2)D、O(nlog2n)数据结构(第4版)习题及实验参考答案9、在一个单链表中,若删除p所指结点的后继结点,则执行(A)A、p->ne某t=p->ne某t->ne某t;B、p=p->ne某t;p->ne某t=p->ne某t->ne某t;C、p->ne某t=p->ne某t;D、p=p->ne某t->ne某t;10、在一个单链表中,若在p所指结点之后插入所指结点,则执行(B)A、->ne某t=p;p->ne某t=;B、->ne某t=p->ne某t;p->ne某t=;C、->ne某t=p->ne某t;p=;D、p->ne某t=;->ne某t=p;11、在一个单链表中,已知q是p的前趋结点,若在q和p之间插入结点,则执行(C)A、->ne某t=p->ne某t;p->ne某t=;B、p->ne某t=->ne某t;->ne某t=p;C、q->ne某t=;->ne某t=p;D、p->ne某t=;->ne某t=q;12、在线性结构中,第一个结点没有前趋结点,其余每个结点有且只有1个前趋结点。
硬度操作规程6篇第1篇维氏硬度计的操作规程一、试验前的准备工作1、试样(1)试样的试面必须为光滑面,不得有氧化物及外来污物,试验面得表面粗糙度必须保证压痕对角线精确的测量,一般ra不得大于0.2微米。
(2)在试样的制备过程中,因尽量受冷、热加工等对试样表面的影响。
(3)试样或试验层的厚度至少应为压痕对角线的1.5倍,试验后试样背后不应出现可见的变形痕迹,试样的厚度和预计硬度值按下式选择选择适当的试验力f。
h2_hv预f= (kgf)4.7式中:f-----待选用的试验力(kgf)h-----试样厚度(mm)hv----预计硬度值(kgf/mm(2)如果计算的试验力在二级试验力之间,那么应选用较小一级的试验力。
试验力选好后,转动变荷手柄,选择所需的试验力。
2、选择试台本硬度计带有多种试台,都可安装在坐标试台上,以适应各种形状试样的试验需要。
因此,当选选择好合适的试台后,先用汽油擦洗净表面油脂,然后用4支m5X10的圆柱头螺钉将其固定在试台上。
3、选择试验力保持时间试验力的保持时间对黑色金属一般为10-15秒,对有色金属为30±2秒。
4、物镜倍率选择当被测试验压痕为:≤0.2mm时,选用40X>0.2mm时,选用10X二、试验1、打开电源开关(30)照明灯。
2、依据试验前的准备所述,选择试验力、试台、物镜倍率,预制试验力保持时间。
3将试样放置于试台上,并应保证试面与主轴轴线垂直。
4将10倍物镜转至正前方,旋转升降手轮使物面离物镜下端面约8毫米,再满满的转动升降手轮并再目镜中观察,直至看清试样表面得加工痕迹。
如果从目镜中观察分划板上得刻线不清晰,可转动目镜,使之清晰为至。
操作者再使用过程中,可随时旋转亮度调节旋钮,选择舒适得视场照明亮度。
5将压头转至正前方,按下加载荷,硬度计随之完成施加-保持-卸除试验力得过程,压头自动回到初始位子。
6将已经选折好得物镜旋转到正前方,通过测微计进行压痕测量,由于压痕是被物镜放大后成像在分划板上,而分划板上相邻刻线间距为1毫米,百分同旋转一圈,视场中指标线移动1毫米,这样百分同一格为0.01毫米。
VB6VBA中跟踪⿏标移出窗体控件事件(类模块成员函数指针CHooker类应⽤)⼀、关于起因前⼏天发了⼀篇博⽂,是关于获取VB类模块成员函数指针的内容();今天我就发⼀下我的应⽤实例。
VB中默认是没有⿏标移出事件响应的,⽽这个事件其实在项⽬开发中,实⽤性很强,很多时候需要在⿏标移出窗体或控件时做些事情;没有这个事件会感觉很费⼒;今天我所说的实际案例就是,在窗体上,设计⼀个SplitterBar控件,窗体的最终⽤户使⽤这个控件可以在运⾏程序时任意调整其内部控件⼤⼩。
⼆、修改CHooker类我在第⼆篇参考博⽂作者开发的CHooker类上做了部分修改(对应以下代码中的中⽂注释部分代码),使该类能够跟踪⿏标移开事件,代码如下:1Option Explicit23Private Type TRACKMOUSEEVENTTYPE4 cbSize As Long5 dwFlags As Long6 hwndTrack As Long7 dwHoverTime As Long8End Type910Private Declare Sub CopyMemory Lib"kernel32"Alias"RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)11Private Declare Function SetWindowLong Lib"user32"Alias"SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long12Private Declare Function GetWindowLong Lib"user32"Alias"GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long13Private Declare Function IsWindow Lib"user32" (ByVal hWnd As Long) As Long14Private Declare Function CallWindowProc Lib"user32"Alias"CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long 15Private Declare Function TrackMouseEvent Lib"user32" (lpEventTrack As TRACKMOUSEEVENTTYPE) As Long1617Private Const GWL_WNDPROC = (-4)18Private Const WM_NCDESTROY = &H8219Private Const WM_MOUSEMOVE = &H20020Private Const TME_LEAVE = &H2&21Private Const WM_MOUSELEAVE = &H2A3&2223Public Event WindowProc(ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long, bCallNext As Boolean, lReturn As Long)2425Private m_hwnd As Long, m_NewProc As Long, m_OldProc As Long26Private m_TrackMouseLeave As Boolean'm_TrackMouseLeave设置在Hook时是否开启跟踪⿏标移开事件,是否正在跟踪移动事件27Private m_Tracking As Boolean'跟踪移开事件时,标识当前是否正在跟踪移动事件2829Private Sub Class_Initialize()30 m_NewProc = GetClassProcAddr(Me, 5, 4, True)31End Sub3233Private Sub Class_Terminate()34Call Unbind35End Sub3637Public Function Bind(ByVal hWnd As Long, Optional TrackMouseLeave As Boolean = False) As Boolean38Call Unbind39If IsWindow(hWnd) Then m_hwnd = hWnd40 m_OldProc = SetWindowLong(m_hwnd, GWL_WNDPROC, m_NewProc)41 Bind = CBool(m_OldProc)42 m_TrackMouseLeave = TrackMouseLeave '保存⽤户传递的跟踪⿏标移开事件设置43End Function4445Public Function Unbind() As Boolean46If m_OldProc <> 0Then Unbind = CBool(SetWindowLong(m_hwnd, GWL_WNDPROC, m_OldProc))47 m_OldProc = 048End Function4950Private Function WindowProcCallBack(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long51Dim bCallNext As Boolean, lReturn As Long52Dim tTrackML As TRACKMOUSEEVENTTYPE '⼀个移开事件结构声明5354 bCallNext = True5556RaiseEvent WindowProc(Msg, wParam, lParam, bCallNext, lReturn)57'当⽤户需要跟踪⿏标移开事件时58If m_TrackMouseLeave Then59'⿏标在其上移动,当前未标识为跟踪状态(第⼀次或者移开⿏标后重新移动回来时)60If Msg = WM_MOUSEMOVE And m_Tracking = False Then61 m_Tracking = True62'initialize structure63 tTrackML.cbSize = Len(tTrackML)64 tTrackML.hwndTrack = hWnd65 tTrackML.dwFlags = TME_LEAVE66'start the tracking67 TrackMouseEvent tTrackML68End If69'⿏标移开时,取消跟踪状态70If Msg = WM_MOUSELEAVE Then m_Tracking = False71End If7273If bCallNext Then74 WindowProcCallBack = CallWindowProc(m_OldProc, hWnd, Msg, wParam, lParam)75Else76 WindowProcCallBack = lReturn77End If78If hWnd = m_hwnd And Msg = WM_NCDESTROY Then Call Unbind79End Function8081Private Function GetClassProcAddr(obj As Object, ByVal Index As Long, _82Optional ByVal ParamCount As Long = 4, Optional ByVal HasReturnValue As Boolean) As Long83Static lReturn As Long, pReturn As Long84Static AsmCode(50) As Byte8586Dim i As Long, pThis As Long, pVtbl As Long, pFunc As Long8788 pThis = ObjPtr(obj)89 CopyMemory pVtbl, ByVal pThis, 490 CopyMemory pFunc, ByVal pVtbl + (6 + Index) * 4, 491 pReturn = VarPtr(lReturn)92For i = 0To UBound(AsmCode) '填充nop93 AsmCode(i) = &H9095 AsmCode(0) = &H55 'push ebp96 AsmCode(1) = &H8B: AsmCode(2) = &HEC 'mov ebp,esp97 AsmCode(3) = &H53 'push ebx98 AsmCode(4) = &H56 'push esi99 AsmCode(5) = &H57 'push edi100If HasReturnValue Then101 AsmCode(6) = &HB8 'mov offset lReturn102 CopyMemory AsmCode(7), pReturn, 4103 AsmCode(11) = &H50 'push eax104End If105For i = 0To ParamCount - 1'push dword ptr[ebp+xx]106 AsmCode(12 + i * 3) = &HFF107 AsmCode(13 + i * 3) = &H75108 AsmCode(14 + i * 3) = (ParamCount - i) * 4 + 4109Next110 i = i * 3 + 12111 AsmCode(i) = &HB9 'mov ecx,this112 CopyMemory AsmCode(i + 1), pThis, 4113 AsmCode(i + 5) = &H51 'push ecx114 AsmCode(i + 6) = &HE8 'call 相对地址115 CopyMemory AsmCode(i + 7), pFunc - VarPtr(AsmCode(i + 6)) - 5, 4116If HasReturnValue Then117 AsmCode(i + 11) = &HB8 'mov eax,offset lReturn118 CopyMemory AsmCode(i + 12), pReturn, 4119 AsmCode(i + 16) = &H8B 'mov eax,dword ptr[eax]120 AsmCode(i + 17) = &H0121End If122 AsmCode(i + 18) = &H5F 'pop edi123 AsmCode(i + 19) = &H5E 'pop esi124 AsmCode(i + 20) = &H5B 'pop ebx125 AsmCode(i + 21) = &H8B: AsmCode(i + 22) = &HE5 'mov esp,ebp126 AsmCode(i + 23) = &H5D 'pop ebp127 AsmCode(i + 24) = &HC3 'ret128 GetClassProcAddr = VarPtr(AsmCode(0))129End Function三、CHooker类的使⽤那么如何使⽤这个新构建的类,来实现我们的需求了?⾸先创建⼀个窗体,放置三个PictureBox,其中⼀个做为SplitterBar(name属性picture4),其余2个图⽚框的宽度将会由SplitterBar在运⾏时调整。
A.sumA()⽤循环⽅式求从1到N之和,sumB()⽤递归⽅式求从B.默认情况下,如果输⼊正整数1000,能实现求从1到1000C.默认情况下,如果输⼊正整数100000,能实现求从1到100000D.⼀般说来,sumA()的效率⾼于sumB()。
第 5 题下⾯C++代码以递归⽅式实现字符串反序,横线处应填上代码是(A.sIn[sIn.length() - 1] + sReverse(sIn.substr(0, sIn.length() - 1));B.sIn[0] + sReverse(sIn.substr(1, sIn.length() - 1));C.sReverse(sIn.substr(0, sIn.length() - 1)) + sIn[sIn.length() - 1];D.sReverse(sIn.substr(1, sIn.length() - 1)) + sIn[sIn.length() - 1];A.Hanoi(B, C, A, N - 2)B.Hanoi(B, A, C, N - 1)C.Hanoi(A, B, C, N - 2)D.Hanoi(C, B, A, N - 1)第 7 题根据下⾯C++代码的注释,两个横线处应分别填⼊()。
pare和isOdd(lstA[i])pare(x1,y1)和isOddpare和isOddpare(x1,y1)和isOdd(lstA[i])第 8 题有关下⾯代码正确的是()。
A.checkNum()函数定义错误。
B.将isEven作为checkNum()参数将导致错误。
C.执⾏后将输出1。
D.运⾏时触发异常。
第 9 题有关下⾯C++代码正确的是()。
A.checkNum()函数定义错误。
B.输出⾏A的语句将导致编译错误。
C.输出⾏B的语句将导致编译错误。
D.该代码没有编译错误。
第 10 题下⾯代码执⾏后的输出是()。
A.4#3#2#2#4B.4#3#2#2#1#5C.4#3#2#1#2#4D.4#3#2#1#2#5第 11 题下⾯代码中的isPrimeA()和isPrimeB()都⽤于判断参数N是否素数,有关其时间复杂度的正确说法是()。
第1章Java语言概述选择题1-1 在下列概念中,Java语言只保留了(B)A. 运算符重载B. 方法重载C. 指针D. 结构和联合1-2 下列关于Java语言特性的描述中,错误的是(D)A. 支持多线程操作B. Java程序与平台无关C. Java和程序可以直接访问Internet上的对象D. 支持单继承和多继承1-3 下列关于Java Application程序在结构上的特点的中,错误的是(C)A. Java程序是由一个或多个类组成的B. 组成Java程序的若干个类可以放在一个文件中,也可以放在多个文件中C. Java程序的文件名要与某个类名相同D. 组成Java程序的多个类中,有且仅有一个主类1-4 Java程序经过编译后生成的文件的后缀是(C)A. .objB. .exeC. .classD. .java1-5 下列关于运行字节码文件的命令行参数的描述中,正确的是(A)A. 第一个命令行参数(紧跟命令字的参数)被存放在args[0]中B. 第一个命令行参数被存放在args[1]中C. 命令行的命令字被存放在args[0]中D.数组args[]的大小与命令行参数的个数无关判断题1-1JavaC++的语言之前问世的。
(错)1-2Java语言具有较好的安全性和可移植性及与平台无关等特性。
(对)1-3Java语言中取消了联合的概念,保留了结构概念。
(错)1-4Java语言中数据类型占内在字节数与平台无关。
(对)1-5Java语言中可用下标和指针两种方式表示数组元素。
(错)1-6Java语言的源程序不是编译型的,而是编译解释型的。
(对)1-7操作系统中进程和线程两个概念是没有区别的。
(错)1-8Java语言既是面向对象的又是面向网络的高级语言。
(对)1-9Java程序分为两大类:一类是Application程序,另一类是Applet程序。
前者又称Java应用程序,后者又称为Java小应用程序。
(对)1-10Java Application程序是由多个文件组成的,其中可以有也可以没有主文件。
指针参考程序编程题:1.编写程序,用指针实现读入一行数列,求数列的和,平均值,最大值、最小值,并且打印它们。
#include "stdio.h"#include "limits.h"void main(){int array[80], *p;i nt n, i, sum=0, max=INT_MIN, min=INT_MAX;/*符号常量INT_MIN和INT_MAX分别表示int型的最小值和最大值,在limits.h中定义*/p rintf("请确定要输入的整数个数n ");s canf("%d",&n);p rintf("请输入%d个整数", n);p=array;f or(i=0; i<n; i++){scanf("%d",p);if(*p>max)max= *p;if(*p<min)min= *p;sum=sum + *p;p++;}p rintf("输入的%d个整数为", n); /*输出所有整数*/p=array;for(i=0; i<n; i++)printf("%d ",*p++);p utchar('\n');p rintf("以上整数的累加和为%d\n", sum);p rintf("以上整数的平均值为%.2f\n", (float)sum/n);p rintf("以上整数的最大值为%d\n", max);p rintf("以上整数的最小值为%d\n", min);}2. 编写字符串插入函数char *strins(char *s1, char *s2),将字符串s2的内容插入到字符串s1之前,参数s1, s2为指向字符串的指针。
函数执行后,返回值为结果字符串的首地址(即s1),参数s1为结果字符串中原来子串s1的首地址,参数s2不变。
例如:s1=”world”, s2=”hello”, 结果字符串为”helloworld”,s1指向字符‘h’。
在main函数中输入两个字符串,调用该函数完成字符串的插入,并输出结果。
#include "stdio.h"char *strins(char *s1, char *s2){int len1=0, len2=0;char *p1, *p2;p1=s1;while(*p1++) //计算s1的长度len1++;p2=s2;while(*p2++) //计算s2的长度len2++;//把s1中的每个字符顺次向后移动len2个位置,包括结束符'\0'p1=s1+len1; //指向s1的结束符'\0'do {*(p1+len2)= *p1;} while(p1--!=s1); /*至少要移动一次,因此用do~while循环*///把s2拷贝插入到s1的前面p1=s1;p2=s2;while(*p2)*p1++=*p2++;return s1;}void main(){char str1[80],str2[80], *p;printf("input first string:");gets(str1);printf("input second string:");gets(str2);printf("原来的字串s1:");puts(str1);p=strins(str1,str2);printf("插入后的字符串:");puts(str1);/*这里puts(str1)和puts(p)的输出结果一样,因为p指针实际上就是指向str1的第一个元素*/ puts(p);}3.编写字符串函数char *substr(char *str1, char *str2),判断字符串str2是否为str1的子串,如果是,则返回str1中首次出现子串str2的起始位置,否则,返回NULL值。
例如:str1=”I am a student”,str2=”stu”,函数执行后,返回值指向字符‘s’,参数s1, s2不变。
在main函数中输入两个字符串,调用该函数判断第二个字符串是否为第一个字符串的子串,并输出结果。
#include <stdio.h>char *substr(char *str1, char *str2);void main(){char s1[80], s2[20], *p;printf("input string1:\n");gets(s1);printf("input string2:\n");gets(s2); /*s2为要验证的字串*/p=substr(s1, s2);if (p!=NULL){printf("\n第二个字符串是第一个字符串的子串!\n");printf("p指针指向字符%c!\n", *p);}elseprintf("\n第二个字符串不是第一个字符串的子串,p为空指针!\n");}char *substr(char *str1, char *str2){char *p, *q, *s;for(s=str1; *s !='\0' ; s++){if (*s == *str2) /*str1中是否有和str2首字符相同的字符*/{for(p=s, q=str2; *p && *q ; p++, q++) /*判断接下去的几个字符是否相同*/{if (*p != *q) /*不相同*/break;}if (*q=='\0') /*所有字符都相同*/return s; /*是子串, 返回指向第一个字符的指针*/}}return NULL; /*没有匹配的字符串,返回空指针*/}4. 编写字符串函数int lenstr(char *str),求字符串str的长度。
在main函数中输入一个字符串,调用该函数计算字符串的长度,并输出结果。
#include <stdio.h>int lenstr(char *str);void main(){char s[80];printf("请输入一个字符串以回车结束:\n");gets(s);printf("该字符串的长度为%d\n", lenstr(s));}int lenstr(char *str){char *p;int len=0;for(p=str; *p ; p++)len++;return len;}5. 编写字符串函数char * cutstr(char *str, int n),将字符串str中前面的n个字符删除,后续字符前移。
函数执行后,参数str,n不变,如果成功,返回值为str首地址,如果未成功,返回值为NULL。
例如:str=”I am a student”,n=2,函数执行后str=”am a student”。
在main函数中输入一个字符串和一个正整数n,调用该函数将字符串前面的n个字符删除,后续字符前移,并输出结果。
#include <stdio.h>#include "string.h"char * cutstr(char *str, unsigned int n);void main(){char s[80], *p;unsigned int n;printf("请输入一个字符串以回车结束:\n");gets(s);printf("请输入要删除前面的字符个数: ");scanf("%d", &n);p=cutstr(s,n);printf("删除前面%d个字符后字符串为:%s\n", n, p); //这里p用s替代结果一样}char * cutstr(char *str, unsigned int n){char *p;if( strlen(str) < n ) /*要删除的字符数大于字符串中实际字符个数*/*str='\0';else{for(p=str+n; *p; p++) /*后续字符前移*/*(p-n)=*p;*(p-n)='\0'; /*串结束标志*/}return str;}6.编写一个排序函数sort,将数组按照从大到小的顺序排序,其中有两个形式参数,一个为指向数组的指针p,另一个为数组的元素个数n。
在main函数中输入10个整数存入数组data[10]中,调用该函数对data进行排序,并输出最后的排序结果。
#include "stdio.h"void sort(int *a, int n) //无返回值,在原数组上排序{int i, j, temp;for(i=0;i<n-1;i++) /*冒泡排序*/for(j=0;j<n-i-1;j++)if(*(a+j)<*(a+j+1)){temp = *(a+j);*(a+j) = *(a+j+1);*(a+j+1) = temp;}}void main(void){int data[10];int i;printf("请输入10个整数:\n");for(i=0;i<10;i++)scanf("%d",&data[i]);sort(data, 10);printf("降序排序后的数组为:\n");for(i=0;i<10;i++)printf("%d ", data[i]);printf("\n");}选做题:编写程序,用指针实现读入字符串s,字符串s1,字符串s2,如果s1是字符串s的子串,则用s2替换s中的s1,并且打印结果字符串。
例如s=”abcde123fghijk123mn45”, s1=”123”, s2=”88”, 程序执行后s=”abcde88fghijk88mn45”#include <stdio.h>#include <string.h>//利用前面设计的函数//char *strins(char *s1, char *s2) 将字符串s2的内容插入到字符串s1之前//char * cutstr(char *str, int n),将字符串str中前面的n个字符删除,后续字符前移//以及c库函数 char *strstr(char *s1, char *s2) 从字符串s1中寻找子串s2第一次出现的位置,返回指向第一次出现s2的指针,如果没找到返回NULLchar *strins(char *s1, char *s2){int len1=0, len2=0;char *p1, *p2;p1=s1;while(*p1++) //计算s1的长度len1++;p2=s2;while(*p2++) //计算s2的长度len2++;//把s1中的每个字符顺次向后移动len2个位置,包括结束符'\0'p1=s1+len1; //指向s1的结束符'\0'do {*(p1+len2)= *p1;} while(p1--!=s1); /*至少要移动一次,因此用do~while循环*///把s2拷贝插入到s1的前面p1=s1;p2=s2;while(*p2)*p1++=*p2++;return s1;}char * cutstr(char *str, unsigned int n){char *p;if( strlen(str) < n ) /*要删除的字符数大于字符串中实际字符个数*/ *str='\0';else{for(p=str+n; *p; p++) /*后续字符前移*/*(p-n)=*p;*(p-n)='\0'; /*串结束标志*/}return str;}void main(){char s1[80], s2[20], s3[20], *p, *q;unsigned int len2, len3;puts("请输入字符串s1以回车结束: ");gets(s1);puts("请输入字符串s2以回车结束: ");gets(s2);puts("请输入字符串s3以回车结束: ");gets(s3);len2=strlen(s2);len3=strlen(s3);q=s1;do{p=strstr(q,s2); //在q指向的字符串中查找s2第一次出现的位置if(p!=NULL) //s2是q的子串,此时p指向该子串第一次出现的位置{//用s3替换s2cutstr(p, len2); //删除p指针开始的子串s2strins(p, s3) ; //将s3插入p指针指定的位置}q = p + len3; //继续查找}while(p!=NULL); //直到q指向的串中没有能够匹配的子串printf("用字符串s3替换掉子串s2后新的s1串为\n");puts(s1);}。