20xx年03月18日 07:41 AM
自造语言的无穷魅力
艾玛?雅各布斯
戴维?彼得森(David Peterson)在美国加州大学伯克利分校(University of California, Berkeley)学习语言学和英文时,花两个月时间发明了一种秘密语言,给它取名为“梅戴语”(Megdevi)——这是大卫和他当时的女友梅甘(Megan)名字的结合体。待新词和语法规则令他满意后,他将成果展示给女友。这是他送出的一份非常浪漫的爱情大礼:一种只在他俩之间使用的私密语言。
不过15年后,33岁的彼得森承认:“我们没用过它。”梅甘虽然赞赏了他的努力,但并不想学习这门语言。“太费力了。”如今,已娶别人为妻的彼得森对“梅戴语”的技术缺陷更为心烦,称之“令人讨厌”。他叹道:“它想一次实现许多个目标,结果落得一无是处。”
当时,他还以为自己是头一个为自己创造一门语言的人。“我以为自己会垄断市场,人们对新语言的发明会有需求。”后来,他在网上搜索后发现,世界上有许多像他这样的人,他们在聊天室里给语法规则挑毛病,欣赏用自己新发明的词汇写成的诗歌。
新语言的发明史丰富多彩。一些语言带有政治目的,例如,发明于
19世纪的世界语(Esperanto)是为了促进和平,发明于19xx年的拉丹语(Láadan)带有女权主义色彩。还有一种道本语(Toki Pona),这种语言使用积极词汇,以鼓励积极思维。
如今,彼得森是职业的“语言设计师”(conlanger)——那些自造语言的人以此相称。他的爱好缘何变成职业?这是因为科幻和奇幻类影视剧制片商越来越追求在剧中营造一种真实感,包括创造完全虚构的自然主义语言。影迷剧迷们对这些语言的研究细致入微,还在Twitter和论坛上分享剧中语言的破绽。
彼得森的重大突破是《权力的游戏》(Game of Thrones)。这部HBO的豪华大剧下月将开播第4季。
20xx年,在修完语言学硕士学位、并在一所社区学院教授了一段时间的英语之后,彼得森失业了。他参加了《权力的游戏》制片商面向“语言创造协会”(Language Creation Society)会员设立的一场竞赛。彼得森是协会的联合创始人之一,协会宗旨是推广、讨论和解构人造语言。
协会受邀为电视剧设计一门语言——多斯拉克语(Dothraki)。他在两轮比赛中均告胜出——第一轮是会员评审,第二轮是电视制片方评审。这改变了他的职业道路。
与他之前设计的语言不同,多斯拉克语已经具备了一些基本成分。电视剧根据魔幻传奇小说《冰与火之歌》(A Song of Ice and Fire)五部曲改编,小说作者乔治?马丁(George RR Martin)已经创造了一些单词。彼得森对单词进行了分析,为它们添枝加叶,创造出了一门“自然主义”语言,并反映出那个虚构的蒙古封建社会更关注哪些方面。例如,在多斯拉克语中,有7个单词可以形容使剑的动作,比如,“hlizifikh”指偏离目标但相当有力的一击,“kolverikh”形容笔直的一刺。
虽然马丁坚称自己并未刻意关注语言学规则,但彼得森认为他很有“创造语言的天赋”。彼得森表示,魔幻作家创造的语言通常“是一团糟”,不仅漏洞百出,而且往往只不过是换了个样子的英语。
到第一季开始播出时,彼得森已经发明了1700个单词,如今又新创了2000个单词。他将目标设在1万个,但眼下其他科幻和魔幻方面的项目开始分散他的精力。
他将自己写下的每一句多斯拉克语台词都录了下来,以便演员学习发音。他说,演员们学得不错,但剪辑好的最终成品常常让他感到非常无奈(他说,错误都出在剪辑师和导演那里,他们听不懂多斯拉克语,往往把本应该剪掉的片段留下。)
彼得森最初的目标是当一名高中英文教师。在伯克利念本科时,有一半墨西哥血统、会说西班牙语的彼得森出于兴趣学习过不同语言。他学过一点阿拉伯文,还学了一学期的俄文。在母亲的建议下,他开始学习语言学,这激发了他对创造语言的兴趣。
他发现自己的研究一发不可收拾。他表示:“这会让人上瘾。”他对自己的兴趣一向非常投入。小时候他迷过绘画,然后是写作,最后,他的兴趣集中到了语言学上。
他表示,尝试“解决沟通的问题”,满足了他头脑中的数学一面。但这一工作也具有艺术性。“填写一个词语,意味着填写一段历史。这不是纯粹机械的工作。”
语言设计师的转折点是克林贡语(Klingon)。语言学家马克?奥克兰德(Marc Okrand)受聘为19xx年上映的《星际迷航3:石破天惊》(Star Trek III: The Search for Spock)创造一门新语言(在《星际迷航》原版电视剧中,克林贡人主要说英语)。
之后是詹姆斯?卡梅隆(James Cameron)的科幻巨制《阿凡达》(Avatar)。卡梅隆聘请了美国南加州大学(University of Southern California)的语言学专家保罗?弗罗默(Paul Frommer),为片中10英尺高的外星人——纳威人(Na'vi)——创造一门纳威语。
弗罗默教授的工作方法包括,确定该语言的发音(决定取用哪些音素,以及确定发音规则)、词形(构词法)以及句法(如何将词语组合为短语和句子)。在语言设计中将该语言对纳威文化的反映考虑进入,这也是很重要的一点。
弗罗默表示,优秀的语言设计师熟谙语言学规则,通晓多门语言,注意语言、文化、环境的相互作用,想象力丰富,并且目标清晰,即对这门语言的使用方式以及目的心中有数。彼得森表示,没有目的性的语言将“乱七八糟,好像随意拼凑起来的一样”。
科幻和魔幻电影引发了狂热的追随。有的影迷在纹身时使用了彼得森为科幻电视剧《抗争》(Defiance)创造的语言文字。“这让我很激动,”彼得森说。
彼得森表示,电子游戏本应是语言设计师大显身手的舞台,但开发商更关注艺术效果和游戏体验,而不是语言的严密性。他表示有一款正在开发的游戏是个例外,不过他不愿透露游戏名称。
专业的语言学家可能会瞧不起语言设计师,但弗罗默教授坚持认为人造语言“可以作为测试语言理念的实验室”。彼得森认为学校应该教授构建语言的学问,在他看来,电视节目对人造语言的使用起到了教
育作用。“人们因为对我的工作感兴趣,开始接触语言学。”
译者/徐天辰
第二篇:C语言
C语言程序设计(90 分钟)A卷 (1)C语言中的标识符只能由字母,数字和下划线三种字符组成,且第一个字符
A)必须为字母
B)必须为下划线
C)必须为字母或下划线
D)可以是字母,数字和下划线中任一字符
正确答案: C
(2)以下叙述不正确的是
A)一个C源程序可由一个或多个函数组成
B)一个C源程序必须包含一个main函数
C)C程序的基本组成单位是函数
D)在C程序中,注释说明只能位于一条语句的后面
正确答案: D
(3)在调用函数时,如果实参是简单变量,它与对应形参之间的数据传递方式是____B______。
A) 地址传递 B) 单向值传递
C) 由实参传给形参,再由形参传回实参 D) 传递方式由用户指定
(4)有以下程序 A
main()
{
int m=12,n=34;
printf("%d%d",m++,++n); printf("%d%d\n",n++,++m);
}
程序运行后的输出结果是
(A)12353514 (B)12353513 (C)12343514 (D)12343513
(5)有以下语句:int b;char c[10];,则正确的输入语句是 B
A)scanf("%d%s",&b,&c); B) scanf("%d%s",&b,c);
c)scanf("%d%s",b,c); D)scanf("%d%s",b,&c);
(6) 有以下定义的结构(或结构体)变量,若从键盘给成员x、y输入数据, 1
正确的输入语句是___B_____。
struct xy{
int x;
int y;
} num;
A) INPUT x、y; B) scanf("%d%d",&num.x,&num.y);
D) scanf("%d%d",&xy.x,&xy.y); C) scanf("%d%d",&x,&y);
(7)已知函数的调用形式:fread(buf,size,count,fp),参数buf的含义是
A)一个整型变量,代表要读入的数据项总数
B)一个文件指针,指向要读的文件
C)一个指针,指向要读入数据的存放地址
D)一个存储区,存放要读的数据项
正确答案: C
(8)struck sk
{ int a;
float b;
} data;
int *p;
若要使P指向data中的a域,正确的赋值语句是
A)p=&a;
B)p=data.a;
C)p=&data.a;
D)*p=data.a;
正确答案: C
(9)已知int i,a;执行语句i=(a=3,a++,- -a,a+4,a+5,++a);后,变量i的值为
A)2
B)3
C)4
D)5
正确答案: C
2
(10)设有:
int a=1,b=2,c=3,d=4,m=2,n=2;
执行 (m=a>b)&&(n=c>d)后n的值是
A)1
B)2
C)3
D)4
正确答案: B
(11)若有下面的程序段:
char s[]="china";char *p; p=s;
则下列叙述正确的是
A)s和p完全相同落千丈
B)数组s中的内容和指针变量p中的内容相等
C)s数组长度和p所指向的字符串长度相等
D)*p与s[0]相等
考生答案: 正确答案: D
(12)有以下程序
#define F(X,Y)(X)*(Y)
main()
{ int a=3, b=4;
printf("%d\n", F(a++, b++));
}
程序运行后的输出结果是
A)12
B)15
C)16
D)20
正确答案: A
(13)设有以下宏定义: C
#define N 3
#define G(n) ( (N+1)*n)
则执行语句:z = 2 * (N+G(5+1));后,z的值为__2*(3+(3+1)*5+1)_。
3
A) 出错 B) 42 C) 48 D)54
(14)若有以下说明和定义 C
union dt
{int a;char b;double c;}data;
以下叙述中错误的是
A)data的每个成员起始地址都相同
B)变量data所占的内存字节数与成员c所占字节数相等
C)程序段:data.a=5;printf("%f\n",data.c);输出结果为5.000000
D)data可以作为函数的实参
(15)设有数组定义: char array [ ]="China"; 其中sizeof(char)得知为1个字节,则数组 array所占的空间为_____C_____。
A) 4个字节 B) 5个字节 C) 6个字节 D) 7个字节
(16)已知指针p的指向a[2],如下图所示,则执行语句 ++p 后; *p的值是____C______。
A) 30 B) 31 C) 40 D) 41
a[0] a[1] a[2] a[3] a[4] ┌──┬──┬──┬──┬──┐ │10 │ 20 │ 30 │ 40 │ 50 │ └──┴──┴──┴──┴──┘ ↑ p
(17)有以下程序 D
void f(int *x,int *y)
{
int t;
t=*x;*x=*y;*y=t;
}
main()
{
int a[8]={1,2,3,4,5,6,7,8},i,*p,*q;
4
p=a;q=&a[7];
while(p
{f(p,q);p++;q--;}
for(i=0;i<8;i++)printf("%d,",a[i]);
}
程序运行后的输出结果是
A)8,2,3,4,5,6,7,1 B)5,6,7,8,1,2,3,4
C)1,2,3,4,5,6,7,8 D)8,7,6,5,4,3,2,1
(18)若int k=8;则执行下列程序后,变量k的正确结果是
main()
{int k=8;
switch(k)
{case 9:k+=1;
case 10:k+=1;
case 11:k+=1;break;
default:k+=1;}
printf("%d\n",k);}
A)12
B)11
C)10
D)9
正确答案: D
(19)二维数组int a[5][5]以行方式从下标0开始将其元素一一赋给一维数组int b[25],则数组a的元素a[3][4]对应赋给数组b的元素是_____C_____。(数组b下标也是从0开始)
A)b[12] B)b[15] C)b[19] D)b[20] (20) 下面程序输出的结果是
main()
{ int i;
int a[3][3]={1,2,3,4,5,6,7,8,9};
for(i=0;i<3;i++)
printf("%d ",a[2-i][i]);
}
A)1 5 9
B)7 5 3
C)3 5 7
5
D)5 9 1
正确答案:B
二、填空题(共40分)
(1)以下程序运行后的输出结果是【1】
void swap(int x,int y)
{ int t;
t=x;x=y;y=t;printf("%d %d ",x,y);
}
main()
{ int a=3,b=4;
swap(a,b);printf("%d %d\n",a,b);
}
答案:4 3 3 4
(2)下面程序把从终端读入的文本(用@作为文本结束标志)输出到一个名为bi.dat的新文件中,请填空。
#include "stdio.h"
FILE *fp;
{ char ch;
if((fp=fopen( 【2】 ))==NULL)exit(0); bi.dat,w||bi.dat,w+ while((ch=getchar( ))!=′@′)fputc (ch,fp);
fclose(fp);
}
(3)定义以下两个变量a、b:
union {
int x;
char c;
long t;
int *p
} a; Struct { int x; char c; long t; int *p } b;
在分配内存空间时,变量a占用存储空间是比变量b占用存储空间【3】。
(4)以下程序用来对数组a逆序存放,也就是第一个元素和最后一个元素值交换,第二个与倒数第二个交换,依此类推。请填空。
6
#include<stdio.h>
#define MAX 5
void main(void)
{
int i , a[MAX];
for(i = 0; i < MAX ; i ++)
{ scanf("%d",&a[i]);
}/*数组元素赋值*/
}
(5)请填写以下程序输出结果。
#include<stdio.h>
void main(void)
{
FILE *fp;
char ch;
int i=0;
/*打开文件名为 test 的文件*/
if ((fp = fopen( "test", "r") == NULL )
{ printf("can not open test\n");
exit(0);
}
fseek(fp,-10,2);
while(i<5)
{ ch=fgetc(fp);
putchar(ch);
i++;
}
fclose(fp);
}
其中test文件为ASCII文本文件并与该程序编译连接后的可执行程序放在同一文件夹,其内容为:abcdefghijklmnopqrstuvwxyz
请问输出结果是【7】。 for(i = 0; i < _(【4】; i++) { a[i]=a[i]+a[MAX-1-i]; a[MAX-1-i]=a[i]-a[【5】]; a[i]=a[【6】]-a[MAX-1-i]; }/*逆序交换数组元素*/
7
(6)请填写以下程序输出结果。
#include<stdio.h>
#define MAX 5
void main(void)
{
int i , x;
scanf("%d",&i);
switch(i)
{
case 1: x=i+1;
case 2: x=i+2;break;
case 3: x=i+3;
case 4: x=i+4;
case 5: x=i+5;break;
default:x=6;
}
printf("%d",x);
}
1)当键盘输入为3时,输出结果是【8】。
2)当键盘输入为0时,输出结果是【9】。
(7)设有如下宏定义
#define MYSWAP(z,x,y)
{z=x;x=y;y=z;}
以下程序段通过宏调用实现变量a,b内容交换,请填空。 float a=5,b=16,c;
MYSWAP( 【10】 ,a,b);
2009-2010第二学期C语言程序设计复习练习题
一、选择题(共60分)
(1)设a=12,则执行完语句a+=a-=a*a的值是___D_______。
A) 522 B) 264 C) 144 D) -264
8
(2)有以下程序
int func( int a, int b)
{ return(a+b); }
Main()
{int x=2,y=5,z=8,r;
r=func(func(x,y),z);
Printf(“%d\n”,r)
}
A) 12 B) 13 C) 14 D) 15
(3)在C语言中,函数值类型的定义可以缺省,此时的隐含类型是__B_______。
A) void B) int
C) float D) double
(4)以下选项中合法的用户标识符是_____D_____。
A) a*b B) char C) long D) _a2b
(5)以下合法的赋值语句是_____D_____。
A) x!=100; B) j=i++; C) x-y; D) c=int(a+b);
(6) 有以下定义的结构(或结构体)变量,若从键盘给成员x、y输入数据,正确的输入语句是____B____。
struct xy
{
int x;
int y;
} num;
A) INPUT x、y; B) scanf("%d%d",&num.x,&num.y);
D) scanf("%d%d",&xy.x,&xy.y); 该函数的输出结果是__D________。 C) scanf("%d%d",&x,&y);
(7)以下选项中,不能正确将字符串 "Student" 赋给变量的是___A______。 .
A) char c1[10]; c1 = "Student";
B) char c2[] = {?S', ?t', 'u', 'd?, 'e?,?n?,?t?,?\0?};
C) char c3[7] = "Student";
D) char *c4 = "Student";
9
(8) 阅读以下程序:
void main(void)
{ int x;
scanf("%d",&x);
if((x > 5)|| ++x) printf("%d",++x);
else printf("%d",++x);
}
程序运行后,如果从键盘上输人6,则输出结果是_____C____。
A)5 B) 6 C) 7 D) 8
(9)以下程序的输出结果是___D_______。
void main(void)
{ int a=5;
printf("%d\n",(a *= a+10))
}
A) 35 B)15 C) 250 D) 75
(10) 下列变量定义中合法的是____A______。
A) char day; B) int c++ =10; C)float 2m; D) a=30;
(11) 构成C语言程序是_____C_____。
A) 子程序 B) 主程序和子程序 C) 函数 D)过程
(12)以下程序的输出结果是_____B_____。
void main(void)
{ int i, a[10];
for(i=9;i>=0;i--)
a[i]=10+i;
printf("%d,%d,%d",a[1],a[4],i);
}
A) 11,14,0 B) 11,14,-1 C) 10,14,0 D) 10,14,-1
(13)设有以下宏定义:
#define PI 3.14
#define S(r) ( PI*r*r)
则执行语句:z = S(2+1);后,z的值为___B_______。
A) 出错 B) 9.28 C) 12.56 D)28.26
10
(14)以下程序的功能是:按顺序读入十名学生四门课程的成绩,计算出每位学生的平均分,并输出,程序如下:
Main()
{int n,k;
float score,sum,ave;
sum=0.0;
for(n=1;n<=10;n++)
{ for(k=1;k<=4;k++)
{scanf(“%f”,&score);sum+=score;}
ave=sum/4.0;
Printf(“No%d:%f\n”,n,ave);
}
}
上述程序运行后结果不正确,调试中发现有一条语句出现在程序中的位置不正确。这条语句是______A____。
A)sum=0.0; B)sum+=score; C)ave=sum/4.0 D) Printf(“No%d:%f\n",n,ave);
(15)设有数组定义: char array [ ]="Chinese"; 其中sizeof(char)得知为1个字节,则数组 array所占的空间为____D______。
A) 5个字节 B) 6个字节 C) 7个字节 D) 8个字节
(16)已知指针p的指向a[2],如下图所示,则执行语句 p-- ; 后*p的值是____C______。
A) 10 B) 30 C) 20 D) 40
a[0] a[1] a[2] a[3] a[4] ┌──┬──┬──┬──┬──┐ │10 │ 20 │ 30 │ 40 │ 50 │ └──┴──┴──┴──┴──┘ ↑ p
(17)设a=3,b=4,c=5写出以下表达式的值。 B
表达式为:!(a+b)+c-1&&b+c/2
A)0 B) 1 C) 6 D) 无法确定
11
(18)假设程序段中有以下定义:int a[10];*p;以下错误的使用方式是____B____。
A)p=a
B)p=*a C)p=&a[0] D)p=&a[5]
(19)二维数组int a[5][5]以行方式从下标0开始将其元素一一赋给一维数组int b[25],则数组a的元素a[2][3]对应赋给数组b的元素是_____A__。(数组b下标也是从0开始)
A)b[13] B)b[6] C)b[8] D)b[16]
(20)定义变量 int i = 1000 ;判断以下哪个不是死循环__A________。
A)while (i) {i--;}
B)while(-2) {i++};
C)for( ; ; ){i++;};
D)do {i++;} while(2);
二、填空题(共40分)
(1)下面程序在TC2.0下编译出错,请问引起错误的语句的行号是___(1)_______(请输入“第某行”三个字)
/*第1行*/
/*第2行*/
/*第3行*/
/*第4行*/
/*第5行*/
/*第6行*/
/*第7行*/
/*第8行*/
/*第9行*/ } #include<stdio.h> int fun( int, int); void main(void) { int z ; int x=3,y=2; scanf( “%d”, z); &z z += fun(x, y); printf("%d", z);
12
/*第10行*/
/*第11行*/
/*第12行*/
/*第13行*/
int fun(int x, int y) { return (x+y); }
(2)C语言源程序通过___(2)__生成目标程序,再通过 ___(3)___生成可执行程序。
(3)定义以下结构体类型拟包含两个成员,其中成员变量info用来存放整形数据,成员变量next是指向自身结构的指针。请定义补充完整。
Struct node
{
int info; _(4)___next;
};
(4)以下程序用来对数组a逆序存放,也就是第一个元素和最后一个元素值交换,第二个与倒数第二个交换,依此类推。请填空。
#include<stdio.h>
#define MAX 5
void main(void)
{
int i , a[MAX],temp;
for(i = 0; i < MAX ; i ++)
{ scanf("%d",&a[i]);
}
(5)下面程序把从终端读入的文本(用@作为文本结束标志)输出到一个名为 13 }/*数组元素赋值*/ for(i = 0; i < ___ Max/2____; i++) { temp=a[____a[i]___] a[i]=a[____ a[Max-1-i]____]; a[MAX-1-i]=temp;; }/*逆序交换数组元素*/
bi.dat的新文件中。请填空。
#include<stdio.h>
void main(void)
{
FILE *fp;
char ch;
第3页
fp = fopen(___“bi.dat”,”w” )
while(ch=getchar()!=’@’) fputc(ch,fp);
fclose(fp);
}
(6)请填写以下程序输出结果。
#include<stdio.h>
#define MAX 5
void main(void)
{
int i , p;
scanf("%d",&i);
switch(i)
{
case 1: p=i+5;
case 2: p=i+4;break;
case 3: p=i+3;
case 4: p=i+2; break;
case 5: p=i+1;
default:p=i+6;
}
printf("%d",p);
}
1)当键盘输入为1时,输出结果是___5_______。
2)当键盘输入为7时,输出结果是___13_______。
14