二级C语言上机题库_南开100题.docx

上传人:无*** 文档编号:68363731 上传时间:2022-12-27 格式:DOCX 页数:203 大小:300.18KB
返回 下载 相关 举报
二级C语言上机题库_南开100题.docx_第1页
第1页 / 共203页
二级C语言上机题库_南开100题.docx_第2页
第2页 / 共203页
点击查看更多>>
资源描述

《二级C语言上机题库_南开100题.docx》由会员分享,可在线阅读,更多相关《二级C语言上机题库_南开100题.docx(203页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、说明:本题库是针对2008年4月份考试的上机考试题库,本题库共有100套题目(每套题I包含3道题:道程序填 空题、道程序修改题、道程序设计题),真实考试的时候,考生输入准考证后计算机随机为你抽取套考试,每个 考生考试时只需考套题目(包含三道题),但由于考试时是随机抽题,所以即使把原题库告诉大家,你也不能知道到 时计算机会给你抽取哪套题,所以大家只有把全部题库都理解才能万无一失)宏为世纪教育提供 网址:/*宏为世纪教育 */二级C语言上机试题汇编第01套:给定程序中,函数fun的功能是:将形参n所指变量中,各位上为偶数的数去除,剩余的数按原来从高位到低位的顺序组成个新的数,并通过形参指针n传回所

2、指变量。例如,输入个数:27638496,新的数:为739。请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。注意:源程序存放在考生文件夹下的BLANKI.C中。不得增行或删行,也不得更改程序的结构!给定源程序:/include void fun(unsigned long *n) unsigned long x=0, i: int t:i=l:while(*n)/*Cund*/ t=*n % _1_;/* * *found* * */if(t%2!= _2_) x=x+t*i; i=i*10; n =*n/10;n=_3_;inain() unsigned long n=

3、-l;while(n99999999lln0) prin(f(Please input(Onl(XXXX)O(X):); scanf(M%ld,&n);) fun(&n);printf(nThe result is:解题思路: 第处:t是通过取模的方式来得到的个位数字,所以应填:10。第二处:判断是否是奇数,所以应填:0。第三处:最后通形参n来返回新数x,所以应填:X。给定程序MODI1.C中函数fun的功能是:计算n!.prin(f(Input N:);scanf(%d, &n);printf(nn%d! =%lfnn, n, fun(n);解题思路: 第一处:条件语句书写格式错误,应改为:

4、if(n=O).第二处:语句后缺少分号。请编写一个函数fun,它的功能是:将一个数字字符串转换为一个整数(不得 调用C语言提供的将字符串转换为整数的函数)。例如,若输入字符串”-1234”,则 函数把它转换为整数值-I234o函数fun中给出的语句仅供参考。注意:部分源程序存在文件PROG1.C文件中。请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。给定源程序:#include /include long fun ( char *p)(/*以下代码仅供参考*/int i, len, t; /* len为串长,t为正负标识/long x=0:len=s

5、trlcn(p):if(plOl=-) t=-l; len-: p-H-; else t=l;/*以卜.完成数字字符串转换为个数字*/return x*t;main() /主函数/ char s6;long n;printf( Enter a string:nM);gets(s);n = fun(s);primf(%ldn”,n);/*宏为世纪教育 */NONO ();)NONO()/*本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。*/FILE *fp, *wf;int i;char s20:long n ;fp = fopen(c:lestin.dai;,r);wf = fop

6、en( Mc :tcstout. dat,HwH);for(i = 0 ; i 0)sum += xi; C+;)i+: )/*!/*/*宏为世纪教育 */sum = c;return sum;main() int x 1000; int i=0;printf( nPlease enter some data (end with 0):do scanf(%d &xi);)while (xi+ != 0);脚枝(噌fn, fim ( x );蛤定程序中,函数fun的功能是将形参给定的字符串、整数.浮点数写到文本以棒用瞬再用字符方式从此文本文件中逐个读入并显示在终端屏幕上。籍襁序的卞嬲幽而楸伸内恸

7、J蜒戳礴罐雕解桶鸵岫则6 sum=0.0;或float 果lp=0.0:e,潮拓展再号生殳件夹下的BLANK1.C中。不簪培存鼓蒯符广范不椁重鼓葬岸苗葬将|*婚范糠蕤学中函数的功能是:根据以下公式计算s,计算结果作为函数值返林c田融期磊售入。void furl (char *s, Int a, double 01= + + + + /*4h2*su 枯鼻楠*”*/ I +2+3+n生蚣液n的值为II时,函数的值为:1.833333诺嘉品邨分源程序在文件PROGLC中。帮勿锦触楮黑双田讣却若它函数中的任何内容,仅在函数fun的花括号中填入鞫阿长照蝴An, s, a, f);fclose(fp):

8、 本题是考察先把给定的数据写入到文本文件中,再从该文件读出并显示在屏幕上。第处:定义文本文件类型变量,所以应填:FILE*o第二处:判断文件是否结束,所以应填:fp。第三处:显示读出的字符,所以应填:cho*给定程序MODI1.C中函数fun的功能是:依次取出字符串中所有数字字符,形成新的字符串,并取代原字符串。请改正函数fun中指定部位的错误,使它能得出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!给定源程序:#includc void fun(char *s) int i.j;for(i=0,j=0; si!=AO; i+)if(sU=U & s(i=9)/

9、* * * *found* * */sUMi;/* found* * */sj=,O;main()IDnnd*/油盛世辟里强i :用s(ilcm):喇犀明iThe string is : V%sn.itcm);fun(item);产iaUG猛阿也划NwngiQg is : V%sn”,item );=_2一;蝌燃肺:l+n!=I(r)n+:福崔场梁括火犀国窗)N所有数字字符组成一个新的字符串,程序中是使用变量j 海拓湖露岸制泊儡矗*访:耕应改为:箱+i径理犯争串的结束符,所以应改为:sUl=W;.* *,* *1=1+1;将编写函数fun.函数的功能是:招M行N列的二维数组中的字符数据.按列的

10、利序依次放到一个字符串中.糊取)二维数组中的数据为:演陷她:baacda, c;浦】那nThc string: %snM,s);prin(f(nlnput a character: ); scanf(u%c.&c);解题思路:本题是找出最高成绩,再把N名学生的成绩等于最高成绩的记录存入b所指的数组中。具体 操作请看答案程序中的说明。/*宏为世纪教育 */参考答案:int fun( STREC *a. STREC *b )int i. max = aO.s, n=0;for(i = 1; i N; i+)if(n)ax ai.s) max = ai.s; /* 找出最高成绩 */for(i =

11、0; i N: i+)if(max=ail,s) b|n+ = ai ;/找相等的最高成绩并存入数组b中*/return n; /*返回符合条件的人数/I第00套:给定程序中,函数fun的功能是:在形参s所指字符串中?找。参数c相同的字Ah AM:其后插入一个与之相同的字符,若找不到相同的字符则函数不做任何处 飒字符串中的内容应是:WSHWSHWSH.俾鼬断脚斛松伸忡切用晒字.符为:a,加分质动臃禄篆书拙两曲世掰跑I*的任何内容,仅在函数fun的花括号中填入 旅端尾桁驹下榔管处填入正确的内容并把下划线删除.使程序得出正确的结 界定源程序:沁容hd网怒刘E考生文件夹下的BLANK中。而得盘斩哮删

12、行,也不得更改程序的结构!能*濯湖和六n成唠性致期.忙W */void fun(char sN, char *b)宏为世纪教育 */int i,j,n=O;附邛群*精填相应语句完成其功能*/I int i. j, n;参考答案: void fun(char sN, char *b)/*宏为世纪教育 */int i,j.n=O;for(i=0;iN;i+)/*请填写相应语句完成其功能*/ for(j = 0 ;j AO:I 第03套:程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。所 有学生数据均以二进制方式输出到文件中。函数fun的功能是重写形参filename所 指文件中最

13、后一个学生的数据,即用新的学生数据覆盖该学生原来的数据,其它学 夕率原抑迹龈换。第2个条件是应该第I和第3个小,则交换就符合题意了,所以应改为: 涌鱼网布的下划线处填入正确的内容并把下划线删除.使程序得出正确的结 :( *堂胸衲解的例州谶稣荆龄名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,它的功能是:把分数最高的学生数据放在b所指的数组中,注 ,分凝搔博仰0牵4能木佳兴不的用钱强同年笈高的学生的人数。轨崛相的序拒媚龈断幽V构!箱窈液甥星函数main和其它函数中的任何内容,仅在函数fun的花括号中填入 的蜘叫的例而,J。绍钳源用用:IWRE蚓能骷出桐 (Iftl/柳16 聊dm;

14、 f1 册 in戏 y(g(char * filename. STU n) int fun( STREC *a, STREC *b ) 第二处:使用f。!循环语句来交换数组元素的值,所以应填:i。第三处:使用中间变量t来交换的,所以应填:I。*给定程序M0DI1.C中函数ftm的功能是:把主函数中输入的3个数,最大的放在a中,最小的放在c中,中间的放在b中。例如,输入的数为:55 1234,输出结果应当是:a=55.0,b=34.0,c=12.0.请改正程序中的错误,使它能得出正确结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。给定源程序:#include void f

15、un(float *a.float *b.float *c)|/*仿und*/float *k;if( *a*c) k=*c; *c=*a; *a=k; if( *b*c )|柯隹部*; *c=k:)A *qund*/腆嗯pcn(_l_, ”rb+);榻於 und* */触型小飞法醺蛾维船族:榭啾.&c);/*佑un(j*/fwrite(&n, sizeof(STU), 1, _3_);梏k寨和,纪教育 /RliWiH匕=%4.1 f, b = %4.1 f. c = %4.l fnn,a.b,c);0001,MaChao, 91,92. 77, 10002.,CaoKai; 75. 60.

16、88).?例)8抄EiSi4:取见定M版盥胡酒“*谏),82, 87,| lOOOS:ZhangSan, 95, 80, 88);幽您股M)()06JZhaoSi”. 55, 70. 68), ssN;褊i.j纲L隹辨fun体中,k是一个浮点型变量,所以应改为:float k;e吊二舱区小解储达4b用1个条件是第I个比第2个小,则交换。第3个条件是第2个比第fwritc(t, sizeof(STU), N, fp);/*宏为世纪教育 */解题思路:本题是考察如何从文件中读出数据,再把结构中的数据写入文件中。第一处:从指定的文件中读出数据,所以应填:filename.第:处:读取文件fp的最后一

17、条记录,所以应填:fpo第三处:再把读出的记录,写入文件fp指定的位置上,所以应填:fpo给定程序MODII.C中的函数Crcallink的功能是创建带头结点的单向链衣,并 为各结点数据域赋0到ml的值。请改正函数Crcatlink中指定部位的错误,使它能得出正确的结果。注意:不要改动main函数.不得增行或删行,也不得更改程序的结构!给定源程序:/include #include typedef struct aa ini data;struct aa *next;娘9RE,8, 9、5、1、2. 3, 4.腑抑军的叩谢酬助映桃桶的内容并把下划线删除,使程序得出正确的结剌ODE ,h=NUL

18、L, *p, *s;W.:源程序存放在考生文件夹下的BLANKI.C中。伸啷招酬T。*把不符理甚短序的结构!帘金娜 河 alloc(sizeof(NODE);RffC-lude 标睢司卯ll;(湘福证而困jtiW n)| 闻(并产 *)malloc(sizeof(NODE);尸与仙传禧疑叫2%将抨中wxl;归行期的R测淤+1;)/*仙und*/,就啜处世纪教疔 / for (i=0: in/2; i+) 请编写个函数fun,它的功能是:将ss所指字符中中所有卜标为奇数位置上 的字母转换为大写(若该位置上不是字母,则不转换)。例如,若输入abc4EFg,则应输出aBc4EFg”。注意:部分源程序

19、存在文件PROGLC中。请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入 你编写的若干语句。给定源程序:#include #includc void fun ( char *ss )(I main() char tt|8IJ;printf( nPlease enter an string within 80 characters:n ); gets( tt);printf( nnAfter changing, the stringntt);fun( tt);printf( nbecomesntt);NONO (); )购耦蝴9DE *h)杏跳蟀考生对字母按要求进行转换

20、。其中大小字母的ASCII值相差32 翻淡晶附仲而甜耘:nn HEAD ): hile(p);p-daia):脚布RA v s= a & ssi = z) ssi -= 32 ;I main()泠资澈,蚤1举德盘&ailink(8,22);国缴则I则解%赖毓通所用数组中的前半部分元素中的值和后半部分元 素中的值对换。形参n中存放数组中数据的个数,若n为奇数,则中间的元素不动。例岫k(袍制的指数组中的数据依次为:I、2、3、4、5、6, 7、8、9,则调换后 printf(11 Enter a string An); gets(line);num=fun( line);printf(HThe n

21、umber of word is : %dnn,num);NONO();)解题思路:本题是统计字符串中的单词数。I .利用while循环语句和指针变量,当字符为空格时,则单词数k加L2.循环结束返回ko参考答案:int fun( char *s)(int k = I :while(*s) if(*s = ) k+;S+4-;Ireturn k;)给定程序MODILC中函数fun的功能是:删除p所指字符串中的所有空白字符(包 斯赣裳寿承商举港缓籁落港,解爆而串时用印结束输入。帮便拒建岸,箭密镇拘俺誉鼐输密僮前帝豳栗常号、姓名和3门课的成绩所建番生菜嬖投励m酬赛蒯阐翱蝴湖帧嘲缴期曲整辆及nume所

22、指 翦通像黑评入学生数据,并按照学号从小到大排序后,再用二进制方式把排序后的 篇俶激谶疑“维毋name所指的文件中,覆盖原来的文件内容。猫市尉晨胞应烈变处填入正确的内容并把下划线删除,使程序得出正确的结龊ttlude 温网h源吊炉存放在考生文件夹卜的BLANK1.C中。潦趣赢则如:也不得更改程序的结构!徐瑜* *(qu 血 * *率*/设产出曲加伸向;i+)帏娜触声(p+i)ct+=pi:厚 * */strcpy(p,c);k=fun(3-);if (k=0) printf(nNot found!n);else printf(The sequence number is : %dn,k);SL

23、IST *creatlist(char *a) SLIST*h,*p,*q; inti;h=p=(SLIST *)malloc(sizeof(SLIST);for(i=0; idata=ai; p-ncxt=q: p=q;Ip-next=O:/*宏为世纪教育 */return h;)void outlist(SLIST *h) SLIST *p;p=h-next;醐ftJfibjpnmfCVThe list is NULL!n);命位 scorc|3;(g仲“ AnHcad);08id fun(char * filename)(丽桃饿毓iPj冲s);p千next; 肿/附NL);jPfinit

24、G:Jd * * *率* * * * * */= fopen(filename1_);Jread(s, sizeof(STLJ), N, fp);M输确痢1IMi声中要求找出指定的竹.。能郸E泄则林声结束,所以应填:NULL.斛*加*遍地盆加!来计算结点的位置,当找到ch值,则返I可结点的位置n,所以 率君柯.并网上ssn。)利二新;始作期!髀数中已经给出了 head和ch,所以应埴:head,ch.*淤*年*.半*宇奉毕*孚*fp = iopenffilenamc, wb J;fread(ss. sizeof(STU). 5, fp): fclose(fp);for (j=0; jN; j+

25、) printf(nNo: % Id Name: %-8s Scores: ,ssj.sno, ssj.name);for (i=0; iO第三处:把已排序的结构数据,重新写入文件,所以应填:fwrite,*给定程序MODI1.C中函数fun的功能是:在字符串的最前端加入n个*号,形成沏如报堵擀料aw.g的 */注意:字符串的长度最长允许为79。襁可麻都禽业贿蝴的卿的误,使它能得出正确的结果。请荏程作朋噢1缪肥献正而斛掷秋林则W划ft饰粉厚物椎用胸楸!确的结飨熊源程序:钟嗯yd源稗皆附该在考生文件夹下的BLANK1.C中。卿用噌力创顺力 也不得更改程序的结构!弟独源箱的r s, im n )i

26、nclude 梅服)kt3PhhHOineN8(*d * */干Ri data:,碱喉同如)跑=”;卜 LIST:El 折用rcalist(char );void outlist(SLIST *); if(i%4=0) printfCXn);printf(H%s %3d ,si.nuni,s(i.s);)priiitf(nnEnter the number: ):gets(m);h=fun( s,m );printfCThedata:);printf(Hn%s %4dnh.num.h.s);printfC);out = fopcn(,c:tcstout.dat,w,);h=ftin(s,GAO

27、I3):fprintf(ou(,n%s %4dn .h.nuin.h.s);fclose(out);解题思路:本题是从学生记录体中找出给定的学号。具体操作请看答案程序中的说明。参考答案:STREC fun( STREC *a, char *b ) (STRECc;int i;c.num0 = ,0;/* 置初始空串 */年卜q-1 : /*置成绩为-I */件(i = 0; i N ; i+)jf小曲洲的:ihgQ以卜赫*判断学号是否相等*/融H册评叩,ai.num);/*相等,则对学号进行赋值#/盲昨也闾声相等,则对成绩进行赋值*/M(计MG)那出循环体*/I用鸵50;/*返回结构体变量I

28、ini n; char s80;printf(nEnter a string :); gets(s);的溢伊静山为潘道点森甬汽绘X X X X X X X X X融勖的Enter n ( number of * ):scanf( r%d&n);瀛翻河L函数fun的功能是:在带有头结点的单向链表中,胃找数据域中 保版M罐由n盛帮旧盆斗叭翱鲍卧境箝点在链表中所处的顺序号;若不存在 解题思路:第一处:指针p应指向所以应改为:p=s;0double md() static t=29,c=217,m=1024,r=0;r=(r*t-l*c)%ni; return(double)r/m);Imain()

29、int ageN, i. dM;for(i=0; iN;i+)agei=(iiit)(l 15*md();printf(MThe original data An);for(i=0;iN;i+) prinrt(i+l)% 10=0?%4dn,:,%4dagci);printf(忖W);fun( age, d);for(i=0;i10;i+)printf(%4d%4d : %4dn,i*10,i* 10+9,diJ);printf( Over 100 : %4dndll0);NONO(d);I解题思路:本题是统计各年龄段的人数。1 .初始化各年龄段人数为0.2 .使用fo循环以及求出各年龄的十位

30、数字作为存放人数的地址,如果大于值大于10,则 存入d10中(大于110岁的人)。籥花s is convcrcd (o integer number: %dnn,s,n);yoid fun( int *a, int *b)他题思路: int i, j ;for(i = 0 ; i M ; i+) bi = 0;锋老明捱细莪膏加跑建限陀ER期卿,隰”秋冷嘲写成*P, O错写成o:东乔 计4君* 击*云* *阳*申去喉小!螂樽舄那艇姬及十;N名学生的数据已在主函数中放入结构体数组1中,请编写函数fun,它的功能是:函数返问指定学号的学生数据,指定的学号在主 屈数中输入.若没找到指定学号,在结构体变

31、量中给学号置空串,给成绩置-1,作 驹脚图邯1d肺(用于字符串比较的函数是stremp),空样心的陵程序和灵蟀强0GI.C中.倩妍现的的嗷嗝豳雁忸阳)数中的任何内容,仅在函数fun的花括号中填入 标编写的若干语句。给定源程序: prin(f(M%4d, blij);printf(,nM);)解题思路:第一处:利用foi循环语句,对数组中的各元素进行逆置,所以终止值为n/2.第二处:进行交换数组中元素的值,由于是依次是首和尾交换,所以应填:i。第三处:使用中间变量t来交换的,所以应填:*给定程序MODILC中阐数fun的功能是:将一个由八进制数字字符组成的字符 串转换为与其面值相等的卜进制整数。

32、规定输入的字符串最多只能包含5位八进制 数字字符。例如,若输入:77777,则输出将是:32767o请改正程序中的错误,使它能得出正确结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。给定源程序:#include int fun( char *p ) int n;/* *R)und* */n= *P-o;p+;while( *p!=0) 嬷物掇寰决袈绥求聚求(梁碎例 *8+*P-。;婚姻程件中.函数fun的功能是将参数给定的字符串、整数、浮点数写到文本 殳件中,再用字符串方式从此文本文件中逐个读入,并调用库函数atoi和atof将 早即微专换成相应的整数、浮点数,然后将J

33、I:显示在屏幕匕指在程序的卜,划线处填入正确的内容并把卜,划线删除.使程序得出正确的结 剩n()|把副咽喉呼搬在考生文件夹F的BLANK1.C中.如稗峨同唬删理!n物忡他握闸/两郡网)();都理如醒淞) Pdn情(Error: String too longer !nn);exit(0); )加盅前由IMt拉解呢。蝴就R(,加袖i7国1Pa肪师阍digils!nn”MiD;exit(O);)Drintf(The original siring: ); puts(s);jiAn*X*Cund*/ -1fp;解题思路: 木题是考察先把给定的数据写入到文本文件中,再从该文件读出并转换成相应的整数、浮

34、 点数址示在屏幕上。第一处:定义文本文件类型变量,所以应填:FILE*。第二处:关闭刚写入的文件,所以应填:fclose(fp).第三处:从文件中读出数据,所以应填:fpn*给定程序MODI1.C中函数fun的功能是:对N名学生的学习成绩,按从高到低的顺序找出前m(mWlO)名学生来,并将这些学生数据存放在一个动态分配的连续存 储区中,此存储区的洋地址作为函数值返回。请改正函数fun中指定部位的错误,使它能得出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!给定源程序:#include #include #include #define N 10typedef s

35、truct ss char num 10;int s;)STU;剧如柒蟆啰浏丧嘤则派坤并例M #:解加布n的功能是:逆置数组元素中的值.例如:若a所指数组中的数据依次 斯*广、*、*案喊审客*:* 9,则逆置后依次为:9. 8. 7, 6, 5. 4、3. 2.匕(嗨蓼小翱檄维叩翻数.树K唯硝;划坡财aI;正确的内容并把卜.划线删除,使程序得出正确的结 r(k=0; km; k+)川盛可原也宁珞:版性号生文件夹卜的BLANKI.C中。琳聊格行则忡J了也不得更改程序的结构!塔笈前陪审fb u n d * */#include void fun(int a, int n) fi睛*世纪教育 */

36、/* *fbund*/*宏为世纪教育 */ s作为函数值返回。在C语言中可调用log ( n )函数求In (n)0 log函数的引用说明是:double log(double x)。例如,若m的值为:20, fun函数值为:6.506583。注意:部分源程序在文件PROGI.C中。请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。给定源程序:#includc #include double fun( int m )(Imain()(printf(,%fn fun(20);NONOO;臊岬卢题是根据给定的公式计算结果。使用foi循环语句依次求出每一项的值,分别进行累加并 福褊虫存入变量S中,循环结束后再对S求平方根,结果仍存入S中,最后返回S。窘考答案:曲帔陋例犯)FILE *pf)I int i;四浜4q*+)tWrrtf(pf,No = %s Mark = %dn, ai.num,ai.s);WR 由小矽丽隼;+s += log(1.0*i);ij = sqrt(s);main() STU aN= (MA0r,814A02,894A03,66hA04,87)4A05,1,77,麻姗j彳中始7,/哪即粕肥B”AO9”,8O,“A10”,71 ;STU *

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁