西南交通大学高级语言程序设计(SCAI000812)第3次实验报告

背景描述:

身为大一新生的我,面对这样一次的实践报告,本来是想趁着网上冲浪的时候顺手解决掉,但是让我气愤的是,居然有学长把这个作业写了一半并且发在了csdn上付费下载,我本人咽不下这口气,所以自己写了这份报告,并且决定免费开源,拒绝恰烂钱的行为,帮助后来的同学。

题目描述:

1.从键盘输入打印行数n,打印如下所示杨辉三角形到屏幕上和字符文件a.txt中。

n=5时的图形是

  1

  1  1

  1  2  1

  1  3  3  1

  1  4  6  4  1

输出的每个整数的格式是%4d。

要求实验报告中描述杨辉三角形的计算与生成算法。

2. 在字符文件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,每输出10个整数换一行。

实验报告中要求给出该程序的流程图。

3. 从键盘输入一个字符文件名,以及一个英文字符串,将该文件中的该英文字符串中的小写英文字母变成大写。

示例:字符文件内容如下:

We are students. All the students study very hard.

So, these students are outstanding students.

输入的字符串为students

则程序运行结束后,文件内容变为:

We are STUDENTS. All the STUDENTS study very hard.

So, these STUDENTS are outstanding STUDENTS.

实验报告中要求描述关键算法或(代码实现方案)以及关键存储结构。

4. 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

注:文本文件以及第四题的HZK16.dat要放在源文件的同一级目录下,因为程序中用的相对路径。

第一题答案:

#include <stdio.h>
int main() {
    FILE *fp;
    int n;
    scanf("%d",&n);
    int a[n][n];
    if((fp = fopen("../a.txt","w")) == NULL) {   //判断文件是否打开成功
        printf("Failture to open the file !\n");
        return 1;
    }
    for(int i = 1;i <= n;i++) {      //创建杨辉三角
        for(int j = 1;j <= i;j++) {
            if(j == 1 || i == j) {
                a[i-1][j-1] = 1;
            } else {
                a[i-1][j-1] = a[i-2][j-1] + a[i-2][j-2];
            }
        }
    }
    for(int i = 0;i < n;i++) {       //写入文件
        for(int j = 0;j <= i;j++) {
            fprintf(fp,"%4d",a[i][j]);
        }
        fputc(10,fp);
    }
    return 0;
}

第二题答案:

#include <stdio.h>
int main() {
    FILE *fp1,*fp2;
    int n;
    if((fp1 = fopen("../b.txt","r")) == NULL) {    //判断文件打开是否成功
        printf("Failture to open the file !\n");
        return 1;
    }
    if((fp2 = fopen("../c.txt","w")) == NULL) {    //判断文件打开是否成功
        printf("Failture to open the file !\n");
        return 1;
    }
    fscanf(fp1,"%d",&n);           //读取n
    int num[n];
    for(int i = 0;i < n;i++) {         //将b中的数字读入
        fscanf(fp1,"%d",&num[i]);
    }
    for(int i = 0;i < n - 1;i++) {        //选择排序
        for(int j = i + 1;j < n;j++) {
            if(num[i] > num[j]) {
                int temp = num[i];
                num[i] = num[j];
                num[j] = temp;
            }
        }
    }
    for(int i = 0,j = 0;i < n;i++,j++) {        //写入数字
        if(j == 9) {
            fprintf(fp2,"\n");
            j -= 9;
        }
        fprintf(fp2,"%6d",num[i]);
    }
    return 0;
}

第三题答案:

#include <stdio.h>
#include <string.h>
int main() {
    char filename[30] = {'\0'};
    char string[30] = {'\0'};
    char read[100] = {'\0'};        //用于保存文件里的内容
    scanf("%s",filename);         //输入文件名
    scanf("%s",string);          //输入字符串
    FILE *fp;
    if((fp = fopen(filename,"r")) == NULL) {      //只读方式打开
        printf("File dosen't exit !\n");
        return 1;
    }
    for(int i = 0;feof(fp) == 0;i++) {         //读取文件内容并保存
        read[i] = fgetc(fp);
    }
    int check = 0;
    for(int i = 0;read[i] != '\0';i++) {         //进行转换
        if(read[i] == string[0]) {          //判断是否到字符串处
            for(int j = 0;j < strlen(string);j++) {   //判断是否是该字符串
                if(read[i+j] == string[j]) {       
                    check++;
                } else {
                    goto Hi;
                }
            }
            Hi:if(check == strlen(string)) {        //进行转换
                for(int j = i;j < strlen(string) + i;j++) {
                    if(read[j] <= 'z' && read[j] >= 'a') {
                        read[j] -= 32;
                    }
                }
                i += check;
            }
            check = 0;
        }
    }
    fp = fopen(filename,"w");         //覆盖掉源文件
    fprintf(fp,"%s",read);          //写入替换后的内容
    return 0;
}

第四题答案:(注:本题是借鉴的另外一位博主的答案,文末附链接,侵删)

#include <stdio.h>
void ShowImage(unsigned char high, unsigned char low, FILE *f);
int main(){
    FILE *fp;
    if((fp = fopen("../HZK16.dat","rb")) == NULL) {       //确认打开文件
        printf("Error opening HZK16\n");
        return 1;
    }
    char high,low;
    printf("请输入一个汉字:\n");         
    scanf(" %c%c",&high,&low);           //输入汉字
    ShowImage(high,low,fp);
    return 0;
}
void ShowImage(unsigned char high, unsigned char low, FILE *f)
{
    int i,j;
    unsigned char buffer[32];       //存储一个汉字所用的32个字节
    long int offset;
    offset = ((high - 0xa1) * 94 + low - 0xa1) * 32;     //计算绝对偏移地址
    fseek(f,offset,0);             //根据偏移寻找到该字字模的第一个字节
    for (i = 0; i < 32; ++i) {       //连续读取32个字节
        buffer[i] = fgetc(f);
    }

    for (i = 0; i < 32; ++i) {       //将32个字节顺序打印
        for (j = 0; j < 8; ++j) {
            if (buffer[i] & 0x80) {
                printf("o");
            }else{
                printf(" ");
            }
            buffer[i] <<= 1;
        }
        if (i % 2) {
            printf("\n"); //如果i%2==1说明该字节是靠后的那个字节,显示完后要换行
        }
    }
}

做题时请看一下注释,因为涉及文件操作,防止因为文件名等原因导致不能运行

本人对c语言方面并不熟练,所以程序里面有很多不足和冗余的地方,希望大家能够包容。

第四题参考链接:https://blog.csdn.net/SHAUNG_YUE/article/details/103212188

  • 46
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 19
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jellyfish Knight

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值