| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3953 人关注过本帖, 1 人收藏
标题:数据抽象
只看楼主 加入收藏
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
回复 10楼 pangding

我也没什么可推荐的,到书店随便翻了翻书,感觉都大同小异,于是挑了文风、装订合我口味的。

回复 11楼 lz1091914999

我查了下Qt的资料,看起来确实不错,算是可移植的C++平台,还是开源的。你喜欢就好,希望你用的开心,用出心得。工具不一定要掌握得多,但一定要用的顺手。

重剑无锋,大巧不工
2012-02-06 23:49
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
回复 11楼 beyondyf
恩,不过一个人学英文真的是很难,加上我自己记性差,唉不知道什么时候才能学会啊?这跟以前学编程的时候不一样啊,可能就是不能马上看到效果吧,而编程就能马上看到效果,呵呵。

My life is brilliant
2012-02-06 23:59
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
回复 12楼 lz1091914999
背单词的话,收效还是挺快的。我只比较集中的背过两次单词(每次大概背了两三个月),基本上看文章就轻松多了。
感觉基本上有5000+左右的词,就可以应付很多应用性的文章了。你会的词能覆盖你需要看的文章的80%左右,看的时候就不会很累,很多东西靠逻辑能连蒙带猜,基本不会理解偏差得太多。

如果你需要看的只是计算机类的书籍(或者是某个专业的技术手册),那都不用背什么单词,初中的英语水平就够,看就行了。重要的是要耐下性子。
你肯定不能拿你平时的看书速度比,一开始的时候可能会发现看的比较累,而且看了一周也可能只看了一两章,这都不要紧。根据我的经验,像这种技术书籍只要能看完前三四章(一般都是介绍基础的),基本上该会的单词就都会了,后面看的会比前面顺很多。
2012-02-07 00:21
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
回复 13楼 pangding
Thank you very much!

My life is brilliant
2012-02-07 00:29
smallmoon521
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:517
专家分:1373
注 册:2008-4-21
收藏
得分:13 
顶起
这种好贴太少了
Qt前两天玩了玩,只停在界面级,没深研究,呵呵,我也觉得Qt不错

为游戏狂~~!!    大家努力编哈!
2012-02-07 09:04
hnuhsg1226
Rank: 9Rank: 9Rank: 9
来 自:中国
等 级:蜘蛛侠
威 望:2
帖 子:314
专家分:1314
注 册:2011-3-27
收藏
得分:13 
竟然进来了,顶贴一下

我的地盘
2012-02-07 10:07
爱德华
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:2
帖 子:183
专家分:536
注 册:2011-5-29
收藏
得分:13 
顶帖+学习

算法,数据结构,windows核心编程.
2012-02-07 10:15
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:13 
软件工程有个名词叫做 抽象数据类型(ADT),其主要特点就是 只通过接口仿问变量,
刚好 c++的 类 适合实现 ADT,c 语言也可以实现 ADT,当然也可以面向对象...

得区别什么时候用 数据类型?什么时候用 抽像数据类型?

[ 本帖最后由 BlueGuy 于 2012-2-7 11:31 编辑 ]

我就是真命天子,顺我者生,逆我者死!
2012-02-07 11:28
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
回复 18楼 BlueGuy
其实C那么容易出错的很大一部分原因都是没有得到恰当的初始化造成的,因为我们可能使用到一个未知的内存块,造成段错误,并且稍加修改就能产生这样一个版本:
程序代码:
/**

 * Stack2.h

 * Code by Kenier Lee.

 */

#ifndef _KENIER_LEE_STACK_H
#define _KENIER_LEE_STACK_H

#define STACK_SIZE 1024 /* Size of the Stack */

typedef struct StackTag Stack; /* Prepare type definition */

struct StackTag {
   int  storage[STACK_SIZE];  /* Array of int */
   int* tp;                   /* Top pointer */

   void (*Push)(Stack*, int);
   int  (*Pop)(Stack*);
   int  (*Peek)(Stack*);
   int  (*GetSize)(Stack*);
   int* (*GetTopPointer)(Stack*);
   int* (*GetBottomPointer)(Stack*);
};

void InitStack(Stack*);

#endif /* _KENIER_LEE_STACK_H */

/**

 * Stack2.c

 * Code by Kenier Lee.

 */

#include "Stack2.h"
#include <stdio.h>

void Push(Stack*, int);
int  Pop(Stack*);
int  Peek(Stack*);
int  GetSize(Stack*);
int* GetTopPointer(Stack*);
int* GetBottomPointer(Stack*);

void InitStack(Stack* stack) {
   stack->tp               = stack->storage;
   stack->Push             = Push;
   stack->Pop              = Pop;
   stack->Peek             = Peek;
   stack->GetSize          = GetSize;
   stack->GetTopPointer    = GetTopPointer;
   stack->GetBottomPointer = GetBottomPointer;
}

void Push(Stack* stack, int value) {
   int size = GetSize(stack);
   if (size == STACK_SIZE) /* Full */
      printf("Error: The stack is full.\n");
   else
      *stack->tp++ = value;
}

int Pop(Stack* stack) {
   int value = 0;
   if (stack->tp == stack->storage) /* Empty */
      printf("Error: The stack is empty.\n");
   else
      value = *--stack->tp;
   return value;
}

int Peek(Stack* stack) {
   int value = 0;
   if (stack->tp == stack->storage) /* Empty */
      printf("Error: The stack is empty.\n");
   else
      value = *stack->tp;
   return value;
}

int GetSize(Stack* stack) {
   return stack->tp - stack->storage;
}

int* GetTopPointer(Stack* stack) {
   return stack->tp;
}

int* GetBottomPointer(Stack* stack) {
   return stack->storage;
}

/**

 * Stack2Test.c

 * Code by Kenier Lee.

 */

#include "Stack2.h"
#include <stdio.h>

int main(void) {
   Stack stack;
   int i, *tPointer, *bPointer;

   InitStack(&stack); // (1)

   for (i = 0; i < 10; ++i)
      stack.Push(&stack, i);
   for (i = 0; i < 10; ++i)
      printf("%d ", stack.Pop(&stack));
   printf("\n");

   for (i = 0; i < 10; ++i)
      stack.Push(&stack, i);
   printf("Sizeof stack: %d\n", stack.GetSize(&stack));
   tPointer = stack.GetTopPointer(&stack);
   bPointer = stack.GetBottomPointer(&stack);
   while (bPointer != tPointer)
      printf("%d ", *bPointer++);
   printf("\n");

   bPointer = stack.GetBottomPointer(&stack);
   while (tPointer != bPointer)
      printf("%d ", *--tPointer);
   printf("\n");

   for (i = 0; i < 10; ++i)
      printf("%d ", stack.Pop(&stack));
   printf("\n");
   printf("%d\n", stack.Pop(&stack));
   printf("%d\n", stack.Peek(&stack));

   return 0;
} /* Output:
9 8 7 6 5 4 3 2 1 0
Sizeof stack: 10
0 1 2 3 4 5 6 7 8 9
9 8 7 6 5 4 3 2 1 0
9 8 7 6 5 4 3 2 1 0
Error: The stack is empty.
0
Error: The stack is empty.
0

*/
这里把函数与自定义数据类型绑定在了一起,看起来非常成功,但这里有几个危险:
1、(1)这句话在任何时候都有可能被遗忘,我以前也经常这样,导致我几天都没找到问题所在。。。
2、tp的值可能被修改,特别是那些认为自己聪明的程序员,想利用它达到某些特殊的效果。
还有很多程序员不愿意使用stack.GetTopPointer和stack.GetBottomPointer来获得顶和底指针,而喜欢直接用stack.tp和stack.storage,看起来没有任何错误,因为这两个字段可以直接使用,而且节省函数调用开销。想一想,如果有一点我修改了实现,我认为用tp作为栈顶指针的名字是不好的,storage也如此,那么任何直接使用了tp和storage的代码都需要重新修改。并且我认为C并不能做到面向对象,只能做到不完全的基于对象。

My life is brilliant
2012-02-07 12:39
吴小君
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:102
专家分:198
注 册:2012-1-2
收藏
得分:13 
膜拜一下

小弟学习C语言刚入门,请大侠们多多指教,不吝赐解!
2012-02-07 13:55
快速回复:数据抽象
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018024 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved