实现多态.
程序代码:
/*
标准库文件ctype.h描述的各种字符分类函数。这些函数很简单,它们对满足条件的字符返回非0值,
否则返回0值。下面是有关函数:
isalpha(c)
c是字母字符
isdigit(c)
c是数字字符
isalnum(c)
c是字母或数字字符
isspace(c)
c是空格、制表符、换行符
isupper(c)
c是大写字母
islower(c)
c是小写字母
iscntrl(c)
c是控制字符
isprint(c)
c是可打印字符,包括空格
isgraph(c)
c是可打印字符,不包括空格
isxdigit(c)
c是十六进制数字字符
ispunct(c)
c是标点符号
*/
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
typedef int (*typefun)(int);
typefun* ctype[]={isalpha,
isdigit,
isalnum,
isspace,
isupper,
islower,
iscntrl,
isprint,
isgraph,
isxdigit,
ispunct
};
typedef enum {is_alpha,
is_digit,
is_alnum,
is_space,
is_upper,
is_lower,
is_cntrl,
is_print,
is_graph,
is_xdigit,
is_punct,
}types;
int gettype(char str, types type);
int main(void)
{
printf("%d",gettype('1',is_digit));
printf("%d",gettype('a',4));
system("pause");
return 0;
}
int gettype(char str, types type)
{
typefun* mytype=ctype;
return mytype[type](str);
}
标准库文件ctype.h描述的各种字符分类函数。这些函数很简单,它们对满足条件的字符返回非0值,
否则返回0值。下面是有关函数:
isalpha(c)
c是字母字符
isdigit(c)
c是数字字符
isalnum(c)
c是字母或数字字符
isspace(c)
c是空格、制表符、换行符
isupper(c)
c是大写字母
islower(c)
c是小写字母
iscntrl(c)
c是控制字符
isprint(c)
c是可打印字符,包括空格
isgraph(c)
c是可打印字符,不包括空格
isxdigit(c)
c是十六进制数字字符
ispunct(c)
c是标点符号
*/
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
typedef int (*typefun)(int);
typefun* ctype[]={isalpha,
isdigit,
isalnum,
isspace,
isupper,
islower,
iscntrl,
isprint,
isgraph,
isxdigit,
ispunct
};
typedef enum {is_alpha,
is_digit,
is_alnum,
is_space,
is_upper,
is_lower,
is_cntrl,
is_print,
is_graph,
is_xdigit,
is_punct,
}types;
int gettype(char str, types type);
int main(void)
{
printf("%d",gettype('1',is_digit));
printf("%d",gettype('a',4));
system("pause");
return 0;
}
int gettype(char str, types type)
{
typefun* mytype=ctype;
return mytype[type](str);
}
搜索更多相关的解决方案:
多态
----------------解决方案--------------------------------------------------------
呵呵,这个函数可以这么用
int i;
for(i=0;i<11;i++)
if(gettype(ch,i))break;
----------------解决方案--------------------------------------------------------
----------------解决方案--------------------------------------------------------
知音少之又少啊...
----------------解决方案--------------------------------------------------------
这样容易反而麻烦,并且有一定问题存在。
----------------解决方案--------------------------------------------------------
/* 比较适合多源文件编译的代码,并写头文件 */
/* 修改的以前写的代码,好像有点无聊,以后再写好点 */
//---------------------------------//
/* 简单的队列程序 */
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#define QUEUEMAX 100 // 队列最大长度
typedef struct {
int data;
int pri;
} Item;
typedef struct node
{
Item item;
struct node * next;
} Node;
typedef struct queue
{
Node * front;
Node * rear;
int count;
} Queue;
//---------------------------------------------//
int Itin(Queue * pq); // 初始化
int FullQueue(Queue * pq); // 队列是否已满
int EmptyQueue(Queue * pq); // 队列是否为空
int QueueCount(Queue * pq); // 返回队列长度
int DelQueue(Queue * pq, Item * item); // 删除节点
int AddQueue(Queue * pq, Item * item); // 添加节点
int EndQueue(Queue * pq); // 结束,删除所有节点
//---------------------------------------------//
typedef int (* Fun_A)(Queue *); [color=Blue]/* 函数指针类型 */
typedef int (* Fun_B)(Queue *, Item *); /* 函数指针类型 */
Queue queue_at;
struct Queue_fun{
Item item;
Queue * list;
Fun_A itin;
Fun_A full;
Fun_A empty;
Fun_A count;
Fun_A end;
Fun_B add;
Fun_B del;
};
struct Queue_fun Qfun = { /* 包含需要用到的函数的结构 */
0, 0,
&queue_at, Itin, FullQueue, EmptyQueue, QueueCount,
EndQueue, AddQueue, DelQueue
};[/color]
//----------------------------------------------//
int main(void)
{
int k;
extern struct Queue_fun Qfun; // 引用声明
Qfun.itin(Qfun.list);
do{
do{
fputs("Input data: ", stdout);
k = scanf("%d", &Qfun.item.data);
while(getchar() != '\n')
continue;
}while(k != 1);
do{
fputs("Input pri: ", stdout);
k = scanf("%d", &Qfun.item.pri);
while(getchar() != '\n')
continue;
}while(k != 1);
Qfun.add(Qfun.list, &Qfun.item);
do{
fputs("是否结束添加 [Y/N]... ", stdout);
k = getchar();
if(k != '\n')
while(getchar() != '\n')
continue;
k = tolower(k);
}while(k != 'y' && k != 'n');
}while(k != 'n' && !Qfun.full(Qfun.list) );
while(Qfun.del(Qfun.list, &Qfun.item) )
{
printf("data: %d par: %d\n", Qfun.item.data, Qfun.item.pri);
}
getchar();
return 0;
}
//---------------------------------------------//
int Itin(Queue * pq) // 初始化队列 */
{
pq->front = pq->rear = NULL;
pq->count = 0;
return 1;
}
int FullQueue(Queue * pq) // 队列是否已满
{
return (pq->count >= QUEUEMAX);
}
int EmptyQueue(Queue * pq) // 队列是否为空
{
return (pq->count == 0);
}
int QueueCount(Queue * pq) // 返回队列长度
{
return pq->count;
}
int DelQueue(Queue * pq, Item * item) // 删除节点
{
Node * temp;
if(EmptyQueue(pq))
return 0;
*item = pq->front->item;
temp = pq->front;
pq->front = pq->front->next;
free(temp);
pq->count--;
if(pq->count == 0)
pq->rear = NULL;
return 1;
}
int AddQueue(Queue * pq, Item * item) // 添加节点
{
Node * qnew = NULL;
if(FullQueue(pq))
return 0;
qnew = (Node *)malloc(sizeof(Node));
if(qnew == NULL)
{
fputs("无法分配足够内存!\n", stderr);
exit(1);
}
qnew->next = NULL;
qnew->item = * item;
if(EmptyQueue(pq))
{
pq->front = qnew;
pq->rear = qnew;
}
else
{
pq->rear->next = qnew;
pq->rear = qnew;
}
pq->count++;
return 1;
}
int EndQueue(Queue * pq) // 结束,删除所有节点
{
Item * p;
while(DelQueue(pq, p));
return 1;
}
[[italic] 本帖最后由 cosdos 于 2008-1-2 20:58 编辑 [/italic]]
----------------解决方案--------------------------------------------------------
知音难觅呀!
----------------解决方案--------------------------------------------------------