实验内容:
1. 在字符文件b.txt中录入n个整数,录入整数的分隔符为空格、换行或TAB。若n=5,则b.txt的一种正确格式为
5
9 12 -15
30 -7
即b.txt的第一个数为n,后面是n个整数。
编写程序,从文件b.txt读出n值,建立长度为n的动态1维整型数组,然后继续从文件b.txt读入n个整数存于该数组,进行由小到大排序,最后将排序结果输出到字符文件c.txt中。
要求的输出格式是每个整数%6d,每输出5个整数换一行。
实验报告中要求给出该程序的流程图。
2.16´16点阵汉字的显示。从键盘输入一个汉字,从16´16点阵汉字库文件HZK16.dat中毫读取汉字点阵信息,打印汉字到控制台屏幕上(构成汉字的每个点用输出字母O表示)。
输入输出示例:
请输入一个汉字:中¿
O
O
O O
OOOOOOOOOOOOOO
O O O
O O O
O O O
O O O
OOOOOOOOOOOOO
O O O
O
O
O
O
O
O
提示1:16*16点阵字库文件HZK16.dat的存储格式。
以汉字“我”为例,16*16点阵构成的字形信息用二进制编码(1表示有点,0表示无点)形成32字节,每行2个字节,共16行,如下所示。这32个字节在文件中的存储顺序为:每行从左向右,行从上到下。
16*16点阵字库文件HZK16.dat中,每个汉字(32字节字形信息)按区位码由小到大的顺序存储。以汉字“啊”为例,它的区号为16,位号为1,故它的32字节字形信息在文件中的起始字节偏移量offset=((区号-1)*94+位号-1)*32。
0000010010000000 0x04,0x80
0000111010100000 0x0E,0xA0
0111100010010000 0x78,0x90
0000100010010000 0x08,0x90
0000100010000100 0x08,0x84
1111111111111110 0xFF,0xFE
0000100010000000 0x08,0x80
0000100010010000 0x08,0x90
0000101010010000 0x0A,0x90
0000110001100000 0x0C,0x60
0001100001000000 0x18,0x40
0110100010100000 0x68,0xA0
0000100100100000 0x09,0x20
0000101000010100 0x0A,0x14
0010100000010100 0x28,0x14
0001000000001100 0x10,0x0C
提示2:GB2312-80汉字内码
GB2312-80共收录约6700多个汉字以及其它符号,用一个94行*94列的表格表示(最多可表示94*94个汉字和符号)。某个汉字所在的行号(从1开始)称为“区号”,列号(从1开始)称为“位号”,形成区位码。
如:汉字“啊”在16行,第1列,故它的区位码为(16,1)。
在存储器中,为了与ASCII码区别,用内码表示一个汉字的编码,汉字的内码为一个2字节编码,第一字节=区号+160,第2字节=位号+160,故汉字“啊”的内码为(176,161)。
已知汉字内码,则在HZK16.dat中该汉字32字节字形信息首字节的存储位置为
offset=((内码第一字节-161)*94+(内码第二节字-161))*32
«以下撰写实验报告并粘贴源程序代码»
1.
#include<stdio.h>
#include<stdlib.h>
#define N500
/* runthis program using the console pauser or add your own getch,system("pause") or input loop */
intmain(int argc, char *argv[]) {
int n;
int i,j;
int a[N];
int temp;
if(fopen("b.txt","r")==NULL)
{
printf("failed to open,close theprogram");
exit(1);
}
FILE*p=fopen("b.txt","r");
fscanf(p,"%d",&n);
fgetc(p);
for(i=1;i<=n;i++)
{
//a[i-1]=fgetc(p);
fscanf(p,"%d",a+i-1);
fgetc(p);
}
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(a[i]>a[j])
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
p=fopen("c.txt","w");
for(i=1;i<=n;i++)
{
fprintf(p,"%6d",a[i-1]);
if(i%5==0) fputc('\n',p);
}
return 0;
}
结论:本程序可以实现C语言字符文件读写,达到预期的设想,使我掌握了文件处理的相关程序算法。
2.
#include <stdio.h>
#include<stdlib.h>
#defineN 50
/*run this program using the console pauser or add your own getch,system("pause") or input loop */
intmain(int argc, char *argv[]) {
char s[N];
char cn;
int i,j,k;
int flag;
printf("请输入要打印的汉字:\n");
gets(s);
// printf("%d\n%d",s[0]&127+128,s[1]&127+128);
//printf("%x\n%x",s[0]&((1<<8)-1),s[1]&((1<<8)-1)|(1<<7));
if(fopen("HZK16.dat","r")==NULL)
{
printf("failed to open,closethe program");
exit(1);
}
FILE*p=fopen("HZK16.dat","r");
//printf("%d",(((s[0]&127+128)-161)*94+((s[1]&127+128)-161))*32);
fseek(p,(((s[0]&127+128)-161)*94+((s[1]&127+128)-161))*32,SEEK_SET);
// fseek(p,136928,SEEK_SET);
printf("\n");
//printf("%x",fgetc(p));
for(i=1;i<=16;i++)
{
for(j=1;j<=2;j++)
{
fscanf(p,"%c",&cn);
//flag=cn&(128);
// printf("%x\n",flag);
//printf("%d",cn);
for(k=1;k<=8;k++)
{
// flag=cn&(128>>(k-1))>>(8-k);
flag=cn>>(8-k)&1;
// printf("%d",flag);
if(flag==1)printf("0");
else printf(" ");
}
// printf("%x",cn);
}
printf("\n");
}
return 0;
}
结论:此程序已经能够运行,算法已经完善,但是文件的创建不能实现,导致不可打开项目,此次实验未能解决此难题,还需后续继续探究,完善程序与文件的处理。