绪论0.1

采用面向过程(结构化)方法描述算法

  本文主要是为了之后的数据结构的一些算法的描述,铺垫一些C/C++语言的知识。


数据类型

  在用C/C++语言编写的程序中必须对出现的每个变量、常量、或表达式明确地说明它们所属的数据类型。

  (1) C/C++语言中的常见数据类型(预定义类型)

  这些数据类型大致可以分为整型、字符型、布尔型、浮点型和空类型。(还有一些修饰词的类型如:short、long等)。在C++中有一个字符串类型它与C的字符串类型有一些不一样,具体体现在相关的字符串函数。

  当然除了上述提到的类型,还有许多不常用的,如C++11x新增的类型char16_t和char32_t等。wchar_t来自typedef short int wchat_t。不同编译器和系统可能存在差异。

类型

范围

char

1 个字节

-128 到 127 或者 0 到 255

unsigned char

1 个字节

0 到 255

signed char

1 个字节

-128 到 127

int

4 个字节

-2147483648 到 2147483647

unsigned int

4 个字节

0 到 4294967295

signed int

4 个字节

-2147483648 到 2147483647

short int

2 个字节

-32768 到 32767

unsigned short int

2 个字节

0 到 65,535

signed short int

2 个字节

-32768 到 32767

long int

8 个字节

-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807

signed long int

8 个字节

-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807

unsigned long int

8 个字节

0 到 18,446,744,073,709,551,615

float

4 个字节

精度型占4个字节(32位)内存空间,+/- 3.4e +/- 38 (~7 个数字)

double

8 个字节

双精度型占8 个字节(64位)内存空间,+/- 1.7e +/- 308 (~15 个数字)

long double

16 个字节

长双精度型 16 个字节(128位)内存空间,可提供18-19位有效数字。

wchar_t

2 或 4 个字节

1 个宽字符

bool

1

1,0

  (2)C/C++语言中的指针类型

概念

描述

C++ Null 指针

C++ 支持空指针。NULL 指针是一个定义在标准库中的值为零的常量。

C++ 指针的算术运算

可以对指针进行四种算术运算:++、--、+、-

C++ 指针 vs 数组

指针和数组之间有着密切的关系。

C++ 指针数组

可以定义用来存储指针的数组。

C++ 指向指针的指针

C++ 允许指向指针的指针。

C++ 传递指针给函数

通过引用或地址传递参数,使传递的参数在调用函数中被改变。

C++ 从函数返回指针

C++ 允许函数返回指针到局部变量、静态变量和动态内存分配。

  C/C++中的指针用法基本是一致的,这里不做详细说明。在C++中有一个经常用到的tish指针,C中似乎没有。

 

char* p = &v[3]; //p指向v的第4个元素

   

  (3)C/C++语言中的数组类型

  数组是一种基本的数据类型,在后述篇章中有详细的描述。这里只简单提一下。在C++中字符串数组有许多相应的函数是C中没有的。例如:.apend()、.toString()、等等。

概念

描述

多维数组

C 支持多维数组。多维数组最简单的形式是二维数组。

传递数组给函数

您可以通过指定不带索引的数组名称来给函数传递一个指向数组的指针。

从函数返回数组

C 允许从函数返回数组。

指向数组的指针

通过指定不带索引的数组名称来生成一个指向数组中第一个元素的指针。

  (4)C/C++语言中的枚举类型

  enum 枚举名 {枚举元素1,枚举元素2,……};

enum DAY{
      MON=1, TUE, WED, THU, FRI, SAT, SUN
};

  枚举变量的定义:

  ①先定义枚举类型,再定义枚举变量

enum DAY{
      MON=1, TUE, WED, THU, FRI, SAT, SUN
};enum DAY day;

  ②定义枚举类型的同时定义枚举变量

enum DAY{
      MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;

  ③省略枚举名称,直接定义枚举变量

enum{
      MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;

  将整型数转换为枚举:

#include <stdio.h> 
#include <stdlib.h> 
int main() { 
    enum day { saturday, sunday, monday, 
    tuesday, wednesday, thursday, friday } workday; 
    int a = 1; 
    enum day weekend; 
    weekend = ( enum day ) a; //类型转换
     //weekend = a; //错误 
    printf("weekend:%d",weekend); 
    return 0; 
}

  (5)C/C++语言中的结构体类型

  定义结构:

struct type_name {
     member_type1 member_name1; 
     member_type2 member_name2; 
     member_type3 member_name3; 
    . . 
} object_names;

  结构体变量的初始化:

#include<iostream> 
using namespace std;

struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
} book = {"C 语言", "RUNOOB", "编程语言", 123456};
 
int main()
{
    cout<< "title : " << book.title <<endl;
    cout<< "subject : " << book.subject <<endl;
    cout<< "author : " << book.author <<endl;
    cout<< "book_id : " << book.book_id <<endl;
    return 0;
}

  运行示例:

title : C 语言
subject : 编程语言
author : RUNOOB
book_id : 123456

  访问结构成员:结构作为函数参数:你可以把结构作为函数参数,传参方式与其他类型或指针类型。结构体作为函数参数。

 

#include <iostream>
#include <cstring>
using namespace std;
 
struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
};
 
int main( )
{
   struct Books Book1;        /* 声明 Book1,类型为 Books */
   struct Books Book2;        /* 声明 Book2,类型为 Books */
 
   /* Book1 详述 */
   strcpy( Book1.title, "C Programming");
   strcpy( Book1.author, "Nuha Ali"); 
   strcpy( Book1.subject, "C Programming Tutorial");
   Book1.book_id = 6495407;
 
   /* Book2 详述 */
   strcpy( Book2.title, "Telecom Billing");
   strcpy( Book2.author, "Zara Ali");
   strcpy( Book2.subject, "Telecom Billing Tutorial");
   Book2.book_id = 6495700;
 
   /* 输出 Book1 信息 */
   cout << "Book 1 title : " << Book1.title << endl;
   cout << "Book 1 author : " << Book1.author << endl;
   cout << "Book 1 subject : " << Book1.subject << endl;
   cout << "Book 1 book_id : " << Book1.book_id << endl;
 
   /* 输出 Book2 信息 */
   cout << "Book 2 title : " << Book2.title << endl;
   cout << "Book 2 author : " << Book2.author << endl;
   cout << "Book 2 subject : " << Book2.subject << endl;
   cout << "Book 2 book_id : " << Book1.book_id << endl;
 
   return 0;
}

 

  运行示例:

Book 1 title : C Programming
Book 1 author : Nuha Ali
Book 1 subject : C Programming Tutorial
Book 1 book_id : 6495407
Book 2 title : Telecom Billing
Book 2 author : Zara Ali
Book 2 subject : Telecom Billing Tutorial
Book 2 book_id : 6495407

 

  指向结构的指针

#include <iostream>
#include <cstring>
using namespace std;
struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
};
 
/* 函数声明 */
void printBook( struct Books *book );
int main( )
{
   struct Books Book1;        /* 声明 Book1,类型为 Books */
   struct Books Book2;        /* 声明 Book2,类型为 Books */
 
   /* Book1 详述 */
   strcpy( Book1.title, "C Programming");
   strcpy( Book1.author, "Nuha Ali"); 
   strcpy( Book1.subject, "C Programming Tutorial");
   Book1.book_id = 6495407;
 
   /* Book2 详述 */
   strcpy( Book2.title, "Telecom Billing");
   strcpy( Book2.author, "Zara Ali");
   strcpy( Book2.subject, "Telecom Billing Tutorial");
   Book2.book_id = 6495700;
 
   /* 通过传 Book1 的地址来输出 Book1 信息 */
   printBook( &Book1 );
 
   /* 通过传 Book2 的地址来输出 Book2 信息 */
   printBook( &Book2 );
 
   return 0;
}
void printBook( struct Books *book )
{
   cout << "Book title : " << book->title << endl;
   cout << "Book author : " << book->author << endl;
   cout << "Book subject : " << book->subject << endl;
   cout << "Book book_id : " << book->book_id << endl;
}

  位域定义与结构定义相仿,其形式为:

struct //位域结构名 
{
 //位域列表:类型说明符 位域名: 位域长度
};

  位域的定义和位域变量的说明

struct bs{
    unsigned a:4;
    unsigned  :4;    /* 空域 */
    unsigned b:4;    /* 从下一单元开始存放 */
    unsigned c:4
}

  位域的使用

#include <iostream>
using namespace std;

struct bs{
    unsigned a:1;
    unsigned b:3;
    unsigned c:4;
} bit,*pbit;

int main(void){    
    bit.a=1;    /* 给位域赋值(应注意赋值不能超过该位域的允许范围) */
    bit.b=7;    /* 给位域赋值(应注意赋值不能超过该位域的允许范围) */
    bit.c=15;    /* 给位域赋值(应注意赋值不能超过该位域的允许范围) */
    cout << bit.a << ',' << bit.b << ',' << bit.c << endl;    /* 以整型量格式输出三个域的内容 */
    pbit=&bit;    /* 把位域变量 bit 的地址送给指针变量 pbit */
    pbit->a=0;    /* 用指针方式给位域 a 重新赋值,赋为 0 */
    pbit->b&=3;    /* 使用了复合的位运算符 "&=",相当于:pbit->b=pbit->b&3,位域 b 中原有值为 7,与 3 作按位与运算的结果为 3(111&011=011,十进制值为 3) */
    pbit->c|=1;    /* 使用了复合位运算符"|=",相当于:pbit->c=pbit->c|1,其结果为 15 */
    cout<< pbit->a << ',' << pbit->b << ',' << pbit->c <<endl;    /* 用指针方式输出了这三个域的值 */
    return 0;
}

  运行示例:

1,7,15
0,3,15

  typedef关键字:你可以为创建的类型取一个“别名”。例如:

typedef struct Books{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
}Books;

  现在,你可以直接使用Books来定义Books类型的变量,而不是使用struct关键字。如下:

Books Book1, Book2;

  你可以使用typedef关键字来定义非结构类型,如:

typedef long int *pint32;
pint32 x, y, z;

  x,y,z都是指向长整形long int的指针。

  (6)C/C++语言中的共用体类型

  共用体是一种特殊的数据类型,允许你在相同的内存位置存储不同的数据类型。你可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值。共用体提供了一种使用相同的内存位置的有效方式。定义共用体必须使用union语句。

union [union tag] { 
    member definition; 
    member definition; 
    ... 
    member definition; 
} [one or more union variables];

  一个变量(相同的内存位置)可以存储多个多种类型的数据。共用体占用的内存足够存储共用体中最大的成员。

union Data { 
    int i; 
    float f; 
    char str[20]; 
} data;
#include <stdio.h> 
#include <string.h> 
union Data { 
    int i; 
    float f; 
    char str[20]; 
}; 
int main( ) { 
    union Data data; 
    printf( "Memory size occupied by data : %d\n", sizeof(data)); 
    return 0; 
}

  访问共用体成员:使用成员访问运算符(.)并且,同一时间只使用一个变量。

#include <stdio.h> 
#include <string.h> 
union Data { 
    int i; 
    float f; 
    char str[20]; 
}; 
int main( ) { 
    union Data data; 
    data.i = 10; 
    data.f = 220.5; 
    strcpy( data.str, "C Programming"); 
    printf( "data.i : %d\n", data.i);
    printf( "data.f : %f\n", data.f); 
    printf( "data.str : %s\n", data.str); 
    return 0; 
}

 

 

 

posted @ 2020-06-08 19:00  望星草  阅读(186)  评论(0编辑  收藏  举报