长的上面写汉字数字的纸牌屋结局是什么是什么

【100题】第六十六~第七十题(颠倒栈、扑克顺子和掷骰子概率、数字数组排成最小数、求旋转数组中最小值、全排列)_【OpenGL游戏开发之5】freetype2 显示汉字_卡尔.波普尔提要: 民主与专制__脚本百事通
稍等,加载中……
^_^请注意,有可能下面的2篇文章才是您想要的内容:
【100题】第六十六~第七十题(颠倒栈、扑克顺子和掷骰子概率、数字数组排成最小数、求旋转数组中最小值、全排列)
【OpenGL游戏开发之5】freetype2 显示汉字
卡尔.波普尔提要: 民主与专制
【100题】第六十六~第七十题(颠倒栈、扑克顺子和掷骰子概率、数字数组排成最小数、求旋转数组中最小值、全排列)
【100题】第六十六~第七十题(颠倒栈、扑克牌顺子和掷骰子概率、数字数组排成最小数、求旋转数组中最小值、全排列)
一,颠倒栈。
1)题目:用递归颠倒一个栈。例如输入栈{1, 2, 3, 4, 5},1在栈顶。颠倒之后的栈为{5,
4, 3, 2, 1},5处在栈顶。
2)分析:乍一看到这道题目,第一反应是把栈里的所有元素逐一pop出来,放到一个数组里,然后在数组里颠倒所有元素,最后把数组中的所有元素逐一push进入栈。这时栈也就颠倒过来了。颠倒一个数组是一件很容易的事情。不过这种思路需要显示分配一个长度为O(n)的数组,而且也没有充分利用递归的特性。
我们再来考虑怎么递归。我们把栈{1, 2, 3, 4, 5}看成由两部分组成:栈顶元素1和剩下的部分{2,
3, 4, 5}。如果我们能把{2,
3, 4, 5}颠倒过来,变成{5,
4, 3, 2},然后在把原来的栈顶元素1放到底部,那么就整个栈就颠倒过来了,变成{5,
4, 3, 2, 1}。
接下来我们需要考虑两件事情:一是如何把{2, 3, 4, 5}颠倒过来变成{5,
4, 3, 2}。我们只要把{2,
3, 4, 5}看成由两部分组成:栈顶元素2和剩下的部分{3,
4, 5}。我们只要把{3,
4, 5}先颠倒过来变成{5,
4, 3},然后再把之前的栈顶元素2放到最底部,也就变成了{5,
4, 3, 2}。
至于怎么把{3, 4, 5}颠倒过来……很多读者可能都想到这就是递归。也就是每一次试图颠倒一个栈的时候,现在栈顶元素pop出来,再颠倒剩下的元素组成的栈,最后把之前的栈顶元素放到剩下元素组成的栈的底部。递归结束的条件是剩下的栈已经空了。这种思路的代码如下:
template&typenameT&voidReverseStack(std::stack&T&&
if(!stack.empty())
top = stack.top();
stack.pop();
ReverseStack(stack);
AddToStackBottom(stack,
我们需要考虑的另外一件事情是如何把一个元素e放到一个栈的底部,也就是如何实现AddToStackBottom。这件事情不难,只需要把栈里原有的元素逐一pop出来。当栈为空的时候,push元素e进栈,此时它就位于栈的底部了。然后再把栈里原有的元素按照pop相反的顺序逐一push进栈。
注意到我们在push元素e之前,我们已经把栈里原有的所有元素都pop出来了,我们需要把它们保存起来,以便之后能把他们再push回去。我们当然可以开辟一个数组来做,但这没有必要。由于我们可以用递归来做这件事情,而递归本身就是一个栈结构。我们可以用递归的栈来保存这些元素。
基于如上分析,我们可以写出AddToStackBottom的代码:
// Add an element to the bottom of a stack:
template&typenameT&voidAddToStackBottom(std::stack&T&&
stack, T t)
if(stack.empty())
stack.push(t);
top = stack.top();
stack.pop();
AddToStackBottom(stack,
stack.push(top);
先弹出,处理,再恢复,化作子问题的一个重要方式
#include &iostream&
#include &stack&
template&typename T&
void ReverseStack(stack&T&& stack)
if(!stack.empty())
T top = stack.top();//Pop the top element
stack.pop();
ReverseStack(stack); // Reverse the remaining stack
AddToStackBottom(stack, top); //Add the top element to the bottom of the remaining stack
template&typename T&
void AddToStackBottom(stack&T&& stack, T t)
if(stack.empty())
stack.push(t);
T top = stack.top();
stack.pop();
AddToStackBottom(stack, t);
stack.push(top);
void print(stack&int& mystack)
while(mystack.size())
cout&&mystack.top()&&" ";
mystack.pop();
int main()
stack&int&
mystack.push(1);
mystack.push(2);
mystack.push(3);
mystack.push(4);
mystack.push(5);
print(mystack);
printf("\n");
ReverseStack(mystack);
printf("\n");
print(mystack);
二,扑克牌和掷骰子
1)题目:扑克牌的顺子
从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2-10 为数字本身,A 为1,J为11,Q
为12,K 为13,而大小王可以看成任意数字。
思路一:排序法,其中大小王看成0。然后,统计0个数,和数字间隔数,如果有重复(对子)则返回失败。间隔数小于等于2则成功,否则失败。
思路二:Hash法,类似排序。
注意:sort(int array[],array+nLength,comp); //注意添加 &algorithm&
qsort(int array[],nLength,sizeof(array[0]),compare); //自带的
#include &iostream&
#include &algorithm&
//函数功能 : 从扑克牌中随机抽5张牌,判断是不是一个顺子
//函数参数 : pCards为牌,nLen为牌的张数
//返回值 :
int comb(const int *x,const int *y)
return x&y;
int cmp(const void *x,const void *y)
return *(int *)x - *(int *)y;
bool IsContinuous(int *pCards, int nLen)
if(pCards == NULL || nLen &= 0)
// sort(pCards, pCards + nLen,comb); //调用标准库的排序算法
qsort(pCards,nLen,sizeof(pCards[0]),cmp);
//for(int i=0;i&nL++i)
cout&&pCards[i]&&" ";
int zeroCount = 0;
//大小王用0表示
int capCount = 0;
//统计0的个数
for(i = 0; i & nL i++)
if(pCards[i] == 0)
zeroCount++;
//统计间隔数
int preCard = pCards[i];
for(i = i + 1; i & nL i++)
int curCard = pCards[i];
if(preCard == curCard)
//与前一张牌比较
capCount += curCard - preCard - 1; //累加间隔数
preCard = curC
return (zeroCount &= capCount)? true: //只要王的个数大于间隔数
int main()
int pCards[]={1,2,3,4,5};
int pCards2[]={1,2,8,4,12};
int i=IsContinuous(pCards,5);
bool j=IsContinuous(pCards2,5);
1)题目:n
个骰子的点数。把n 个骰子扔在地上,所有骰子朝上一面的点数之和为S。输入n,
用PN,S来表示N个骰子,顶面数字之和为S出现的概率,则:
PN,S=aN,S/6^N
其中aN,S为N个骰子顶面数之和为S的状态的数量,6^N为总的状态数量,因为每个骰子有6种状态,N个骰子组成的状态数就是6^N。
下面给出求ai,j的递推公式,即求i(1=&i&=N)个骰子顶面数之和为j(i=&j&=6*i)时的状态数量:
ai,j= ai-1,j-1//第i个骰子顶面为1时,其他i-1个骰子顶面数之和为j-1时的状态数量
+ ai-1,j-2 //第i个骰子顶面为2时,其他i-1个骰子顶面数之和为j-2时的状态数量
+ ai-1,j-3 //第i个骰子顶面为3时,其他i-1个骰子顶面数之和为j-3时的状态数量
+ ai-1,j-4 //第i个骰子顶面为4时,其他i-1个骰子顶面数之和为j-4时的状态数量
+ ai-1,j-5 //第i个骰子顶面为5时,其他i-1个骰子顶面数之和为j-5时的状态数量
+ ai-1,j-6 //第i个骰子顶面为6时,其他i-1个骰子顶面数之和为j-6时的状态数量
其中递推公式中i&1。
对于任意的1=&i&=N,j&=0或j&i或j&6*i,ai,j=0。
非递归求解:
#include &iostream&
#include &math.h&
void PrintSumProbabilityOfDices(unsigned int n)
const unsigned int MAX=12;
//max number of dices
printf("Overflow!\n");
unsigned int a[MAX+1][6*MAX+1];
unsigned int i,j,k;
memset(a,0,sizeof(a));
/* a[i][j]
i代表骰子个数
j代表 i个骰子可能出现的骰子的数量
for(j=1;j&=6;j++)//只有一个骰子的时候,每一个数出现的次数都是 1
a[1][j]=1;
for(i=2;i&=n;i++) //第 i个 骰子出现
for(j=i;j&=6*i;j++)
//j为所有骰子可以出现的次数
a[i][j]=0; //初始化要求的 数
for(k=1;k&=6&&k&=j;k++)
//k代表 第 i个骰子出现的可能点数
k&=j 说明 不能超过当前所求所有骰子 总点数
a[i][j]+=a[i-1][j-k];
//其他 i-1个骰子 出现j-k 点的次数
unsigned int nTotal=pow(6,n);
for(i=n;i&=6*n;i++)
printf("Sum=%d,Probability=%.15lf\n",i,a[n][i]*1.0/nTotal);
int main()
PrintSumProbabilityOfDices(2);
三,把数组排成最小的数。【经典牛逼的题】
1)题目:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。
例如:输入数组{32, 321},则输出这两个能排成的最小数字32132。
请给出解决问题的算法,并证明该算法。
2)分析:这是09
年6 月份百度的一道面试题,
思路:根据“字典序”排序,先比较整数中第一个数字,然后再比较第二个,直到所有数都成字典序排列。
【很遗憾】这个是不可行的,比如32的字典序比322小,但是3大
那该如何是好?
主要是根据题目要求,先排列好顺序,然后按照顺序输出每个数。根据“字典序”排序已经被排除了,那么如何选择排序规则呢?
【巧妙】所以在这里自定义一个比较大小的函数,比较两个字符串s1, s2大小的时候,先将它们拼接起来,比较s1+s2,和s2+s1那个大,如果s1+s2大,那说明s2应该放前面,所以按这个规则,s2就应该排在s1前面。
如果用char *表示字符串,那就可以使用qsort函数进行排序了,我这里用的是string,所以自定义了一个最简单的冒泡排序。
注意,int 转换为 string
#include&iostream&
#include&algorithm&
#include&string&
#include&sstream&
int compare1(string str1,string str2)//user defined compare function
string tmp1 = str1.append(str2);
string tmp2 = str2.append(str1);
pare(tmp2)&=0)//tmp1 & tmp2
void sort(string str[],int len)//Bubble sort
for(int i=i&0;i--)
int exchange=0;
for(int j=0;j&i;j++)
if(compare1(str[j],str[j+1]))
string tmp = str[j];
str[j] = str[j+1];
str[j+1] =
exchange=1;
if(exchange==0)
int main()
int num[] = {332,41,322,32,414,4};
int len = sizeof(num)/sizeof(int);
//string *word = new string[len];
string word[len];
for(int i=0;i&i++)//convert int to string
sst&&num[i];
sst&&word[i];
sst.clear();
/* 第二种方法 将int 变为 string
sprintf(temp,"%d",num[i]);
string str(temp);
/* 第三种方法 将 int 变为 string
itoa(num[i],temp,10);
string str(temp);
sort(word,len);//Bubble sort array of string by the rule defined by compare1
for(int i=0;i&i++)
cout&&word[i];
getchar();
四,旋转数组中的最小元素。
1)题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排好序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。
2)分析:这道题最直观的解法并不难。从头到尾遍历数组一次,就能找出最小的元素,时间复杂度显然是O(N)。
二分查找法,这道题类似于“在已排序数组,旋转后,再查找某个数”这道题。
中值 & 数组开始 则 在右侧查找
3, 4, 5, 1, 2
中值 & 数组开始 则 在左侧查找(含中值) 4, 5,
退出条件:仅仅剩余一个值或者为顺序数组则取最小值
#include &iostream&
int helper(int a[], int s, int t)
if (s == t || a[s] & a[t])
return a[s];
int m = s + (t-s)/2;
if (a[s]&a[m]) //中值小
return helper(a, s, m);
return helper(a, m+1, t);
int main()
int a[]={3,4,5,1,2};
int result=helper(a, 0, 4);
cout&&result&&
下面的源码为自己原始代码,有些地方多考虑了,注意观察
注意:除以2 为右移 1 位
#include&iostream&
int GetMinNum(int num[],int begin,int end)
if(begin==end ||num[begin]&num[end])
return num[begin];
int mid=begin +(end-begin)&&1;
if(num[mid]&num[begin]) //右侧
return min(GetMinNum(num,mid+1,end) , num[begin]);
return min(GetMinNum(num,0,mid) , num[mid+1]);
int main()
int num[] = {3,4,5,1,2};
int MinNum=GetMinNum(num,0,4);
cout&&MinNum&&
getchar();
五,给出一个函数来输出一个字符串的所有排列。参考
1) 每个元素依次放到首位,然后对其余元素递归
2) 当当前元素到达末尾的时候,输出该序列
相当于strlen(str)层循环,每层strlen(str)次。
源码一:注意应要使用数组参数char
str[],而不是用变量char
注意for 循环,第一个是 s ,就是说从第一个开始交换
&iostream&
void MySort(char str[],int s,int e)
cout&&str&&
for(int i=s;i&e;++i)
swap(str[s],str[i]);
MySort(str,s+1,e);
swap(str[s],str[i]);
int main()
char str[]="abc";
MySort(str,0,3);
如果不是求字符的所有排列,而是求字符的所有组合,应该怎么办呢?(P72)
思路:这里不采用交换方式,而是采用删减的方式。采用不同的剔除顺序,并用prex保留删减值,这样将得到所有符合条件的序列
&iostream&
void MySort(string str,string prex)
string temp=
cout&&prex&&
//注意这里输出
for(int i=0;i&str.length();++i)
MySort(str.erase(i,1),prex+str.at(i)); //注意这里处理
int main()
string str ="abc";
MySort(str,"");
【OpenGL游戏开发之5】freetype2 显示汉字
【OpenGL游戏开发之五】freetype2 显示汉字1.FreeType2 是什么?
它是一个为各种应用程序提供通用的字体文件访问的软件包。尤其值得注意的以下特性:
提供统一的字体文件访问接口。支持位图和向量格式,包括 TrueType 、 OpenType 、 Typel 、 CID 、 CFF 、 Windows FON/FNT 、 X11 PCF 。
提供高效反走样的基于 256 灰度级的位图字形的生产。
模块清晰,每种字体格式对于一个模块。类库的构建可以按照你需要支持的格式进行裁减以减小代码尺寸。(最小的反走样 FreeType 库 &30Kb )
2. FreeType2 能做什么?
FT2 已经易用于许多领域。例如:
图形子系统和文本显示库
文本排版(布局、分页、渲染)
字体识别和转换工具
一般来说,该库使得你能轻松的操纵字体文件。
3.如何配置opengl,freetype2
4.freetype2 显示汉字
#include &Windows.h&
#include &iostream&
#include &Gl\GL.h&
#include &Gl\glut.h&
#include &ft2build.h&
#include &freetype/freetype.h&
#include &freetype/ftglyph.h&
#include &freetype/ftoutln.h&
#include &freetype/fttrigon.h&
//#pragma comment(lib , "lib/glut32.lib")
//#pragma comment(lib , "lib/freetype2110.lib")
#define MAX_NO_TEXTURES 1
#define CUBE_TEXTURE 0
GLuint texture_id[MAX_NO_TEXTURES];
struct xCharTexture
wchar_t m_chaID;
m_delta_x;
m_delta_y;
xCharTexture()
m_Height = 0;
}g_TexID[65536];
class xFreeTypeLib
FT_Library m_FT2L
void load(const char* font_file , int _w , int _h);
GLuint loadChar(wchar_t ch);
void xFreeTypeLib::load(const char* font_file , int _w , int _h)
if (FT_Init_FreeType( &library) )
//加载一个字体,取默认的Face,一般为Regualer
if (FT_New_Face( library, font_file, 0, &m_FT_Face ))
//选择字符表
FT_Select_Charmap(m_FT_Face, FT_ENCODING_UNICODE);
m_w = _ m_h = _h;
m_FT_Face-&num_fixed_
//大小要乘64.这是规定。照做就可以了。
//FT_Set_Char_Size( m_FT_Face , 0 , m_w && 6, 96, 96);
//用来存放指定字符宽度和高度的特定数据
FT_Set_Pixel_Sizes(m_FT_Face,m_w, m_h);
GLuint xFreeTypeLib::loadChar(wchar_t ch)
if(g_TexID[ch].m_texID)
return g_TexID[ch].m_texID;
/* 装载字形图像到字形槽(将会抹掉先前的字形图像) */
if(FT_Load_Char(m_FT_Face, ch, /*FT_LOAD_RENDER|*/FT_LOAD_FORCE_AUTOHINT|
(TRUE ? FT_LOAD_TARGET_NORMAL : FT_LOAD_MONOCHROME | FT_LOAD_TARGET_MONO) )
/*if(FT_Load_Glyph( m_FT_Face, FT_Get_Char_Index( m_FT_Face, ch ), FT_LOAD_FORCE_AUTOHINT ))
throw std::runtime_error("FT_Load_Glyph failed");*/
xCharTexture& charTex = g_TexID[ch];
//得到字模
//把字形图像从字形槽复制到新的FT_Glyph对象glyph中。这个函数返回一个错误码并且设置glyph。
if(FT_Get_Glyph( m_FT_Face-&glyph, &glyph ))
//转化成位图
FT_Render_Glyph( m_FT_Face-&glyph,
FT_RENDER_MODE_LCD );//FT_RENDER_MODE_NORMAL
FT_Glyph_To_Bitmap( &glyph, ft_render_mode_normal, 0, 1 );
FT_BitmapGlyph bitmap_glyph = (FT_BitmapGlyph)
//取道位图数据
FT_Bitmap& bitmap=bitmap_glyph-&
//把位图数据拷贝自己定义的数据区里.这样旧可以画到需要的东西上面了。
int height =
m_FT_Face-&size-&metrics.y_
//伸缩距离到设备空间
m_FT_Face-&glyph-&metrics.horiA
//水平文本排列
charTex.m_Width =
charTex.m_Height =
charTex.m_adv_x = m_FT_Face-&glyph-&advance.x / 64.0f;
//步进宽度
charTex.m_adv_y = m_FT_Face-&size-&metrics.y_
//m_FT_Face-&glyph-&metrics.horiBearingY / 64.0f;
charTex.m_delta_x = (float)bitmap_glyph-&
//left:字形原点(0,0)到字形位图最左边象素的水平距离.它以整数象素的形式表示。
charTex.m_delta_y = (float)bitmap_glyph-&top - //Top: 类似于字形槽的bitmap_top字段。
glGenTextures(1,&charTex.m_texID);
glBindTexture(GL_TEXTURE_2D,charTex.m_texID);
char* pBuf = new char[width * height * 4];
for(int j=0; j
for(int i=0; i & i++)
unsigned char _vl =
(i&=bitmap.width || j&=bitmap.rows) ? 0 : bitmap.buffer[i + bitmap.width*j];
pBuf[(4*i + (height - j - 1) * width * 4)
pBuf[(4*i + (height - j - 1) * width * 4)+1] = 0xFF;
pBuf[(4*i + (height - j - 1) * width * 4)+2] = 0xFF;
pBuf[(4*i + (height - j - 1) * width * 4)+3] = _
glTexImage2D( GL_TEXTURE_2D,0,GL_RGBA,width, height,0,GL_RGBA,GL_UNSIGNED_BYTE,pBuf);
//指定一个二维的纹理图片
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S, GL_CLAMP);
//glTexParameteri():纹理过滤
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
glTexEnvi(GL_TEXTURE_2D,GL_TEXTURE_ENV_MODE,GL_REPLACE);
//纹理进行混合
/*gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, width, height, GL_RGBA, GL_UNSIGNED_BYTE, pBuf);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
glTexEnvi(GL_TEXTURE_2D,GL_TEXTURE_ENV_MODE,GL_REPLACE);*/
delete[] pB
return charTex.m_chaID;
xFreeTypeLib g_FreeTypeL
xCharTexture* getTextChar(wchar_t ch)
g_FreeTypeLib.loadChar(ch);
return &g_TexID[ch];
LPWSTR AnsiToUnicode(LPCSTR lpcstr)
//参数lpcstr类型也可是char*
i=MultiByteToWideChar(CP_ACP,0,lpcstr,-1,NULL,0);
Pwstr=new WCHAR[i];
MultiByteToWideChar(CP_ACP,0,lpcstr,-1,Pwstr,i);
return (Pwstr);
//wchar_t g_UnicodeString[]=L"aaabb/x4E2D/x/x";
const char g_UnicodeString[]="aaa VB文件格式:/n/若不明确就标为未知/n/表演者:";
void drawText(wchar_t* _strText,int x , int y, int maxW , int h)
int maxH =
size_t nLen = wcslen(_strText);
for(int i = 0 ; i &nL i ++)
if(_strText[i] =='/n')
sx = sy += maxH + 12;
xCharTexture* pCharTex = getTextChar(_strText[i]);
glBindTexture(GL_TEXTURE_2D,pCharTex-&m_texID);
//绑定到目标纹理
glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
glEnable(GL_BLEND);
//打开或关闭OpenGL的特殊功能
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
//特殊的像素算法
//glDisable(GL_TEXTURE_2D);
int w = pCharTex-&m_W
int h = pCharTex-&m_H
int ch_x = sx + pCharTex-&m_delta_x;
int ch_y = sy - h - pCharTex-&m_delta_y;
if(maxH & h) maxH =
glBegin ( GL_QUADS );
// 定义一个或一组原始的顶点
glTexCoord2f(0.0f, 1.0f); glVertex3f(ch_x
glTexCoord2f(1.0f, 1.0f); glVertex3f(ch_x +
glTexCoord2f(1.0f, 0.0f); glVertex3f(ch_x +
w, ch_y + h,
glTexCoord2f(0.0f, 0.0f); glVertex3f(ch_x
, ch_y + h,
sx += pCharTex-&m_adv_x;
if(sx & x + maxW)
sx = sy += maxH + 12;
void init(void)
glShadeModel(GL_SMOOTH|GL_FLAT);
//选择平直或平滑着色
glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
//清除色彩缓冲区
glEnable ( GL_COLOR_MATERIAL_FACE );
glColorMaterial ( GL_FRONT, GL_AMBIENT_AND_DIFFUSE ); // 使一个材质色彩指向当前的色彩
//g_FreeTypeLib.load("simhei.ttf",14,14);
// g_FreeTypeLib.load("c://windows//fonts//simhei.ttf",14,14);
g_FreeTypeLib.load("c://windows//fonts//simhei.ttf",12,12);
glDisable ( GL_CULL_FACE );
//glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
void reshape( int w, int h )
// Prevent a divide by zero, when window is too short
// (you cant make a window of zero width).
if(h == 0)
ratio = 1.0f * w /
// Reset the coordinate system before modifying
glMatrixMode(GL_PROJECTION);
//定义矩阵
glLoadIdentity();
//用恒等矩阵替换当前矩阵
// Set the viewport to be the entire window
glViewport(0, 0, w, h);
//设置视窗
glOrtho(0,w,h,0,-100,200);
//用垂直矩阵与当前矩阵相乘
// Set the clipping volume
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0, 0, 30 ,0 , 0 ,10 , 0.0f , 1.0f , 0.0f); //设定一个变换视点
void display( void )
glClearColor(0.0f , 0.0f , 0.6f , 1.0f);
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
/*glLoadIdentity ( );
glPushMatrix();
glTranslatef ( 0.0, 0.0, -5.0 );
glEnable ( GL_TEXTURE_2D );
wchar_t *wstr = AnsiToUnicode(g_UnicodeString);
drawText(wstr, 50, 50, 900,25);
//glPopMatrix();
glutSwapBuffers();
void keyboard ( unsigned char key, int x, int y )
// Create Keyboard Function
switch ( key ) {
// When Escape Is Pressed...
exit ( 0 );
// Exit The Program
// Ready For Next Case
// Now Wrap It Up
void arrow_keys ( int a_keys, int x, int y )
// Create Special Function (required for arrow keys)
switch ( a_keys ) {
case GLUT_KEY_UP:
// When Up Arrow Is Pressed...
glutFullScreen ( ); // Go Into Full Screen Mode
case GLUT_KEY_DOWN:
// When Down Arrow Is Pressed...
glutReshapeWindow ( 900, 500 );
// Go Into A 500 By 500 Window
void myDisplay(void)
glClear(GL_COLOR_BUFFER_BIT);
glColor3f (1.0,0.0,0.0);
glBegin (GL_LINES);
glVertex2i (180,15);
glVertex2i (10,145);
glRectf(-0.5f, -0.5f, 0.5f, 0.5f);
glFlush();
int main(int argc,char * argv[])
//ANSI字符串,内容长度7字节
char sz[20] = "中文123";
//UNICODE字符串,内容长度5个wchar_t(10字节)
L"/x4E2D/x/x";
//运行时设定当前ANSI编码,VC格式
setlocale(LC_ALL,".936");
//GCC中格式
setlocale(LC_ALL, "zh_CN.GBK");
//VisualC++中使用小写%s,按照setlocale指定编码输出到文件
//GCC中使用大写%S
//把UNICODE字符串按照setlocale指定的编码转换成字节
wcstombs(sz,
//把字节串按照setlocale指定的编码转换成UNICODE字符串
mbstowcs(wsz,
glutInit( &argc, argv );
//用于初始化GULT库
glutInitDisplayMode ( GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA );
//设置初始显示模式
glutInitWindowPosition (0,0);
//确定窗口的位置
glutInitWindowSize
( 900, 500 );
//设置窗口大小
glutCreateWindow
( "NeHe Lesson 6- Ported by Rustad" );
//创建一个窗口标题
//glutFullScreen
//Put Into Full Screen
glutDisplayFunc
( display ); //注册一个绘图函数
glutReshapeFunc
( reshape ); //设置投影的函数
glutKeyboardFunc
( keyboard ); //键盘回调函数
glutSpecialFunc
( arrow_keys ); //设置当前窗口的特殊键盘回调。
glutIdleFunc
( display );
//程序空闲时调用的函数
glutMainLoop
// 进入GLUT事件处理循环
运行效果图:
freetype2学习资源:
[精华] FreeType 2开发文档 [中译版]:http://www.unixresources.net/linux/clf/kylix/archive/00/00/59/21/592188.html
FreeType 2官方网:http://www.freetype.org/freetype2/
卡尔.波普尔提要: 民主与专制
卡尔.波普尔摘要: 民主与专制
波普尔避开了柏拉图的命题"谁应当统治", 而是从能否通过理性批评来改变的角度, 阐述了民主和专制的区别
波普尔:"我丝毫不想为民主下定义。此外,也并非多数人统治:任何一个政党都可能在选举中获胜,不是我也不是你进行统治。但是我应当解释一下,我区分两种政体。对于一种政体,我们可以不流血就摆脱它,对于另一种,我们不流血就不能摆脱,也许根本不能摆脱。我建议称第一种为民主,称第二种为专制
。但任何事物都不取决于词语。然而,重要的是这一点。如果一个国家拥有不使用暴力就可以改换政体的制度,而一批人因未使用暴力而没有成功就试图使用暴力,那么无论他们想的或打算的是什么,他们的行动都是建立一个由暴力维持、不用暴力就无法摆脱的政体的尝试,换言之,他们在尝试建立专制。尽管这显而易见,人们通常却没有想得这样远"
苏格拉底: "忍受不公正的行为而不做出不公正的行为"
两种对政治家的要求
苏格拉底和柏拉图都要求政治家聪明。但这对于他们各自却具有根本不同的意义。对于苏格拉底来说,它意味着政治家应充分意识到他无可争辩的无知。因此苏格拉底提倡理智的谦虚。“要有自知之明!”对他来说意味着:“要意识到你知道得何其少!”
相比之下,柏拉图把政治家应当聪明的要求解释为由聪明者统治、由智者统治的要求。只有具有良好教养的辩证学家才有资格统治。著名的柏拉图的主张,哲学家必须成为国王,国王必须成为受到充分训练的哲学家,就是这个意思。这个柏拉图学派的规定给哲学家们留下了深刻的印象;而国王,人们可以认为,却并不如此。
人们几乎想象不出比对于政治家应当聪明的要求的两种解释更大的对比。它是理智的谦虚与理智的傲慢的对比。它也是可错论——对一切人类知识的可错性的承认——和唯科学主义的对比,唯科学主义认为,应当授与知识和认知者、科学和科学家、智慧与聪明者、学问与学者以权威的理论。
由此可清楚地看到,对人类知识的评价的对比——即认识论的对比——可以导致形成对照的伦理-政治的目标和要求
政治乌托邦的危险
对政治乌托邦的信念尤其危险。这可能与这样一个事实有关,即寻求更美好的世界,像研究我们的环境一样,(如果我说得对)在所有生命本能中是最古老、最重要的。我们相信我们能够而且应该对改善我们的世界做贡献,这是正确的。但是我们不可想象我们能预见我们的计划和行动的结果。尤其不可牺牲任何人的生命(除去万一发生最坏的情况也许牺牲我们自己的生命外)。我们也无权说服甚至怂恿别人牺牲自己——甚至为一种思想,为一种完全使我们(很可能由于我们的无知而不合理性地)信服的理论也不应这样。
无论如何,我们对更美好的世界的寻求的一部分一定是寻求这样一个世界,在这个世界中别人不被迫为了一种思想而牺牲掉自己的生命
民主与专制: "应当授予政府多大权力" over "谁应当统治"
柏拉图是贵族形式专制政体的理论家。作为政治理论的基本问题,他提出下面的问题:“谁应当统治?谁应当管理国家?多数人,民众,群众,还是少数人,当选人,精英?”
一旦人们承认“谁应当统治?”的问题是基本问题,那么显然只能有一个合理的答案:不是无知者,而是确实有知识的人,哲人;不是民众,而是少数最杰出者,那就是柏拉图关于最杰出者的、贵族的统治的理论。
民主的伟大理论家和这种柏拉图式理论的伟大对手——例如卢梭——采用了柏拉图对这个问题的表述,不是认为它不适当而予以摒弃,这有些奇怪,因为十分清楚,政治理论中的基本问题不是柏拉图所系统阐述的问题。这个问题不是“谁应当统治?”或者“谁应当掌权?”而是“应当授予政府多大权力?”或者也许更确切些,“我们如何才能这样发展我们的政治制度,即甚至无能的和阴险的统治者也不能造成过多的危害?”
换言之,政治理论的基本问题是约束与平衡的问题,对于政治权力它的独断独行、它的滥用可据以控制和制服的制度的问题。
我不怀疑,西方人所信仰的这种民主政体不过是权力在这种意义上受到限制和控制的国家。因为我们信仰的这种民主政体决不是理想国家;我们完全清楚,许多不应当发生的事情发生了。追求政治理想是幼稚的,西方的任何一个明理的成年人都知道,“一切政治活动都在于选择较少的邪恶”(引用维也纳诗人卡尔·克劳斯[Karl
Kraus]的话说)。
对我们来说,只有两种政体:被统治者不用流血就可以摆脱他们的统治者的政体,和被统治者若想摆脱他们的统治者,只能通过流血才能摆脱的政体。这两种政体中的第一种我们称作民主政体,第二种我们称作暴政或独裁
。但是这些名称并不真正重要,只有事实才真正重要。
西方人只是在这种朴素的意义上信仰民主政体:作为最少邪恶形式的政体。在挽救民主和西方上比任何人都起更大作用的人也是这样描述它的:“民主政体是最坏形式的政体,”温斯顿·丘吉尔曾说道,“当然除去人们一再尝试过的所有那些其他形式的政体外。”
因此我们信仰民主政体,但不是因为它是由人民来统治。既不是我,也不是你来统治;相反,你和我都在被统治,有时超过找们所希望的程度。然而我们信仰与和平相容、与有效的政治对立相容从而与政治自由相容的那种政府形式的民主政体。
我在上面提到了这个令人遗憾的事实,柏拉图的令人误解的问题“谁应当统治?”从未明显地遭到政治哲学家们的摒弃。卢梭提出同样的问题,但给予相反的回答:“人民的意志应当统治——多数人的意志,而非少数人的意志”;这确实是危险的回答,因为它导致对“人民”和“人民的意志”的想象的神化。
与卢梭相反,我们认为投票或选举的多数人决定只是不流血地、对自由限制最少地做出决定的方法。当然,多数人常常做出错误的决定,我们必须坚决主张少数人应当具有任何多数人的决定都不能压制的权利和自由
我这并不是说我赞成受过教育的人与“清扫工人”相比具有更大的影响。因为我认为应当无条件地摒弃由聪明人和善人统治的柏拉图式的观念. 西方国家所尊敬的无名战士纪念碑是西方的信仰的象征——我们对普通无名者的信仰的象征。我们并不询问他属于群众还是属于精英:他是一个人,要整体地看待他。
是对我们同胞的这种信仰和对他们的尊重,使我们的时代成为我们所知的最好的时代。这种信仰的诚挚被乐于为它做出牺牲所证明。我们信仰自由,因为我们信仰我们的同胞。这就是我们废除奴隶制的原因。我们的社会秩序是我们所知道的历史上最好的秩序,因为它是最乐于不断改进的秩序。
如果我们从这种观点来看东方,也许我们可以以一种和解的思想结束:诚然,斯大林再次引入了奴隶制和折磨,对此我们不可宽恕,不能原有。然而我们不可忘记,发生了这一切是因为东方信仰允诺自由——全人类的自由——的理论。在这场猛烈的冲突中,我们不可忘记,甚至共产主义也是产生自帮助别人,为别人做出牺牲的愿望
这些实验教导我们,敢于实现人间天堂的那些人多么容易地会到达地狱。
当我们认识到陶片放逐法的制度并不把放逐看作惩罚时,这种观念就显得十分清楚了。通过被放逐,公民的名誉仍保持清白,他仍保留自己的财产,甚至一切权利,除去留在这座城市的权利外。这个权利他最初失去十年,后来又失去五年,尽管他可以被召回。在某种意义上,陶片放逐法是一种称赞,因为它承认某个公民是杰出的,一些最杰出的领袖遭到放逐。因此这种观念是:在民主国家中,没有人是不可替代的,尽管我们十分赞美领导,我们必须离开任何特定的领袖也能行;否则他可能使自己成为我们的主人,而我们民主国家的主要任务就是避免这一点
。应当注意到,陶片的放逐法行使的时间不长。第一个已知案件发生在公元前488年,最后一个发生在公元前417年。所有这些案件对于遭到放逐的伟人来说都是悲剧。这个时期几乎与雅典悲剧的最伟大作品的时期,与埃斯库罗斯、素福克勒斯和欧里庇德斯的时期相巧合。欧里庇德斯后来自我放逐
民主的标准
人类社会需要和平,但是它也需要严肃的观念化的冲突:我们可为之战斗的价值和观念。西方社会已经——从希腊人那里——了解到,在这些冲突中词语比刀剑具有远为巨大和持久的影响;然而,其中最有效力的是理性辩论。
因此,完美的社会是不可能的。但是一些秩序要胜过另一些秩序。西方社会选取了民主制度,因为它是能被词语,在某些地方——如果说只是很少的话——甚至能被理性辩论所改变的社会制度
;被理性的,也就是说,被客观的批评:被非个人的批评性考虑,正如科学中尤其是自从希腊人以来的自然科学中所典型使用的那些考虑所改变的社会制度。因此,我声明支持西方文明、支持科学、支持民主。它们给予我们机会来防止可避免的悲剧,来试行改革
民主的其它标准???
然而在此我必须反对人们一再以不同形式提出的一种学说:我是指在西方和东方经济体制间的抉择将最终取决于其中之一的经济优越性的学说。我个人认为自由市场经济比计划经济更有效;但是我认为把抵制暴政建立在经济论点的基础之上是完全错误的。即使中央计划国家经济确实优越于自由市场经济,我也会反对计划经济。原因很简单,它很可能把国家权力增加到暴政的程度。我们不应藐视我们的自由,也不应为红豆汤而出卖它(《创世记》[Genesis]25:34);也不应为最高生产率而出卖它,即使能够以自由为代价换取效率也不应如此
如果您想提高自己的技术水平,欢迎加入本站官方1号QQ群:&&,&&2号QQ群:,在群里结识技术精英和交流技术^_^
本站联系邮箱:

我要回帖

更多关于 纸牌屋结局是什么 的文章

 

随机推荐