C语言通用数据类型链表的构造数据域为指针

C语言通用数据类型链表的构造数据域为指针
C语言通用数据类型链表的构造数据域为指针

和一般的数据结构里面的链表的实现没什么大不同,

在list.h里面只修改一个地方

typedef void * ElemType;

也就是说数据域是一个无类型指针,链表本身不对这个指针有数据访问,在使用链表的时候我们给一个有类型的指针,在操作的时候编译器有规律可循了,接下来只要链表数据访问的函数了,因为数据域是一个指针,因为没有修改TraverseList函数,那么给函数指针传递的一个指向指针的指针,所以修改遍历数据域访问函数如下

int TraverseList(List*,int (*)(ElemType *));/* 遍历访问,反问某个节点元素用函数处理 */

list.htypedef void * ElemType;

typedef struct node

{

ElemType data;

struct node * next;

}ChainNode;

typedef struct

{

ChainNode *head;

int size;

ChainNode *tail;

}List;

List * CreateList(void); /* 创建链表 */

void DestoryList(List*); /* 销毁链表 */

void ClearList(List*); /* 清空链表 */

int ListAppend(List*,ElemType); /* 追加元素 */

int ListInsert(List*,int,ElemType); /* 加入元素 */

int ListDelete(List *,int); /* 删除第几个元素 */

int GetElem(List*,int,ElemType *); /* 取得第几个元素的值用第三个参数返回 */

ChainNode * GetAddr(List *, int); /* 取得编号为N的元素所在地址 */

int TraverseList(List*,int (*)(ElemType *)); /* 遍历访问,反问某个节点元素用函数处理 */

ChainNode * NewChainNode( ElemType);

list.c

#include "list.h"

/*==================*/

/*==================*/

List *CreateList()

{

List * pt = 0;

ElemType data;

pt=(List*)malloc( sizeof(List) );

if( !pt )

return 0;

pt->head = NewChainNode(data );

if( ! pt->head )

{

free(pt);

return 0;

}

pt->tail = pt->head;

return pt;

}

/*==================*/

void DestoryList(List * plist)

{

ClearList(plist);

free(plist->head);

plist->head = 0;

free(plist);

plist = 0;

}

/*==================*/

int ListAppend(List * plist,ElemType data)

{

ChainNode * pt = 0;

ChainNode * newpt = 0;

if( !(plist && plist->head) )

return 0;

newpt = NewChainNode(data);

if( !newpt )

return 0;

plist->tail->next = newpt;

plist->tail = newpt;

return 1;

}

/*==================*/

int ListInsert(List * plist, int n ,ElemType data) {

ChainNode * pt = 0;

ChainNode * newpt = 0;

pt = GetAddr( plist, n-1 );

if( !(pt) )

return 0;

newpt = NewChainNode(data);

if( !newpt )

return 0;

if ( pt->next == plist->tail )

plist->tail = newpt;

newpt->next = pt->next;

pt->next = newpt;

return 1;

}

/*==================*/

int GetElem(List * plist,int n,ElemType *data)

{

ChainNode * pt = 0;

pt = GetAddr(plist,n);

if( ! pt )

return 0;

*data = pt->data;

return 1;

}

/*==================*/

int TraverseList(List* plist,int (*f)(ElemType *))

{

ChainNode * pt = 0;

int a=0;

/**/

if( !(plist && plist->head) )

return 0;

for( a = 0 ,pt = plist->head->next; pt ; pt = pt->next ) {

if( ! f(&(pt->data)) )

return a+1;

a++;

}

return 0;

}

/*==================*/

void ClearList(List * plist)

{

while ( ListDelete(plist,1) );

}

/*======(参考:https://www.360docs.net/doc/528363156.html,)============*/ int ListDelete( List * plist, int n )

{

ChainNode * pt =0;

ChainNode * pf=0;

if( !plist->head->next )

return 0;

pt = GetAddr( plist,n-1 );

if ( pt->next == plist->tail )

plist->tail = pt;

if( !(pt && pt->next ))

return 0;

pf = pt->next;

pt->next = pt->next->next;

free(pf);

return 1;

}

ChainNode * GetAddr(List * plist,int n)

{

ChainNode * pt = 0;

int a = 0;

if( n < 0) return 0;

pt = plist->head;

while( pt && a < n )

{

pt = pt->next;

a++;

}

return pt;

}

/*==================*/

ChainNode * NewChainNode(ElemType* data)

{

ChainNode * pChain=0;

pChain = ( ChainNode * )malloc( sizeof(ChainNode) );

if( ! pChain ) return 0;

pChain->data=data;

pChain->next=0;

return pChain;

}

uselist.c

#include "list.h"

typedef struct {char ch ; int id; char name[10]; int r;} myElemType;

myElemType a[20] ={{'a',1,"niei",2},{'b',2,"aini",2},{'c',3,"love", 2},{'d',4,"jack",2},{'e',5,"alice",2},{'f',6,"ben" ,2},{'g',7,"carlo",2},{'h',8,"mason",2}};

void showList(List* plist);

int putElem(ElemType *data);

void main()

{

/**/ List * mylist;

int n=0;

myElemType data;

myElemType data2;

myElemType* pdata;

mylist = CreateList();

if( ! mylist)

{

printf("error");

return;

}

for( n = 0 ;n < 8 ;n++)

ListAppend(mylist ,&a[n]);

showList( mylist);

data.ch = '*';

data.id = 8;

strcpy(https://www.360docs.net/doc/528363156.html, , "1223");

data.r = 54;

ListInsert(mylist,1,&data);

showList( mylist);

data2.ch = 'A';

data2.id = 54;

strcpy(https://www.360docs.net/doc/528363156.html, , "bill");

data2.r = 4;

/**/ ListInsert(mylist,7,&data2);

showList( mylist);

ListDelete(mylist,7);

showList( mylist);

ListDelete(mylist,1);

showList( mylist);

if (GetElem(mylist,5,&pdata) )

printf("[%c %d %s %d] ",pdata->ch,pdata->id,pdata->name,pdata->r);

ClearList(mylist);

showList( mylist);

DestoryList(mylist);

mylist = 0;

showList( mylist);

}

/*==================*/

void showList(List* plist)

{

if( !plist )

return;

TraverseList(plist,putElem);

printf("\n");

}

int putElem(myElemType **data)

{

if( !data )

return 0;

printf("[%c %d %s %d] ",(*data)->ch,(*data)->id,(*data)->name,(*data)->r);

return 1;

}

最后的运行结果,一个[ ] 表示一个结构体所有成员

STEP7——ANY指针详解

参数类型ANY的格式 STEP 7以10个字节存储参数类型ANY。当构造类型为ANY的参数时,必须确保所有10个字节都被占用,因为调用块估计参数整个内容的值。例如,如果以字节4指定DB编号,也必须以字节6明确地指定存储器区。 STEP 7管理基本和复杂数据类型的数据与参数类型的数据不同。 数据类型的ANY格式 对于基本和复杂数据类型,STEP 7存储下列数据: ?数据类型 ?重复因子 ?DB编号 ?信息存储的存储区域 ?数据的起始地址 重复因子识别由参数类型ANY传送的指示数据类型的数量。这意味着可以指定数据区,也可以和参数类型ANY结合使用数组和结构。STEP 7将数组和结构识别为数据类型的编号(借助重复因数)。例如,如果要传送10个字,必须为重复因子输入数值10,并且必须为数据类型输入数值04。 地址以格式Byte.Bit存储,此处字节寻址存储在字节7的位0 - 2,节字8的位0 - 7,节字9的位3 - 7。位地址存储在字节9的位0 - 2。 对于类型NIL的空指针,所有来自字节1的字节设置为0。 下表给出参数类型ANY的数据类型或存储区域的编码。

参数类型的ANY格式 对于参数类型,STEP 7存储数据类型和参数的地址。重复因子始终是1。字节4、5和7始终是0。字节8和9指示定时器、计数器或块的编号。

下表为参数类型显示参数类型ANY的数据类型编码。 使用参数类型ANY 可以为适合于任何数据类型的实际参数的块定义形式参数。当调用块是未知或可以改变时(和当允许任何数据类型时),已提供了实际参数的数据类型时,这尤其有用。在块的变量声明中,可以声明参数为数据类型ANY。然后可以在STEP 7中分配任何数据类型的实际参数。 STEP 7为ANY数据类型的变量分配存储器的80个位。如果分配实际参数给此形式参数,STEP 7在80个位中编码起始地址、数据类型和实际参数的长度。调用块为ANY参数分析保存数据的80个位,并获取进一步处理所需的信息。 分配实际参数给ANY参数 如果为参数声明数据类型ANY,可以分配任何数据类型的实际参数给形式参数。在STEP 7中,可以指定下列数据类型为实际参数: ?基本数据类型:指定实际参数的绝对地址或符号名称。 ?复杂数据类型:指定复杂数据类型的数据符号名称(例如,数组和结构)。 ?定时器、计数器和块:指定编号(例如,T1、C20或FB6)。 ?下图说明数据如何传送到具有ANY数据类型参数的FC。

C题库--自定义数据类型(精)

本题序号:118 当定义一个结构体变量时,系统分配给它的内存大小的理论值是__________。 A 各成员所需内存的总和 B 结构体中的第一个成员所需内存 C 成员中所需内存最大者的存储空间 D 结构体中的最后一个成员所需存储容量参考答案 A 本题序号:165 存放多个字符串,用________比较适合。 A 二维字符数组 B 一维字符数组 C 自定义结构体 D 自定义联合体 参考答案 A 本题序号:169 定义生成非静态变量时,将对变量进行_______。 A 自动赋初值 B 自动赋0 C 不会自动赋初值 D 自动赋-1 参考答案 C 本题序号:180 x为int型,s为float型,x=3,s=2.5。表达式s+x/2的值为________。 A 4 B 3.5 C 2.5 D 3 参考答案 B 本题序号:182 x、y为整数,x=15,y=-2。表达式x>10 and y<2 or x*y==10 and x的值为_________。 A 0 B 15 C 1 D 2 参考答案 C 本题序号:211 以下定义, struct st1{int a,b;float x,y;}; struct st2{int a,b;st1 s1; } ss; 对成员变量x的引用形式正确的是:_________ 。 A ss.s1.x B st2.st1.x C st2.s1.x D ss.x 参考答案 A 本题序号:215 对任意整型数据数据m,n(m>n>0), 则 C 语言表达式m-m/n*n的值为:_______________。 A 0 B m%n C 1 D n%m 参考答案 B 本题序号:223 设有以下定义: enum t1 {a1,a2=7,a3,a4=15} time; 则枚举常量a1和a3的值分别是 A 1和2 B 6和3 C 1和8 D 0和8 参考答案 D 本题序号:225 设有类型说明:enum color{red,yellow=3,white,black}; 则执行语句cout<

C语言关键字共32个

由ANSI标准定义的C语言关键字共32个: auto double int struct break else long switch case enum register typedef char extern return union const float short unsigned continue for signed void default goto sizeof volatile do if while static 根据关键字的作用,可以将关键字分为数据类型关键字和流程控制关键字两大类。 1数据类型关键字 A.基本数据类型(5个) void:声明函数无返回值或无参数,声明无类型指针,显式丢弃运算结果 char:字符型类型数据,属于整型数据的一种 int:整型数据,通常为编译器指定的机器字长 float:单精度浮点型数据,属于浮点数据的一种 double:双精度浮点型数据,属于浮点数据的一种 B.类型修饰关键字(4个) short:修饰int,短整型数据,可省略被修饰的int。 long:修饰int,长整形数据,可省略被修饰的int。 signed:修饰整型数据,有符号数据类型 unsigned:修饰整型数据,无符号数据类型 C.复杂类型关键字(5个) struct:结构体声明 union:共用体声明 enum:枚举声明 typedef:声明类型别名 sizeof:得到特定类型或特定类型变量的大小 D.存储级别关键字(6个) auto:指定为自动变量,由编译器自动分配及释放。通常在栈上分配 static:指定为静态变量,分配在静态变量区,修饰函数时,指定函数作用域为文件内部 register:指定为寄存器变量,建议编译器将变量存储到寄存器中使用,也可以修饰函数形参,建议编译器通过寄存器而不是堆栈传递参数 extern:指定对应变量为外部变量,即标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。 const:与volatile合称“cv特性”,指定变量不可被当前线程/进程改变(但有可能被系统或其他线程/进程改变) volatile:与const合称“cv特性”,指定变量的值有可能会被系统或其他进程/线程改变,强制编译器每次从内存中取得该变量的值 2流程控制关键字

用户定义数据类型与自定义函数

数据库系统原理实验报告 实验名称:__用户定义数据类型与自定义函数_ 指导教师:_叶晓鸣刘国芳_____ 专业:_计算机科学与技术_ 班级:__2010级计科班_ 姓名:_文科_____学号: 100510107 完成日期:_2012年11月10日_成绩: ___ ___一、实验目的: (1)学习和掌握用户定义数据类型的概念、创建及使用方法。 (2)学习和掌握用户定义函数的概念、创建及使用方法。 二、实验内容及要求: 实验 11.1 创建和使用用户自定义数据类型 内容: (1)用SQL语句创建一个用户定义的数据类型Idnum。 (2)交互式创建一个用户定义的数据类型Nameperson。 要求: (1)掌握创建用户定义数据类型的方法。 (2)掌握用户定义数据类型的使用。 实验 11.2 删除用户定义数据类型 内容: (1)使用系统存储过程删除用户定义的数据类型Namperson。 (2)交互式删除用户定义的数据类型Idnum。 要求: (1)掌握使用系统存储过程删除用户定义的数据类型。 (2)掌握交互式删除用户定义的数据类型。 实验 11.3 创建和使用用户自定义的函数 内容: (1)创建一个标量函数Score_FUN,根据学生姓名和课程名查询成绩。 (2)创建一个内嵌表值函数S_Score_FUN,根据学生姓名查询该生所有选课的成绩。 (3)创建一个多语句表值函数ALL_Score_FUN,根据课程名查询所有选择该课程学生的成绩信息。

要求: (1)掌握创建标量值函数的方法。 (2)掌握创建内嵌表值函数的方法。 (3)掌握创建多语句表值函数的方法。 实验 11.4 修改用户定义的函数 内容: (1)交互式修改函数Score_FUN,将成绩转换为等级输出。 (2)用SQL修改函数S_Score_FUN,要求增加一输出列定义的成绩的等级。要求: (1)掌握交互式修改用户定义函数的方法。 (2)掌握使用SQL修改用户定义函数的方法。 实验 11.5 输出用户定义的函数 内容: (1)交互式删除函数Score_FUN。 (2)用SQL删除函数S_Score_FUN。 要求: (1)掌握交互式删除用户定义函数的方法。 (2)掌握使用SQL删除用户定义函数的方法。

c语言数据类型关键字

1 数据类型关键字(12个): (1) char :声明字符型变量或函数 (2) double :声明双精度变量或函数 (3) enum :声明枚举类型 (4) float:声明浮点型变量或函数 (5) int:声明整型变量或函数 (6) long :声明长整型变量或函数 (7) short :声明短整型变量或函数 (8) signed:声明有符号类型变量或函数 (9) struct:声明结构体变量或函数 (10) union:声明联合数据类型 (11) unsigned:声明无符号类型变量或函数 (12) void :声明函数无返回值或无参数,声明无类型指针(基本上就这三个作用)(2)控制语句关键字(12个): A循环语句 (1) for:一种循环语句(可意会不可言传) (2) do :循环语句的循环体 (3) while :循环语句的循环条件 (4) break:跳出当前循环 (5) continue:结束当前循环,开始下一轮循环 B条件语句 (1)if: 条件语句 (2)else :条件语句否定分支(与if 连用) (3)goto:无条件跳转语句 C开关语句 (1)switch :用于开关语句 (2)case:开关语句分支 (3)default:开关语句中的“其他”分支 D return :子程序返回语句(可以带参数,也看不带参数) 3 存储类型关键字(4个) (1)auto :声明自动变量一般不使用 (2)extern:声明变量是在其他文件正声明(也可以看做是引用变量) (3)register:声明积存器变量 (4)static :声明静态变量 4 其它关键字(4个): (1)const :声明只读变量 (2)sizeof:计算数据类型长度 (3)typedef:用以给数据类型取别名(当然还有其他作用 (4)volatile:说明变量在程序执行中可被隐含地改变

自定义数据类型习题及答案(C语言)

第7章自定义数据类型习题 一.选择题: 1.当定义一个结构体变量时,系统分配给它的内存空间是【】。 A) 结构中一个成员所需的内存量B) 结构中最后一个成员所需的内存量 C) 结构体中占内存量最大者所需的容量D) 结构体中各成员所需内存量的总和2.若有以下说明,对初值中整数2的正确引用方式是【】。 static struct { char ch; int i; double x; } a[2][3]={{…a?,1,3 .45,?b?,2,7.98,?c?,3,1.93I} {…d?,4,4.73,?e?,5,6.78,?f?,6,8.79 }}; A) a[1][1].i B) a[0][1].i C) a[0][0].i D) a[0][2].i 3.根据以下定义,能打印字母M的语句是【】。 struct p { char name[9]; int age; }c[10]={“Jobn”,17,”Paul”,19,”Mary”,18,”Adam”,16}; A) printf(“%c”,c[3].name);B) printf(“%c”,c[3].name[1]); C) printf(“%c”,c[2].name);D) printf(“%c”,c[2].name[0]); 4.以下说明和语句中,已知int型数据占两个字节,则以下语句的输出结果是【】。 struct st { char a[l0]; int b; double c; }; printf(“%d”,sizeof(struct st)); A) 0 B) 8 C) 20 D) 2 5.以下说明和语句中,对结构体变量std中成员id的引用方式不正确的是【】。 struct work { int id; int name; } std, *p; p=&std; A) std.id B) *p.id C) (*p).id D) &std.id 6.如设有如下定义,若要使px指向rec中的成员x,正确的赋值语句是【】。 struct aa

C语言通用数据类型链表的构造数据域为指针

和一般的数据结构里面的链表的实现没什么大不同, 在list.h里面只修改一个地方 typedef void * ElemType; 也就是说数据域是一个无类型指针,链表本身不对这个指针有数据访问,在使用链表的时候我们给一个有类型的指针,在操作的时候编译器有规律可循了,接下来只要链表数据访问的函数了,因为数据域是一个指针,因为没有修改TraverseList函数,那么给函数指针传递的一个指向指针的指针,所以修改遍历数据域访问函数如下 int TraverseList(List*,int (*)(ElemType *));/* 遍历访问,反问某个节点元素用函数处理 */ list.htypedef void * ElemType; typedef struct node { ElemType data; struct node * next; }ChainNode; typedef struct { ChainNode *head; int size; ChainNode *tail; }List; List * CreateList(void); /* 创建链表 */ void DestoryList(List*); /* 销毁链表 */ void ClearList(List*); /* 清空链表 */ int ListAppend(List*,ElemType); /* 追加元素 */ int ListInsert(List*,int,ElemType); /* 加入元素 */ int ListDelete(List *,int); /* 删除第几个元素 */

int GetElem(List*,int,ElemType *); /* 取得第几个元素的值用第三个参数返回 */ ChainNode * GetAddr(List *, int); /* 取得编号为N的元素所在地址 */ int TraverseList(List*,int (*)(ElemType *)); /* 遍历访问,反问某个节点元素用函数处理 */ ChainNode * NewChainNode( ElemType); list.c #include "list.h" /*==================*/ /*==================*/ List *CreateList() { List * pt = 0; ElemType data; pt=(List*)malloc( sizeof(List) ); if( !pt ) return 0; pt->head = NewChainNode(data ); if( ! pt->head ) { free(pt); return 0; } pt->tail = pt->head; return pt; } /*==================*/ void DestoryList(List * plist) { ClearList(plist); free(plist->head); plist->head = 0; free(plist); plist = 0;

C语言的基本数据类型及其表示

3.2 C语言的基本数据类型及其表示 C语言的基本数据类型包括整型数据、实型数据和字符型数据,这些不同数据类型如何表示?如何使用?它们的数据范围是什么?下面我们分别进行介绍。 3.2.1 常量与变量 1. 常量 常量是指程序在运行时其值不能改变的量,它是C语言中使用的基本数据对 象之一。C语言提供的常量有: 以上是常量所具有的类型属性,这些类型决定了各种常量所占存储空间的大小和数的表示范围。在C程序中,常量是直接以自身的存在形式体现其值和类型,例如:123是一个整型常量,占两个存储字节,数的表示范围是-32768~32767;123.0是实型常量,占四个存储字节,数的表示范围是-3.4 10-38~3.4 1038。 需要注意的是,常量并不占内存,在程序运行时它作为操作对象直接出现在运算器的各种寄存器中。 2.符号常量 在C程序中,常量除了以自身的存在形式直接表示之外,还可以用标识符来表示常量。因为经常碰到这样的问题:常量本身是一个较长的字符序列,且在程序中重复出现,例如:取常数的值为3.1415927,如果在程序中多处出现,直接使用3.1415927的表示形式,势必会使编程工作显得繁琐,而且,当需要把的值修改为3.1415926536时,就必须逐个查找并修改,这样,会降低程序的可修改性和灵活性。因此,C语言中提供了一种符号常量,即用指定的标识符来表示某个常量,在程序中需要使用该常量时就可直接引用标识符。 C语言中用宏定义命令对符号常量进行定义,其定义形式如下: #define 标识符常量 其中#define是宏定义命令的专用定义符,标识符是对常量的命名,常量可以是前面介绍的几种类型常量中的任何一种。该使指定的标识符来代表指定的常量,这个被指定的标识符就称为符号常量。例如,在C程序中,要用PAI代表实型常量3.1415927,用W代表字符串常量"Windows 98",可用下面两个宏定义命令: #define PAI 3.1415927 #define W "Windows 98" 宏定义的功能是:在编译预处理时,将程序中宏定义(关于编译预处理和宏定义的概念详见9.10节)命令之后出现的所有符号常量用宏定义命令中对应的常量一一替代。例如,对于以上两个宏定义命令,编译程序时,编译系统首先将程序中除这两个宏定义命令之外的所有PAI替换为3.1415927,所有W替换为Windows 98。因此,符号常量通常也被称为宏替换名。 习惯上人们把符号常量名用大写字母表示,而把变量名用小写字母表示。例3-1是符号常量的一个简单的应用。其中,PI为定义的符号常量,程序编译时,用3.1416替换所有的PI。 例3-1:已知圆半径r,求圆周长c和圆面积s的值。

C语言的基本数据类型及其表示

3.2C语言的基本数据类型及其表示 C语言的基本数据类型包括整型数据、实型数据和字符型数据,这些不同数据类型如何表示?如何使用?它们的数据范围是什么?下面我们分别进行介绍。 3.2.1常量与变量 1.常量 常量是指程序在运行时其值不能改变的量,它是C语言中使用的基本数据对 象之一。C语言提供的常量有: 以上是常量所具有的类型属性,这些类型决定了各种常量所占存储空间的大小和数的表示范围。在C程序中,常量是直接以自身的存在形式体现其值和类型,例如:123是一个整型常量,占两个存储字节,数的表示范围是-32768~32767;123.0是实型常量,占四个存储字节,数的表示范围是-3.410-38~3.41038。 需要注意的是,常量并不占内存,在程序运行时它作为操作对象直接出现在运算器的各种寄存器中。 2.符号常量 在C程序中,常量除了以自身的存在形式直接表示之外,还可以用标识符来表示常量。因为经常碰到这样的问题:常量本身是一个较长的字符序列,且在程序中重复出现,例如:取常数的值为3.1415927,如果在程序中多处出现,直接使用3.1415927的表示形式,势必会使编程工作显得繁琐,而且,当需要把的值修改为3.1415926536时,就必须逐个查找并修改,这样,会降低程序的可修改性和灵活性。因此,C语言中提供了一种符号常量,即用指定的标识符来表示某个常量,在程序中需要使用该常量时就可直接引用标识符。 C语言中用宏定义命令对符号常量进行定义,其定义形式如下: #define标识符常量 其中#define是宏定义命令的专用定义符,标识符是对常量的命名,常量可以是前面介绍的几种类型常量中的任何一种。该使指定的标识符来代表指定的常量,这个被指定的标识符就称为符号常量。例如,在C程序中,要用PAI代表实型常量3.1415927,用W代表字符串常量"Windows98",可用下面两个宏定义命令: #define PAI3.1415927 #define W"Windows98" 宏定义的功能是:在编译预处理时,将程序中宏定义(关于编译预处理和宏定义的概念详见9.10节)命令之后出现的所有符号常量用宏定义命令中对应的常量一一替代。例如,对于以上两个宏定义命令,编译程序时,编译系统首先将程序中除这两个宏定义命令之外的所有PAI替换为3.1415927,所有W替换为Windows98。因此,符号常量通常也被称为宏替换名。 习惯上人们把符号常量名用大写字母表示,而把变量名用小写字母表示。例3-1是符号常量的一个简单的应用。其中,PI为定义的符号常量,程序编译时,用3.1416替换所有的PI。 例3-1:已知圆半径r,求圆周长c和圆面积s的值。

C语言自定义数据类型

自定义数据类型 结构体 结构体是程序员在程序中自定义的一种数据类型,在说明和使用之前必须先定义它,也就是构造它。定义一个结构体的语法格式如下: Struct 结构体类型名 { 成员1的数据类型名成员1名称; 成员2的数据类型名成员2名称; . . 成员n的数据类型名成员n名称; }结构体变量表={成员初始化}; 注意成员可以由若干个不同的数据类型组成,每个成员也可以是结构体,即可以嵌套定义。 例如: Struct student { Long num; Char name; Char sex; Float score; }; 已经定义的某种结构体类型可以视为一种标准的数据类型,它的使用方法与标准数据类型使用方法相同,可以用来定义变量、数组、指针。 结构体变量说明 结构体变量的说明在程序的变量说明部分给出,一般在结构定义之后,它的语法格式如下: Struct 结构类型名结构变量名表; 例如: Struct student stu; 指出了结构变量stu是student类型的变量,它由四个成员组成,每个成员的数据类型和名字都与student结构定义中给出的相同。系统完全按照结构定义时制定的内存模式为结构变量分配内存空间。 可以在定义结构体类型的同时给出结构体变量。 Struct student { Long num; Cha name[20]; Cha sex; Float score; }stu1,stu2; 这种形式与前面给出的结构定义和结构说明分开处理效果相同。

结构体成员访问 结构体成员是通过结构体变量名和成员名进行访问的,不能把他作为一个整体进行访问。其访问格式如下: 结构体变量名.成员名 其中运算符.是成员访问运算符,其运算级别是最高的,和圆括号运算符()、下标运算符[]是同一级别的。如果结构体成员是指针变量,则访问格式为: *https://www.360docs.net/doc/528363156.html, 如果某个结构体变量的成员数据类型又是一个结构体,则访问方式为: 外层结构体变量名.外层成员名.内层成员名 可以在定义结构体变量的同时对结构体变量初始化。 {结构体成员}结构体变量={初始数据}; struct student { long num; char name[20]; char sex; float score; } stu1={200401L,"ZhangHong",'f',92.5f}; 对于嵌套的结构体类型数据,访问格式为: 结构体变量名1.结构体变量名2.成员名 结构体变量初始化的格式如下: struct 结构体名 {结构体成员}结构体变量={初始数据}; 初始数据类型必须与结构成员的数据类型相匹配,并且先后顺序一一对应赋值。 要对结构体变量的成员地址进行访问,其语法格式为: &结构体变量.成员名 当一个指针变量用来指向一个结构变量时,称为结构体指针变量。结构体指针变量中的值是所指向的结构体变量的首地址。 结构体指针变量: Struct 结构名*结构体指针变量名 Struct student *pstu; 必须先赋值后使用,把结构体变量的首地址赋给指针变量,不能把结构名或结构体变量名赋给指针变量。 pstu=&stu1; 结构体名和结构体变量是两个不同的概念,结构体名只能表示一个结构形式,编译系统并不对它分配内存空间,只有当某变量被说明为这种类型的结构时,才对该变量分配存储空间。这是因为结构体变量被定义后相当于标准数据类型被使用。 利用结构体指针变量访问成员如下: (*结构体指针变量).成员名 或者: 结构体指针变量->成员名 后一种形式较为方便,容易区分。

C语言数据类型及表示范围

C语言各种数据类型在系统中占的字节和取值围 基本类型包括字节型(char)、整型(int)和浮点型(float/double)。 定义基本类型变量时,可以使用符号属性signed、unsigned(对于char、int),和长度属性short、long(对于int、double)对变量的取值区间和精度进行说明。 下面列举了Dev-C++下基本类型所占位数和取值围: 符号属性长度属性基本型所占位数取值围输入符举例输出符举例-- -- char 8 -2^7 ~ 2^7-1 %c %c、%d、%u signed -- char 8 -2^7 ~ 2^7-1 %c %c、%d、%u unsigned -- char 8 0 ~ 2^8-1 %c %c、%d、%u [signed] short [int] 16 -2^15 ~ 2^15-1 %hd unsigned short [int] 16 0 ~ 2^16-1 %hu、%ho、%hx [signed] -- int 32 -2^31 ~ 2^31-1 %d unsigned -- [int] 32 0 ~ 2^32-1 %u、%o、%x [signed] long [int] 32 -2^31 ~ 2^31-1 %ld unsigned long [int] 32 0 ~ 2^32-1 %lu、%lo、%lx [signed] long long [int] 64 -2^63 ~ 2^63-1 %I64d unsigned long long [int] 64 0 ~ 2^64-1 %I64u、%I64o、%I64x -- -- float 32 +/- 3.40282e+038 %f、%e、%g -- -- double 64 +/- 1.79769e+308 %lf、%le、%lg %f、%e、%g -- long double 96 +/- 1.79769e+308 %Lf、%Le、%Lg 几点说明: 1. 注意! 表中的每一行,代表一种基本类型。“[]”代表可省略。 例如:char、signed char、unsigned char是三种互不相同的类型; int、short、long也是三种互不相同的类型。可以使用C++的函数重载特性进行验证,如: void Func(char ch) {} void Func(signed char ch) {} void Func(unsigned char ch) {} 是三个不同的函数。

第九章指针类型

9.1 指针类型的声明 指针类型在任何语言中都是比较难以理解也是比较灵活的一种数 据类型 指针常是它所指的变量的内存地址。声明指针类型的语法如下: Type 〈指针类型标志符〉=^〈基类型〉; 其中,指针类型标志符即是指针类型名,基类型可以是简单类 型,如整型,实型,字符型等,也可以是结构类型,如数组,记 录,集合等。 指针类型声明示例: Type Tr = ^Integer; PI = ^real; Word = Record Name: String[10]; Age: Integer; Scores: Real; End;

BytePtr = ^Byte; WordPtr = ^Word; 上例中,声明了4个指针类型。其中,BytePtr是一个指向字节类型的数据;而WordPtr是一个指向记录类型Word的数据Object Pascal不要求基类型一定是要在前面已声明的,也可以是一个标志符,然后在同一个模块内声明基类型。 声明了指针类型后,就可以声明指针类型的变量,如: Var BP: BytePtr; WP: WordPtr; 或: Var BP: ^Bytel; 指针所指的基类型可以是简单类型,也可以是构造类型,如:Type Student = Record Name: String; Age: Integer; Sex: (Man, Woman); End; Var StuPtr: ^Student;

上例中,声明了一个指向记录类型的Student指针变量StuPtr,以后程序中就可以使用StuPtr^来表示记录类型Student的动态变量。要访问其中的Name字段,可以写成StuPtr^.Name。这里介绍动态变量的概念,动态变量的构成是用指针类型的变量标志符后加一个“^”符号,就构成指针所指向的基类型的动态变量,如上例中的StuPtr^就是Student的动态变量。 与通常的变量一样,一旦声明了指针变量,编译器将给指针分配存储单元,但存储单元中的值尚未确定。要想让指针指向确定的地址,必须通过赋值语句或New标准过程来实现。如:Label 1,2,3,4,5; Var M: Integer; X1, X2: ^Integer; Begin 1: M:= 20; 2: X1:= @M; 3: New(X2); 4: X2^:= 150; 5: Dispose(X2); End;

C语言的32个关键字和9种控制语句

C语言的32个关键字和9种控制语句 C语言的关键字共有32个,根据关键字的作用,可分其为数据类型关键字、控制语句关键字、存储类型关键字和其它关键字四类。 1 数据类型关键字(12个): (1) char :声明字符型变量或函数 (2) double :声明双精度变量或函数 (3) enum :声明枚举类型 (4) float:声明浮点型变量或函数 (5) int:声明整型变量或函数 (6) long :声明长整型变量或函数 (7) short :声明短整型变量或函数 (8) signed:声明有符号类型变量或函数 (9) struct:声明结构体变量或函数 (10) union:声明共用体(联合)数据类型 (11) unsigned:声明无符号类型变量或函数 (12) void :声明函数无返回值或无参数,声明无类型指针(基本上就这三个作用) 2控制语句关键字(12个): A循环语句 (1) for:一种循环语句(可意会不可言传) (2) do :循环语句的循环体 (3) while :循环语句的循环条件 (4) break:跳出当前循环 (5) continue:结束当前循环,开始下一轮循环 B条件语句 (1)if: 条件语句 (2)else :条件语句否定分支(与if 连用) (3)goto:无条件跳转语句 C开关语句 (1)switch :用于开关语句 (2)case:开关语句分支 (3)default:开关语句中的“其他”分支 D返回语句 return :子程序返回语句(可以带参数,也看不带参数) 3 存储类型关键字(4个) (1)auto :声明自动变量一般不使用 (2)extern:声明变量是在其他文件正声明(也可以看做是引用变量)

指针(pointer)——C_C++的精髓

(pointer)——C/C++的精髓!你不得不学好它! 指针(pointer) 指针是一种数据类型,用于存放某个变量的地址值。此时该指针被称为是指向该变量。 一个指针的类型决定于它所指向的变量的类型。 指针既可指向基本数据类型(即预定义数据类型),又可指向数组、函数、类和文件等用户自定义数据类型。 指针可以初始化为0、NULL(即0,这是标准库头文件中定义的符号化常量)或一个地址。内容为0或NULL的指针不指向任何变量,称为空指针。 例如: int a; int *ptr; 指针ptr在下式中被初始化为指向变量a。 ptr = &a; 两条语句也可组合地表示为: a = *ptr; 其中&为存地址运算符,而*则为取内容运算符。

ptr a int a, *ptr; ptr = &a; 指针与数组 数组名是一个指向该数组的常量指针(其值不能改变),也是该数组中首单元的地址值。一维数组的指针如下: int arr[5] = { 1, 3, 5, 7, 9 }; int *ptra; ptra = arr; ptra

数组指针与数组名两者的异同: (1)整型变量指针ptr与整型数组指针ptra的说明格式相同,其间空格可放可不放。 (2)arr既是数组名,又是数组地址,还是数组指针(称为常量指针),三位一体。因此arr可在一定范围内与ptra等效地使用。[ ]可在一定范围内与* 等效地使用。但arr不准重新赋值。例如: arr[0]即*arr即*ptra即ptra[0] = 1 arr[3]即*(arr+3)即*(ptra+3)即ptra[3] = 7 但arr的使用不如ptra灵活,如: 不允许*arr++,而允许*ptra++。 见以下例子:§2.2中[例1]的主程序 void main() { int arr[5] = {1, 3, 5, 7, 9}; for ( int i = 0; i < 5; i++) cout << arr[i] << endl; //数组名

sql自定义数据类型

6.2 用户自定义数据类型 6.2.1 创建用户自定义数据类型 可以使用T-SQL语句或企业管理器来完成用户自定义数据类型的创建。 1. 使用T-SQL语句 可以使用系统存储过程sp_addtype来创建用户自定义数据类型。语法是:sp_addtype type_name[,system_type] {'NULL'|'NOT NULL'|'NONULL'}-默认为'NULL' 其中: type_name为用户定义数据类型名,这个名称在数据库中必须是惟一的。 system_type 为用户定义的数据类型所基于的系统数据类型,可以包括数据的长度、精度等。当系统数据类型中包括标点符号(例如括号、逗号)时,应用引号括起来。 例如,创建一个“号码”数据类型可使用如下代码: USE 学生图书借阅管理 EXEC sp_addtype 号码,'varchar(8)','NULL' 在查询分析器中执行上述语句,结果窗口显示如下信息: (所影响的行数为1行) 类型已添加。 2. 使用企业管理器 使用企业管理器创建用户自定义数据类型的操作步骤如下: (1)在企业管理器中展开要创建用户自定义数据类型的数据库,用鼠标右键单击“用户定义的数据类型”目录,在弹出的快捷菜单中选择“新建用户定义数据类型”命令,如图6-14所示。 图6-14 新建用户自定义数据类型 (2)打开的用户自定义数据类型属性对话框如图6-15所示。在图6-15所示对话框的名

称文本框中输入用户自定义数据类型的名称,如“号码”。 图6-15 用户自定义数据类型属性对话框 图6-16 创建用户自定义数据类型“号码” (3)在图6-15所示对话框的“数据类型”下拉列表框中,选择该用户自定义数据类型所基于的系统数据类型,如varchar。 (4)如果选择的基类型是可以设定长度的(如varchar、char等),则还需要在长度文本框中设定数据类型的长度。 (5)如果允许空值,则选中“允许NULL值”复选框。 (6)如果希望该数据类型与规则或默认值捆绑,则分别在“规则”和“默认值”下拉列表框中选择要绑定的规则和默认值,否则选择“无”,如图6-16所示。规则和默认值将在 6.3节和6.4节中介绍。 (7)单击“确定”按钮,关闭对话框。 6.2.2 查看用户自定义数据类型 要查看用户自定义数据类型,可以使用sp_help 系统存储过程来查看用户自定义数据

第7章 指针数据类型及其应用

第7章指针数据类型及其应用 指针是C语言中广泛使用的一种数据类型。运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构,能很方便地使用数组和字符串,并能象汇编语言一样处理内存地址,从而编出精练而高效的程序。学习指针是学习C语言中最重要的一环,能否正确理解和使用指针是能否掌握C语言的一个标志。指针极大地丰富了C语言的功能,同时,指针也是C语言中最为困难的一部分,在学习中除了要正确理解基本概念,还必须要多编程、上机调试。只要做到这些,指针也是不难掌握的。 7.1指针的概念 在计算机中,所有的数据都是存放在存储器中的。一般把存储器中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数不等,如整型占2个单元,字符型占1个单元等。为了正确地访问这些内存单元,必须为每个内存单元编上号,根据一个内存单元的编号即可准确地找到该内存单元。内存单元的编号

也叫做地址。既然根据内存单元的编号或地址就可以找到所需的内存单元,所以通常也把这个地址称为指针。对于一个内存单元来说,单元的地址即为指针。在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。因此,一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针。 图7.1 内存单元的地址与内容 图7.1中,设有字符变量C,其内容为’K’(ASCII码为十进制数75),C占用了011A 号单元(地址用十六进数表示)。设有指针变量P,内容为011A,这种情况称为P指向变量C,或说P是指向变量C的指针。 约定:“指针”是指地址,是常量,“指针变

量”是指取值为地址的变量。但常把指针变量简称为指针。定义指针的目的是为了通过指针去访问内存单元。 7.2指针变量的定义和引用 7.2.1指针变量的定义 变量的指针就是变量的地址。在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。因此,一个指针变量的值就是某个变量的地址或称为某变量的指针。 为了表示指针变量和它所指向的变量之间的关系,在程序中用“*”符号表示“指向”,例如,i_pointer代表指针变量,而*i_pointer是i_pointer所指向的变量。如图7.2所示。 图7.2 指针变量 因此,下面两个语句作用相同:

C语言数据类型与表达式习题及答案

第一章数据类型,运算符与表达式 一.选择题 1.不合法的常量是A。 A)‘/2’B) “”C)‘’D)“483” 2. B 是C语言提供的合法的数据类型关键字。 A)Float B)signed C)integer D)Char 3.在以下各组标识符中,合法的标识符是(1)A,(2) C ,(3) D 。 (1)A)B01 B)table_1 C)0_t D)k% Int t*.1 W10 point (2)A)Fast_ B)void C)pbl D) Fast+Big abs fabs beep (3)A)xy_ B)longdouble C)*p D)CHAR 变量1 signed history Flaut 4. 不属于合法的C语言长整型常量的是 C 。 A)5876273 B)0L C)2E10 D)(long)5876273 7.下面选项中,均是合法浮点数的是 B 。 A)+1e+1 B)-0.60 C)123e D)-e3 5e-9.4 12e-4 1.2e-.4 .8e-4 03e2 -8e5 +2e-1 5.e-0 8.在C语言中,要求参加运算的数必须是整数的运算符是 C 。 A)/ B)* C)% D) = 9.在C语言中,字符型数据在内存中以 D 形式存放。 A)原码B)BCD码C)反码D)ASCII码10.下列语句中,符合语法的赋值语句是 C 。 A)a=7+b+c=a+7;B)a=7+b++=a+7; C)a=7+b,b++,a+7;D)a=7+b = c=a+7; 11. B 是非法的C语言转义字符。 A)‘\b’B)‘\0xf’C)‘\037’D)‘\’’12.对于语句:f=(3.0,4.0,5.0),(2.0,1.0,0.0);的判断中, B 是正确的。 A)语法错误B)f为5.0 C)f为0.0 D)f为2.0 13.与代数式x y u v ? ? 不等价的C语言表达式是A。 A)x*y/u*v B)x*y/u/v C)x*y/(u*v) D)x/(u*v)*y 14.在C语言中,数字029是一个 D 。 A)八进制数B)十六进制数C)十进制数D)非法数 16.对于char cx=?\039?;语句,正确的是A。 A)不合法B)cx的值是?\03? C)cx的值为四个字符D)cx的值为三个字符 17.若int k=7,x=12;则能使值为3的表达式是 D 。 A)x%=(k%=5) B)x%=(k-k%5) C)x%=k-k%5 D)(x%=k)-(k%=5) 18.为了计算s=10!(即10的阶乘),则s变量应定义为 C 。 A)int B)unsigned C)long D)以上三种类型均可

C语言基本数据类型及运算题库

第二章基本数据类型及运算 一、选择题 1. 若以下选项中的变量已正确定义,则正确的赋值语句是。 A) x1=26.8%3; B) 1+2=x2; C) x3=0x12; D) x4=1+2=3; 答案:C 2. 设变量x为float型且已经赋值,则以下语句中能够将x中的数值保留到小数点后面两位,并将第三位四舍五入的是。 A) x=x*100+0.5/100.0 B) x=(x*100+0.5)/100.0 C) x=(int)(x*100+0.5)/100.0 D) x=(x/100+0.5)*100.0 答案:C 3. 下列C语言中运算对象必须是整型的运算符是。 A) %= B) / C) = D) *= 答案:A 4. 若有以下程序段:int c1=1,c2=2,c3;c3=1.0/c2*c1;则执行后,c3中的值是。 A) 0 B) 0.5 C) 1 D) 2 答案:A 5. 设x和y均为int型变量,则以下语句:x+=y; y=x-y; x-=y; 的功能是。 A) 把x和y按从大到小排列 B) 把x和y按从小到大排列 C) 无确定结果 D) 交换x和y中的值 答案:D 6. 下列变量定义中合法的是。 A)short_a=1-.le-1; B)double b=1+5e2.5; C)long do=0xfdaL; D)float 2_and=1-e-3; 答案:A 7. 以下4个选项中,不能被看作是一条语句的是。 A) {;} B) a=0,b=0,c=0; C) if (a>0); D) if (b==0)m=1;n=2; 答案:D 8. 设x=1,y=-1,下列表达式中解为8的是。 A)x&y B)~x│x C)x^x D)x<<=3 答案:D 9. 在C语言中不合法的整数是。 A)20 B)0x4001 C)08 D)0x12ed 答案: C 10. 以下选项中不正确的实型常量是 A)2.607E-1 B)0.8103e0.2 C)-77.77 D)456e –2 答案:B) 11.若变量已正确定义并赋值,符合C语言语法的表达式是 A)a=a+7 B)a=7+b+c,a++ C)int(12.3%4) D)a=a+7=c+b 答案:B) 12.以下十六进制数中不合法的是 A)oxff B)0Xabc C)0x11 D)0x19

相关文档
最新文档