计算机基础知识.docx

上传人:b****3 文档编号:3547366 上传时间:2022-11-23 格式:DOCX 页数:184 大小:1.43MB
下载 相关 举报
计算机基础知识.docx_第1页
第1页 / 共184页
计算机基础知识.docx_第2页
第2页 / 共184页
计算机基础知识.docx_第3页
第3页 / 共184页
计算机基础知识.docx_第4页
第4页 / 共184页
计算机基础知识.docx_第5页
第5页 / 共184页
点击查看更多>>
下载资源
资源描述

计算机基础知识.docx

《计算机基础知识.docx》由会员分享,可在线阅读,更多相关《计算机基础知识.docx(184页珍藏版)》请在冰豆网上搜索。

计算机基础知识.docx

计算机基础知识

C语言基础:

一、数值类型

1.各种进制之间的转换:

(二进制,八进制,十进制,十六进制)

1)对于应用程序,数据参与计算的都是以十进制执行的,故数据类型定义的都是十进制的;

2)对于底层都是以二进制(因为十六进制易于读取,两者易于转换)呈现的;

3)对于二进制、八进制、十六进制,其没有对应的数据类型来展现,故只能以字符的形式保存。

2.各种定义数值的处理:

(质数,素数,奇数,偶数,丑数等等)

1)质素(素数)

1>题型1:

打印1-N内所有质数

/*1.判别该数是否为质数*/

boolisPrime(intn)

{

if(n==2||n==3)

{

returntrue;

}

for(inti=2;i<=n/2;i++)

{

if(n%i==0)

{

returnfalse;

}

}

returntrue;

}

/*2.循环遍历每一个小于N的数*/

vectorarr;

for(inti=2;i

{

if(isPrime(i))

{

arr.push_back(i);

}

}

2>题型2:

打印N的质素

vectorarr;

for(inti=2;i

{

if(n%i==0)

{

arr.push_back(i);

n=n/i;

}

else

{

i++;

}

}

2)奇偶数

3)丑数

4)求前N个数的和的时间复杂度为o(n)方法

注:

采用的方式是直接替换头和尾,如果采用双层循环,时间复杂度就为o(n2)

for(intj=0;j

        

      num+=arr[j];      

    }

    if(num<=t){

        

        count++;

    }

    for(intk=c;k

        

num-=arr[k-c];

      num+=arr[k];

      if(num<=t){

        

        count++;

      }

    }

3.结构体定义的使用

1)structnode

{

intnum;

structnode*next;

};

此时定义node结构体变量时,必须写成structnode*nod;

2)typedefstructnode

{

intnum;

structnode*next;

}node;

此时定义node结构体变量时,可以写成node*nod;

同时必须注意后面必须加上冒号,这是一个语句。

二、字符串处理

1.字符串的定义:

1)charstr1[]="HelloWorld"; //通过字符数组来定义字符串"HelloWorld",其实包含两个存储空间:

1.首先是在栈去分配了一段存储空间,用来存储字符串;2.同时此常量字符串存储在静态数据区。

2)char*str2 ="HelloWorld"; //通过字符指针来定义字符串"HelloWorld",其也包含两个存储空间:

1.首先是在栈上为指针分配存储空间,用来存放指针变量;2.同时常量字符串存储在静态数据区。

 3)#definestr3"HelloWorld"; //通过宏定义来定义字符串"HelloWorld",等价于str3="HelloWorld"

2.字符串的输入:

1)常规字串输入:

1>采用scanf()函数实现输入操作:

必须要取地址,将字符串存入地址中;其不能识别空格,tab等按键。

2)带空格的字串输入

 1>采用gets()函数实现输入操作:

可以识别空格和tab等按键;其变量只要是地址名字即可,不要写成取地址的方式;

 2>由于scanf()输入字符串时默认空格作为结束符,故要输入带有空格的字符串时,采用以下格式:

scanf("%[^\n]",str)。

3.字符串的输出:

1)常规字串输出

1>printf("%s",a[i]); 它的输出是从a中第i号字符开始输出,直到字符串结束符'\0'输出结束。

2)固定长度字串输出:

须知字串长度,采用循环输出

3)带空格字串输出:

须知字串长度,采用循环输出

4.字符串作为参数传递:

 1)传递的是地址,数组也是一样,传递的是地址;

 2)对于结构体变量而言,要操作结构内部变量,必须根据地址来操作;

 3)操作数的位数最大为64位,故要实现结构体的单位操作,必须重新编写操作函数。

 

5.字符串函数的使用:

字符串函数大全见:

附录1:

字符串函数大全

1)将字符串转换成数值;

1>实现方式一

doubleatoi(intn,char*str)

{

intlen=n;

doublenum=0; //定义变量时,一定要初始化

for(inti=0;i

{

num+=(str[i]-'0')*pow(10.0,--len); //pow()函数返回的是double型,故num必须定义为double型,或者对pow()函数进行强制类型转换

}

returnnum;

}

2>实现方式二

doubleatoi(intn,char*str)

{

intlen=n;

doublenum=0; //定义变量时,一定要初始化

for(inti=0;i

{

num=num*10+str[i]-'0';

}

returnnum;

}

问题:

1.为什么要减去'0'?

曰:

计算器存储运算时,均采用的是二进制表示,故对于所有的字母和常用符号,必须约定自己的一套编码规则,于是ASCII码应运而生。

而特别是对于数字,ASCII和整型之间相差的数值是48,即一个'0'字符。

而对于ASCII和数值其显示结果是没有任何区别的,即对于显示,其采用的二进制数值是一样的,而两者的不同,主要在于应用运算上的不同,此时的值也是不同的。

2.当数值超过double的范围时,即大数怎么处理?

曰:

此时只能做简单的显示,如果是要做运算,必须采用字符的形式来重新进行运算法则的编写。

2)将数值转换成字符串

1>实现方式一

char*itoa(intm,char*a)

{

inti;

while(m>0)

{

a[i++]=m%10+'0';

m/=10;

}

returna;

}

2>实现方式二

char*itoa(intm,char*a)

{

charb[11]="0123456789";

inti=0;

scanf("%d",&m);

while(m>0)

{

a[i++]=b[m%10];

m/=10;

}

returna;

}

6.字符串数组的操作

1>在C++中string可以直接当做变量来处理;

2>可以通过newstring[n]来申请器长度;

3>对于string字符串的传递可以跟变量的传递一样操作;

4>具体实现如下:

intstringPrint(intnum,conststringstr[])

{

for(inti=0;i

{

cout<

}

return0;

}

intmian(void)

{

intnum;

string*p;

cin>>num;

p=newstring[num];

for(inti=0;i

{

cin>>p[i];

}

stringPrint(num,p);

delete[]p; //对于申请的连续地址空间释放时一定要注意

return0;

}

三、数据结构

1.数组

1)数组定义:

数组定义时,必须指定大小,从而编译器为其分配固定大小的内存空间,内存连续分配;

2)数组初始化:

最好为其初始化,如果没有初始化,其会保存垃圾数据;

3)数组的输入:

数组实现数据输入时,一般采用循环输入;

4)数组的输出:

输出一般也采用循环输出;

5)数组作为参数传递:

1>数组做参数,无法按值传递。

这是由C/C++函数的实现机制决定的。

2>传数组给一个函数,数组类型自动转换为指针类型,因而传的实际是地址,因此对其进行操作时,可以对数组值进行修改。

所以为了避免数组值的修改,应该使用const固定。

下面三种函数声明完全等同:

voidfunc(constintarray[10])

voidfunc(constintarray[])

voidfunc(constint*array)

2.链表

1)定义:

一种物理存储单元上非连续、非顺序的存储结构。

 2)优势:

1>不定长,可以根据数据存储需要,不断添加和删除;

2>存储空间不用连续。

3)链表的一般操作:

1)链表的创建:

a.创建一个新节点node

nod=(node*)malloc(sizeof(node));

nod->val=val;

nod->next=NULL;

/*判断内存分配是否为空*/

if(nod==NULL)

{

return0;

}

b.头指针head,用于对单向链表的遍历,该地址指向链表的头部

if(head=NULL)

{

head=nod;

}

c.位置指针p,保存指针位置

else

{

p->next=nod;

}

p=nod;

2)链表的插入:

a.对于单向链表,先从头开始遍历,找到要操作节点的前一个节点

node*listInsert(node*head,intk)

{

inti=2;

node*p=NULL;

node*nod=NULL;

p=head;

nod=(node*)malloc(sizeof(node));

nod->val=val;

nod->next=NULL;

/*输入查询节点数必须大于0*/

if(k<1)

{

returnNULL;

}

/*当输入为1时,查询的是头节点*/

if(k==1)

{

nod->next=p;

head=nod;

returnhead;

}

while(p!

=NULL&i

{

p=p->next;

i++;

}

nod->next=p->next;

p-next=nod;

returnhead;

}

3)链表的删除:

node*listDelete(node*head,intk)

{

inti=2;

node*p=NULL;

node*q=NULL;

p=head;

/*输入查询节点数必须大于0*/

if(k<1)

{

returnNULL;

}

/*当输入为1时,查询的是头节点*/

if(k==1)

{

head=nod->next;

free(p);

returnhead;

}

/*开始查询要删除的节点的前一个节点*/

while(p!

=NULL&i

{

p=p->next;

i++;

}

q=p->next;

p->next=q->next;

free(q);

returnhead;

}

4)链表的打印:

intlistPrint(node*head)

{

while(head!

=NULL)

{

printf("%x--%d",head,head->val);

head=head->next;

}

return0;

}

5)链表的逆序打印

1>递归实现

intprintList1(Node*head)

{

if(head!

=NULL)

{

if(head->next!

=NULL)

{

printList1(head->next);

}

}

cout<val<<"--0x"<

return0;

}

2>堆栈实现

intprintList2(Node*head)

{

stackst;

while(head!

=NULL)

{

st.push(head);

head=head->next;

}

while(!

st.empty())

{

cout<val<<"--0x"<

st.pop();

}

return0;

}

6)链表的逆序实现

Node*ReverseLink(Node*head)

{

  Node*prev=NULL;

Node*next;

while(head!

=NULL)

next=head->next;

head->next=prev;

prev=head;

head=next;

}

  returnprev;

}

4.要及时释放内存空间,malloc()和free()两个函数要配合使用。

3.栈

1)定义:

先进后出,限定只能在表的一端进行插入和删除操作的线性表;

2)线性表分类:

 1>顺序线性表(也就是用数组实现的,在内存中顺序排列,通过改变数组序号来实现压栈和出栈)

  a.定义一个结构体,保存栈的基本信息

  typedefstructsqStack

  {

  intsize;

  int*sp;

  int*top;

  }sqStack;

  b.栈初始化,定义栈的大小和指针

  intstackInit(sqStacks)

  {

  s->top=(int*)malloc(sizeof(int)*n);

  s->sp=s->top;

  }

  c.压栈

  intpush(sqStack*s,intval)

  {

  s->val=val;

  s->sp++;

  return0;

  }

  d.出栈

  intpop(sqStack*s)

  {

  intval=0;

  s->sp--;

  val=s->val;

  returnval;

  }

  

 2>链表(主要是对链表表头进行操作)

  a.定义一个结构体,作为栈的节点

  typedefstructsqStack

  {

  intval;

  structsqStack*next;

  }sqStack;

  b.栈初始化

  sqStack*stackInit()

  {

  sqStack*s;

  returns;

  }

  c.压栈

  sqStack*push(sqStack*s,intval)

  {

  sqStack*nod=NULL;

  nod=(sqStack*)malloc(sizeof(sqStack));

  if(nod==NULL)

  {

  returnNULL;

  }

  nod->val=val;

  nod->next=s;

  s=nod;

  returns;

  }

  d.出栈

  sqStack*pop(sqStack*s)

  {

  sqStack*nod=NULL;

  intval=0;

  

  val=s->val;

  nod=s;

  s=s->next;

  free(nod);

  returnval;

  }

3>栈的实现:

可以采用两种方式,可以分别采用顺序表或者链表实现。

4>应用:

a.四则运算

b.符号检测

4.队列

1)定义:

先进先出,限定只能在表的一端进行插入和在另一端进行删除操作的线性表;

2)队列的实现:

可以采用两种方式,可以分别采用顺序表或者链表实现。

3)应用:

5.二叉树

1)基本概念:

1>定义:

每个结点最多有两棵子树,左子树和右子树,次序不可以颠倒

2>性质:

a.非空二叉树的第n层上至多有2^(n-1)个元素

b.深度为h的二叉树至多有2^h-1个结点

3>其他概念:

a.满二叉树:

b.完全二叉树:

2)存储结构

1>顺序存储:

将数据结构存在一块固定的数组中

#defineLENGTH100 

typedefchardatatype; 

typedefstructnode

   datatypedata; 

   intlchild,rchild; 

   intparent; 

}Node;  

Nodetree[LENGTH]; 

intlength; 

introot; 

2>链式存储:

typedefchardatatype; 

typedefstructBinNode

  datatypedata; 

   structBinNode*lchild; 

   structBinNode*rchild; 

}BinNode; 

typedefBinNode*bintree;     //bintree本身是个指向结点的指针 

 

3)二叉树的遍历

1>前序遍历:

根节点->左子树->右子树

2>中序遍历:

左子树->根节点->右子树

3>后序遍历:

左子树->右子树->根节点

4)遍历的实现

1>递归实现

1>二叉树的创建

a.创建二叉树节点

typedefstructBiTree

{

charchr;

structBiTree*lchild;

structBiTree*rchild;

}BiTree;

b.创建二叉树

BiTree*CreateBiTree()

{

charchr;

BiTree*T=NULL;

scanf("%c",&chr);

if(chr!

='')

{

T=(BiTree*)malloc(sizeof(BiTree));

if(T==NULL)

{

printf("Memoryisfailed!

\n");

returnNULL;

}

T->chr=chr;

T->lchild=CreateBiTree();

T->rchild=CreateBiTree();

}

returnT;

}

2>前序遍历

intpreOlderTraverse(BiTree*T)

{

if(T)

{

printf("%c",T->chr);

preOlderTraverse(T->lchild);

preOlderTraverse(T->rchild);

}

return0;

}

3>中序遍历

intinOlderTraverse(BiTree*T)

{

if(T)

{

inOlderTraverse(T->lchild);

printf("%c",T->chr);

inOlderTraverse(T->rchild);

}

return0;

}

4>后序遍历

intpostOlderTraverse(BiTree*T)

{

if(T)

{

postOlderTraverse(T->lchild);

postOlderTraverse(T->rchild);

printf("%c",T->chr);

}

return0;

}

2>非递归实现

1>创建堆栈

a.创建节点

typedefstructsqStack

{

BiTree*Bt;

structsqStack*sp;

}sqStack;

b.push()函数实现

intpush(sqStack**S,BiTree*Bt)

{

sqStack*Stack=NULL;

Stack=(sqStack*)malloc(sizeof(sqStack));

if(Stack==NULL)

{

printf("Memoryisfailed!

\n");

return0;

}

Stack->Bt=Bt;

Stack->Bt->lchild=Bt->lchild;

Stack->Bt->rchild=Bt->rchild;

Stack->sp=(*S);

(*S)=Stack;

return0;

}

c.pop()函数实现

BiTree*pop(sqStack**S)

{

BiTree*Bt=NULL;

sqStack*Stack=NULL;

Bt=(*S)->Bt;

Stack=(*S);

(*S)=(*S)->sp;

free(Stack);

returnBt;

}

2>二叉树的创建

a.创建二叉树节点

typedefstructBiTree

{

charchr;

structBiTree*lchild;

structBiTree*rchild;

}BiTree;

b.创建二叉树

BiTree*CreateBiTree()

{

BiTree*T=NULL;

charchr;

scanf("%c",&chr);

if(chr!

='#')

{

T=(BiTree*)malloc(sizeof(BiTree));

if(T==NULL)

{

printf("Memroyisfailed!

\n");

returnNULL;

}

T->chr=chr;

T->lchild=CreateBiTree();

T->rchild=CreateBiTree();

}

returnT;

}

3>前序遍历

intpreOlderVisitBiTree(sqStack*S,BiTree*T)

{

if(!

T)

{

printf("TheBiTreeisempty!

\n");

}

else

{

while(T||S)

{

while(T)

{

printf("%c",T->chr);

push(&S,T);

T=T->lchild;

}

T=pop(&S);

T=T->rchild; 

}

}

return0;

}

4>中序遍历

intinOlderVisitBiTree(sqStack*S,BiTree*T)

{

if(!

T)

{

printf("TheBiTreeisempty!

\n");

}

else

{

while(T||S)

{

while(T)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 英语

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1