加载中…
  
博文
标签:

c语言

解析

试题

分类: 期末考试与省二级C语言试卷

2013秋第3题解析,字符串比较

3、阅读下列程序说明和程序,在每小题提供的若干可选答案中,挑选一个正确答案

【程序说明】

输入2个字符串,比较它们是否相等。要求定义和调用函数cmps, t),该函数比较字符串st是否相等,若相等则返回1,否则返回0

运行示例:

Enter 2 srings: Hello  world

”Hello” != ”world”

【程序】

#include

int  cmp(char *s, char *t)

{   int  i ;

for( i=0;   (9)   ; i++ )

if(     (10)     ) break ;

if(     (11)      ) return  1 ;

else  return  0;

}

main()

{   char  s[80], t[80];

printf(”Enter 2 strings:”);

scanf(”%s%s”, s, t);

if(     (12)      )

printf(”\”%s\” = \”%s\”\n”, s, t);

else

printf(”\”%s\” != \”%s\”\n”, s, t);

}

【供选择的答案】

(9) As[i] == ’\0’                   Bs[i] = ’\0’

Cs[i] != ’\0’                    D!s[i]

(10)As[i] == t[i]                   Bt[i] == ’\0’

Cs[i] != t[i]                  Ds[i] == ’\0’

(11) As[i] != t[i]                     Bs[i] == t[i]

Cs[i] != ’\0’                  Dt[i] != ’\0’

(12)Acmp(s, t) != 0                    Bcmp(s, t) == 0

Ccmp(char *s, char *t)              Dcmp(*s, *t) != 0

解析:

从题干可以推测出以下几点:

第一点:主函数里面应该有调用子函数的语句,故第12空就是调用子函数的语句,两字符串相等,则返回值1。故选Acmp(s, t) != 0

第二点:第9空应该是对字符串进行循环的条件,s[i] != ‘\0’ ,故第9空选C

第三点:两字符串相等,则返回值1。则推测s[i] == t[i],故第11空选B

第四点:如果发现两字符串里面有一个不相等的字符,那么直接终止循环,因为已经没有必要继续循环下去了。故第10空选Cs[i] != t[i]

阅读    收藏 
标签:

时间

复杂度

实例

教育

分类: 数据结构及算法

时间复杂度计算实例

表示时间复杂度的阶有:

O(1) :常量时间阶          O (n):线性时间阶

O(㏒n) :对数时间阶    O(n㏒n) :线性对数时间阶

O (nk)k≥2k次方时间阶

例1  两个n阶方阵的乘法

              for(i=1i<=n; ++i)

                  for(j=1; j<=n; ++j)

                     {   c[i][j]=0 ;

                          for(k=1; k<=n; ++k)

                         c[i][j]+=a[i][k]*b[k][j] ; 

}

由于是一个三重循环,每个循环从1n,则总次数为: n×n×n=n3 时间复杂度为T(n)=O(n3)【立方阶】

例2  {++x; s=0 ;}

x自增看成是基本操作,则语句频度为1,即时间复杂度为O(1)【常量阶】

如果将s=0也看成是基本操作,则语句频度为2,其时间复杂度仍为O(1),即常量阶。

例3   for(i=1; i<=n; ++i)

               { ++x; s+=x ; } 

语句频度为:2n,其时间复杂度为:O(n) ,即为【线性阶】

例4   for(i=1; i<=n; ++i)

    for(j=1; j<=n; ++j)

                   { ++x; s+=x ; }

   语句频度为:n*n*2=2n2 ,其时间复杂度为:O(n2) ,即为【平方阶】

定理:若A(n)=amnm +am-1nm-1+…+a1n+a0是一个m次多项式,则A(n)=O(nm)

例5   for(i=2;i<=n;++i)

              for(j=2;j<=i-1;++j)

                    {++x; a[i,j]=x; }

语句频度为:   1+2+3+…+n-2=(1+n-2) ×(n-2)/2

=(n-1)(n-2)/2 =n2-3n+2

 ∴时间复杂度为O(n2),即此算法的时间复杂度为【平方阶】

一个算法时间为O(1)的算法,它的基本运算执行的次数是固定的。因此,总的时间由一个常数(即零次多项式)来限界。而一个时间为O(n2)的算法则由一个二次多项式来限界。

以下六种计算算法时间的多项式是最常用的。其关系为:

     O(1) < O(&#13266;n) < O(n) < O(n&#13266;n) < O(n2) < O(n3)

  指数时间的关系为:

    O(2n) < O(n!) < O(nn)

n取得很大时,指数时间算法和多项式时间算法在所需时间上非常悬殊。

1:素数的判断算法。

void prime( int n)

 

{  

int i=2 ;

while ( (n%i)!=0 && i*1.0< sqrt(n) )  

     i++ ;

if (i*1.0>sqrt(n) )

      printf(“&d 是一个素数\n” , n) ;

else

      printf(“&d 不是一个素数\n” , n) ;

}

嵌套的最深层语句是i++;其频度由条件( (n% i)!=0 && i*1.0< sqrt(n) ) 决定,显然i*1.0< sqrt(n) ,时间复杂度O(n1/2)

或者说是O(sqrt(n))

 

2:冒泡排序法。

Void bubble_sort(int a[]int n)

{  

change=false;

for (i=n-1; change=TURE; i>1 && change; --i)

for (j=0; j<i; ++j)

if (a[j]>a[j+1])

    {     a[j] ←→a[j+1] ;   change=TURE ; }

}

最好情况:0

最坏情况:1+2+3+&#8943;+n-1=n(n-1)/2

平均时间复杂度为: O(n2 【平方阶】                  

 

阅读    收藏 
标签:

抽象数据类型

教育

分类: 数据结构及算法

抽象数据类型的表示与实现

抽象数据类型(Abstract Data Type 简称ADT)是指一个数学模型以及定义在此数学模型上的一组操作。

抽象数据类型需要通过固有数据类型(高级编程语言中已实现的数据类型)来实现。抽象数据类型是与表示无关的数据类型,是一个数据模型及定义在该模型上的一组运算。

对一个抽象数据类型进行定义时,必须给出它的名字及各运算的运算符名,即函数名,并且规定这些函数的参数性质。一旦定义了一个抽象数据类型及具体实现,程序设计中就可以像使用基本数据类型那样,十分方便地使用抽象数据类型。

抽象数据类型的描述包括给出抽象数据类型的名称数据的集合、数据之间的关系和操作的集合等方面的描述。

【通俗的说:就是名字、数据集合、关系和操作的集合】

抽象数据类型描述的一般形式如下:

ADT 抽象数据类型名称 {

数据对象:

……

数据关系:

……

操作集合:

操作名1

……

……

操作名n

}ADT抽象数据类型名称

 

总结:

抽象数据类型定义(ADT

作用:抽象数据类型可以使我们更容易描述现实世界。例:用线性表描述学生成绩表,用树或图描述遗传关系。

定义:一个数学模型以及定义在该模型上的一组操作

关键:使用它的人可以只关心它的逻辑特征,不需要了解它的存储方式。定义它的人同样不必要关心它如何存储。

例:线性表这样的抽象数据类型,其数学模型是:数据元素的集合,该集合内的元素有这样的关系:除第一个和最后一个外,每个元素有唯一的前趋和唯一的后继。可以有这样一些操作:插入一个元素、删除一个元素等。

 

 

 

 

 

阅读    收藏 
标签:

复杂度

时间

算法

效率

教育

分类: 数据结构及算法

时间复杂度的分类和理解

3.分类

按数量级递增排列,常见的时间复杂度有:

常数阶O(1), 注意:1仅仅表示常数的意思;

对数阶O(log2n),

线性阶O(n),

线性对数阶O(nlog2n),

平方阶O(n2)

立方阶O(n3),...

k次方阶O(nk),

指数阶O(2n)

随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低。

4.关于对其的理解

《数据结构(C语言版)》------严蔚敏 吴伟民编著 15页有句话"整个算法的执行时间与基本操作重复执行的次数成正比。"

基本操作重复执行的次数是问题规模n的某个函数f(n),于是算法的时间量度可以记为:T(n) = O( f(n) )

如果按照这么推断,T(n)应该表示的是算法的时间量度,也就是算法执行的时间。

而该页对语句频度也有定义:指的是该语句重复执行的次数。

如果是基本操作所在语句重复执行的次数,那么就该是f(n)

上边的n都表示的问题规模。

 

阅读    收藏 
标签:

windows

程序

设计

教育

分类: MFC程序设计

1课 用C语言函数编写对话框之一直接实践

【参考资料:孙鑫VC++教学视频】

 

学习理论总是有点枯燥,而且也需要耐心,慢慢的去理解;那我们就直接实践,动手完成一个用C语言系统函数(API函数)实现的对话框;

 

一、实现步骤,总共5个步骤;

&#9733;&#9733;&#9733;&#9733;&#9733;创建一个完整的窗口需要经过下面四个操作步骤:

1)、设计一个窗口类(其实是一个结构体);如:WNDCLASS wndcls;

     就是为这个结构体的各个分量赋值,设计一个窗口;

2)、注册窗口类; 如:RegisterClass(&wndcls);

3)、创建窗口; 如:CreateWindow(),CreateWindowEX();

4)、显示及更新窗口。如:ShowWindow(),UpdateWindow();

5)、消息循环GetMessage从消息队列中获得消息;

 

二、编程实现

1、建立空工程:win32 Application工程;

2、建立源文件:C++Source文件,不是头文件;

3、加头文件:windows.h, stdio.h;

4、定义主函数:WinMain函数,从msdn中拷贝函数头部;

具体做法:msdn索引中搜索WinMain,出现多个主题,选择Windows User InterfacePlatform SDK;不要选择Windows CE API Reference;

拷贝并修改为:

int WINAPI WinMain(

  HINSTANCE hInstance,      // handle to current instance

  HINSTANCE hPrevInstance,  // handle to previous instance

  LPSTR lpCmdLine,          // command line

  int nCmdShow              // show state

)

{

      。。。。。。。。

}

5、主函数的参数暂且不表,后面有时间再补充;

现在我们准备实现主函数体:

     //第一步:设计窗口;WndClass,实际上是一个结构体;

       WNDCLASS wndcls;

       wndcls.cbClsExtra=0;

       wndcls.cbWndExtra=0;

       wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);

       wndcls.hCursor=LoadCursor(NULL, IDC_CROSS);

       wndcls.hIcon=LoadIcon(NULL, IDI_ERROR);

       wndcls.hInstance=hInstance;

       wndcls.lpfnWndProc=WinSunProc;

       wndcls.lpszClassName="Weixin2003";

       wndcls.lpszMenuName=NULL;

       wndcls.style=CS_HREDRAW | CS_VREDRAW;

 

       //第二步:注册窗口;

       RegisterClass(&wndcls);

 

       //第三步:创建窗口;

       HWND hwnd;

       hwnd=CreateWindow("Weixin2003","北京维新科学技术培训中心",WS_OVERLAPPEDWINDOW,0,0,600,400,NULL,NULL,hInstance,NULL);

 

       //第四步:显示窗口

       ShowWindow(hwnd, SW_SHOWNORMAL);

       UpdateWindow(hwnd);

 

       //第五步:创建消息循环

       MSG msg;

       While(GetMessage(&msg, NULL, 0, 0))

       {

              TranslateMessage(&msg);

              DispatchMessage(&msg);

       }

 

6、主函数里面已经完成,接下来我们要创建窗口过程函数;

&#9733;用switch来处理各种消息;

switch(uMsg)

       {

       case WM_CHAR:

              char szChar[20];

              sprintf(szChar, "char is %d", wParam);

              MessageBox(hwnd, szChar,"weixin",0);

              break;

       case WM_LBUTTONDOWN:

              MessageBox(hwnd,"mouse clicked", "weixin", 0);

              HDC hdc;

              hdc=GetDC(hwnd);

              TextOut(hdc, 0, 50, "计算机编程语言培训", strlen("计算机编程语言培训"));

              ReleaseDC(hwnd, hdc);

              break;

       case WM_PAINT :

              HDC hDC;

              PAINTSTRUCT ps;

              hDC=BeginPaint(hwnd, &ps);

              TextOut(hDC, 0, 0, "维新培训", strlen("维新培训"));

              EndPaint(hwnd, &ps);

              break;

       case WM_CLOSE:

              if(IDYES==MessageBox(hwnd, "是否真的结束", "weixin", MB_YESNO))

              {

                     DestroyWindow(hwnd);

              }

              break;

       case WM_DESTROY:

              PostQuitMessage(0);

              break;

       default:

              return DefWindowProc(hwnd, uMsg, wParam,lParam );

             

       }

 

可以运行看效果,第一课最感性的直接实践就结束了,当然,对里面有些代码还会存在一些疑问,接下去会慢慢分析【待续】。

阅读    收藏 
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有