实验内容与要求:

先创建用户家目录下创建文件名为“姓名+学号+04”的子目录,作为本次实验目录,本次实验的所有代码都放到该目录下,要求将所有源代码与数据文件打包成文件”学号-姓名-lab4.tar.gz”, 压缩包与实验报告分别上传到指定目录下。

任务1. 在当前用户目录下创建数据文件student.txt,文件的内部信息存储格式为Sname:S#:Sdept:Sage:Ssex,即“姓名:学号:学院:年龄:性别”,每行一条记录,输入不少于10条学生记录,其中包括学生本人记录。编写程序task41.c,从文件中查找Sdept字段值为“计算机与网络安全学院”的文本行,输出到文件csStudent.txt中,保存时各字段顺序调整为S#:Sname:Sage: Ssex:Sdept。

提示:从终端读入一个文本行到字符串 char buf[MAXSIZE]可调用函数可调用函数:

“fgets(buf, MAXSIZE, stdin);”,其中stdin是表示键盘输入设备的文件指针。

任务2. 调用Unix I/O库函数,编写程序task42.c,从键盘读入5个学生的成绩信息,包括学号、姓名、语文、数学、英语,成绩允许有一位小数,存入一个结构体数组,结构体定义为:

typedef struct _subject {

char sno[20];    //学号

char name[20];   //姓名

float chinese;    //语文成绩

float math; //数学成绩

float english;    //英语成绩

}  subject;

将学生信息,逐条记录写入数据文件data,最后读回第1、3、5条学生成绩记录,显示出来,检查读出结果是否正确。

任务3(选做):在Linux环境下,可以调用库函数gettimeofday测量一个代码段的执行时间,请写一个程序task43.c,测量read、write、fread、fwrite函数调用所需的执行时间,并与prof/gprof工具测的结果进行对比,看是否基本一致。并对四个函数的运行时间进行对比分析。

提示:由于一次函数调用时间太短,测量误差太多,应测量上述函数多次(如10000次)运行的时间,结果才会准确。

附录:使用prof/gprof测量程序运行时间

Linux/Unix环境提供了prof/gprof工具来收集一个程序各函数的执行次数和占用CPU时间等统计信息,使用prof/gprof工具查找程序性能问题,要求编译命令添加-p选项(prof)或-pg选项(gprof),程序执行时就会产生执行跟踪文件mon.out(或gmon.out),再运行prof(或gprof)程序读取跟踪数据,产生运行报告。现在用gprof对以下程序各函数运行性能(占用CPU时间)进行测量。先输入程序源代码:

$ cat  multiply.c

#include <stdio.h>

int fast_multiply(x,  y)

{

return x * y;

}

int slow_multiply(x, y)

{

int i, j, z;

for (i = 0, z = 0; i < x; i++)

z = z + y;

return z;

}

int main(int argc, char *argv[])

{

int i,j;

int x,y;

for (i = 0; i < 2000; i ++) {

for (j = 0; j <  3000 ; j++) {

x = fast_multiply(i, j);

y = slow_multiply(i, j);

}

}

printf("x=%d, y=%d\n", x, y);

return 0;

}

然后编译和执行该程序,检查是否函数性能跟踪数据文件gmon.out:

$ gcc  -pg  -o  multiply multiply.c   -g

$ ./multiply

x=5995001, y=5995001

$ ls gmon.out

gmon.out

最后,用gprof命令产看各函数执行时间:

$ gprof multiply gmon.out

Flat profile:

Each sample counts as 0.01 seconds.

%    cumulative  self                 self     total

time   seconds    seconds   calls        us/call   us/call  name

99.44    14.11    14.11     6000000     2.35    2.35    slow_multiply

0.42     14.17    0.06                                 main

0.14     14.19    0.02      6000000      0.00    0.00   fast_multiply

在这里,slow_multipy和fast_multiply执行600000次所花运行时间为14.11s和0.02秒。

任务4(选做):在Linux系统环境下,编写程序task44.c,对一篇英文文章文件的英文单词词频进行统计。

  1. 以“单词:次数”格式输出所有单词的词频
  2. 以“单词:次数”格式、按词典序输出各单词的词频
  3. 以“单词:次数”格式输出出现频度最高的10个单词的词频

例如,若某个输入文件内容为:

GNU is an operating system that is free software—that is, it respects users' freedom.

The development of GNU made it possible to use a computer without software that would trample your freedom.

则输出应该是:

GNU:2

is:3

it:2

……

提示:可以调用字符串处理函数、二叉树处理函数等库函数

三、涉及实验的相关情况介绍(包含使用软件或实验设备等情况):

   安装Linux操作系统的计算机

四、报告内容(给出每个任务的要求、设计思想、源代码,后接编译过程、测试数据与运行结果截图)

(1)

先创建一个子目录:mkdir 文件名;再在子目录下创建一个.c文件一个.txt文件:touch student.txt  touch task41.c;向文件中写入内容:cat>文件名 ;查看文件内容:cat 文件名

源代码:

(1)、

#include<stdio.h>
#include<string.h>
#define MAXSIZE 200
void main()
{
FILE* fp1, * fp2;
char buf[MAXSIZE];
char* a[6];
char buffer[100];
char check[] = "计算机与网络安全学院";
char s[2]=":";
if ((fp1 = fopen("student.txt", "r")) == NULL)
{
printf(" Open Failed!");
//return 0;
}
if ((fp2 = fopen("csStudent.txt", "a+")) == NULL)
{
printf(" Open Failed!");
//return 0;
}
while (!feof(fp1))//文本结束时退出循环
{
fgets(buf, MAXSIZE, fp1);//一行行读入
if (strstr(buf, check))//判断是否属于“计算机与网络安全学院”
{
a[0] = strtok(buf, s);//切割字符串成五部分
a[1] = strtok(NULL, s);
a[2] = strtok(NULL, s);
a[3] = strtok(NULL, s);
a[4] = strtok(NULL, s);
a[4][3] = 0;//将换行符去掉
sprintf(buffer, "%s:%s:%s:%s:%s\n", a[1], a[0], a[3], a[4], a[2]);//格式化写入buffer
fputs(buffer, fp2);//将buffer写入文本csStudent
}
}
fclose(fp1);
fclose(fp2);
//return 0;
}

编译过程:

gcc task41.c -o task41

./task41

查看csStudent.txt文件内容:cat csStudent.txt

测试数据:

运行结果:

放截图

运行结果:

放截图

(2)、

源代码:

#include<stdio.h>

#include<fcntl.h>

#include<sys/types.h>

#include<unistd.h>

typedef struct _subject {

  char sno[20]; //学号

  char name[20]; //姓名

  float chinese; //语文成绩

  float math; //数学成绩

  float english; //英语成绩

}subject;

void main(){

  subject su1[5];

  subject as;

  int i;

  int fd;

  fd=open("data",O_WRONLY|O_CREAT|O_TRUNC,0777);

  for(i = 0;i < 5; i ++){

    printf("该学生的学号为:\n");

    scanf("%s", as.sno);

    printf("该学生的姓名为:\n");

    scanf("%s", as.name);

    printf("该学生的语文成绩为:\n");

    scanf("%f", &as.chinese);

    printf("该学生的数学成绩为:\n");

    scanf("%f", &as.math);

    printf("该学生的英语成绩为:\n");

    scanf("%f", &as.english);

    write(fd,(void*)&as,sizeof(subject));

  }

  close(fd);

  fd=open("data",O_RDONLY,0);

  for(i = 0;i < 5;i ++)

    read(fd,(void*)&su1[i],sizeof(subject));

  for(i = 0;i < 5; i+=2){

printf("%s %s %.1f %.1f %.1f\n",su1[i].sno,su1[i].name,su1[i].chinese,su1[i].math,su1[i].english);

  }

  close(fd);

  }

编译过程:

gcc task42.c -o task42

./task42

源代码:

#include <stdio.h>

#include <fcntl.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <sys/time.h>

#include <unistd.h>

void wewrite(int fd)

{

    for (int i = 0; i < 10000000; i++)

        write(fd, "a", 1);

}

void weread(int fd, char a[4])

{

    for (int i = 0; i < 100000000; i++)

        read(fd, a, 1);

}

void wefread(FILE *fp, char a[4])

{

    for (int i = 0; i < 100000000; i++)

        fread(a, sizeof(char), 1, fp);

}

void wefwrite(FILE *fp)

{

    for (int i = 0; i < 100000000; i++)

        fwrite("a", sizeof(char), 1, fp);

}

int main()

{

    struct timeval tp;

    struct timeval tp1;

    double g_time_start;

    double g_time_end;

    //测量write函数

    int fd = open("test.txt", O_WRONLY | O_CREAT | O_TRUNC, 0777);

    gettimeofday(&tp, NULL);

    g_time_start = tp.tv_sec * 1000000 + tp.tv_usec;

    for (int i = 0; i < 10000; i++)

        write(fd, "a", 1);

    gettimeofday(&tp1, NULL);

    g_time_end = tp1.tv_sec * 1000000 + tp1.tv_usec;

    printf("write函数的运行时间为:%.4f微秒\n", (g_time_end - g_time_start) / 10000);

    close(fd);

    //测量read函数

    fd = open("test.txt", O_RDONLY, 0);

    char a[4];

    gettimeofday(&tp, NULL);

    g_time_start = tp.tv_sec * 1000000 + tp.tv_usec;

    for (int i = 0; i < 10000; i++)

        read(fd, a, 1);

    gettimeofday(&tp1, NULL);

    g_time_end = tp1.tv_sec * 1000000 + tp1.tv_usec;

    printf("read函数的运行时间为:%.4f微秒\n", (g_time_end - g_time_start) / 10000);

    //使用gprof工具测量write函数

    close(fd);

    fd = open("test.txt", O_WRONLY | O_CREAT | O_TRUNC, 0777);

    wewrite(fd);

    close(fd);

    //使用gprof工具测量read函数

    fd = open("test.txt", O_RDONLY, 0);

    weread(fd, a);

    close(fd);

    //测量fwrite函数

    FILE *fp = fopen("test.txt", "w");

    gettimeofday(&tp, NULL);

    g_time_start = tp.tv_sec * 1000000 + tp.tv_usec;

    for (int i = 0; i < 10000; i++)

        fwrite("a", sizeof(char), 1, fp);

    gettimeofday(&tp1, NULL);

    g_time_end = tp1.tv_sec * 1000000 + tp1.tv_usec;

    printf("fwrite函数的运行时间为:%.4f微秒\n", (g_time_end - g_time_start) / 10000);

    fclose(fp);

    //测量fread函数

    fp = fopen("test.txt", "r");

    gettimeofday(&tp, NULL);

    g_time_start = tp.tv_sec * 1000000 + tp.tv_usec;

    for (int i = 0; i < 10000; i++)

        fread(a, sizeof(char), 1, fp);

    gettimeofday(&tp1, NULL);

    g_time_end = tp1.tv_sec * 1000000 + tp1.tv_usec;

    printf("fread函数的运行时间为:%.4f微秒\n", (g_time_end - g_time_start) / 10000);

    fclose(fp);

    //使用gprof工具测量fwrite函数

    fp = fopen("test.txt", "w");

    wefwrite(fp);

    fclose(fp);

    //使用gprof工具测量fwrite函数

    fp = fopen("test.txt", "r");

    wefread(fp, a);

    fclose(fp);

}

编译过程:

gcc task43.c -o task43

./task43

运行结果:

放截图

源代码:

#include <stdio.h>

#include <string.h>

#include <sys/types.h>

#include <fcntl.h>

#include <unistd.h>

int main()

{

    int fd, i, j, y;

    char cap[500][20], temp[20];

    int num[500], count = 0, flag, isEmpty;

    char c;

    fd = open("English.txt", O_RDONLY, 0);

    for (i = 0; i < 500; i++)

    {

        isEmpty = 0;

        for (j = 0; j < 20; j++)

        {

            read(fd, &c, sizeof(char));

            if ((c >= 65 && c <= 90) || (c >= 97 && c <= 122))

            {

                temp[j] = c;

            }

            else if (c == '\0')

            {

                isEmpty = 2;

                break;

            }

            else

            {

                temp[j] = '\0';

                isEmpty = 1;

                break;

            }

        }

        if (isEmpty == 2)

        {

            break;

        }

        if (isEmpty == 1)

        {

            flag = 0;

            for (y = 0; y < count; y++)

            {

                if (!strcmp(cap[y], temp))

                {

                    num[y]++;

                    flag = 1;

                    break;

                }

            }

            if (flag == 0)

            {

                strcpy(cap[count], temp);

                num[count] = 1;

                count++;

            }

        }

    }

    for (i = 0; i < count; i++)

    {

        for (j = i + 1; j < count; j++)

        {

            if (strcmp(cap[i], cap[j]) > 0)

            {

                strcpy(temp, cap[i]);

                strcpy(cap[i], cap[j]);

                strcpy(cap[j], temp);

                y = num[i];

                num[i] = num[j];

                num[j] = y;

            }

        }

    }

    printf("按词典序输出各单词的词频:\n");

    for (i = 1; i < count; i++)

        printf("%s:%d\n", cap[i], num[i]);

    for (i = 0; i < count; i++)

    {

        for (j = i + 1; j < count; j++)

        {

            if (num[i] < num[j])

            {

                strcpy(temp, cap[i]);

                strcpy(cap[i], cap[j]);

                strcpy(cap[j], temp);

                y = num[i];

                num[i] = num[j];

                num[j] = y;

            }

        }

    }

    printf("输出出现频度最高的10个单词的词频:\n");

    for (i = 1; i < 11 && i < count; i++)

        printf("%s:%d\n", cap[i], num[i]);

        }

编译过程:

gcc tasks44.c -o task44

./task44

测试数据:

放截图

运行结果:

放截图

Linux实验一实验报告相关推荐

  1. linux内存管理实验malloc,linux内存管理实验报告.doc

    linux内存管理实验报告 操作系统实验报告 院别:XXXXXX 班级:XXXXXX 学号:XXXXXX 姓名:稻草人 实验题目:内存管理实验 实验目的 通过本次试验体会操作系统中内存的分配模式: 掌 ...

  2. linux使用环境实验报告,Linux 及其使用环境实验报告.doc

    计算机语言与程序设计上机实验报告 学号: 姓名: 所在系: 班级: 实验名称: 实验1 Linux 及其使用环境 实验日期 实验指导教师 实验机房及机号 ----------------------- ...

  3. linux系统进程控制实验报告,Linux进程控制实验报告.doc

    里奴性进程控制实验报告 实验名称: Linux进程控制 实验要求:一.编写一个Linux系统C程序,由父亲创建2个子进程,再由子进程各自从控制台接收一串字符串,保存在各自的全局字符串变量中,然后正常结 ...

  4. Linux系统内存管理实验报告,linux内存管理实验报告

    <linux内存管理实验报告>由会员分享,可在线阅读,更多相关<linux内存管理实验报告(13页珍藏版)>请在人人文库网上搜索. 1.操作系统实验报告院别:XXXXXX班级: ...

  5. linux实验实训报告,linux实验实训报告.doc

    linux实验实训报告.doc 内蒙古商贸职业学院计算机系 学 生 校 内 实 验 实 训 报 告 2011--2012学年 第二学期 系部:计算机系 课程名称:Linux网络环境管理 专业班级: 内 ...

  6. 操作系统 实验报告 linux 内核,linux操作系统内核实验报告.doc

    linux操作系统内核实验报告.doc linux操作系统内核实验报告 篇一:linux操作系统实验报告 LINUX操作系统实验报告 姓 名 班级学号 指导教师 2011 年 05月 16 日 实验一 ...

  7. 课程linux实验报告,Linux课程综合训练实验报告

    Linux课程综合训练实验报告 1) 实验目的: 熟练掌握Linux操作系统的使用,掌握Linux的各项系统管理功能,掌握Linux下各类网络服务的安装.配置以及使用,并能用shell脚本实现简单的管 ...

  8. linux服务器搭建实验4报告,LINUX实验四报告

    <LINUX实验四报告>由会员分享,可在线阅读,更多相关<LINUX实验四报告(6页珍藏版)>请在人人文库网上搜索. 1.一. 实验目的掌握Linux系统中常用命令的作用和命令 ...

  9. 课程linux实验报告,Linux操作系统课程实验报告.doc

    Linux操作系统课程实验报告.doc Linux操作系统课程实验报告班级姓名学号指导老师田丽华完成时间2014年7月目录一.实验目的1二.实验要求1三.实验内容1[第一题]1[第二题]2[第三题]4 ...

  10. linux课程实验报告,Linux操作系统课程实验报告

    Linux操作系统课程实验报告 Linux操作系统 课程实验报告 班级: 姓名: 学号: 指导老师:田丽华 完成时间:2014年7月 目录 一.实验目的1 二.实验要求1 三.实验内容1 [第一题]1 ...

最新文章

  1. JDK 源码 Integer解读之一(toString)
  2. [Eclipse] - Eclipse空格替换tab
  3. Paxos 实现日志复制同步(Multi-Paxos)
  4. 中国飞机制造及修理行业未来需求预测及发展态势研究报告2021版
  5. Struts第一个案例搭建
  6. 服务器控件开发之基本概念
  7. 浅谈程序员的职业规划
  8. python循环中的else_python 循环中else的简单示例
  9. C#通用类库--短信猫操作类1(原始AT命令)
  10. Linux配置防火墙
  11. 2018-2019-2 网络对抗技术 20165322 Exp8 Web基础
  12. 斐讯K2 刷华硕固件
  13. 世界第一行销之神杰 亚伯拉罕首次中国大陆行
  14. 香港地区Airbnb数据可视化分析
  15. SSL-ZYC 邮票
  16. 基于DEM的GIS水文分析——河网与集水区域的提取
  17. 偷学三太子敖丙的功力
  18. java通过schema校验xml
  19. MSproject软件在项目管理中实际操作干货
  20. 【springboot】上传并解析excel表,使用postman测试上传文件,解决excel版本报错问题

热门文章

  1. 一次千万级别数据的报表查询方案优化
  2. partial 使用(python)
  3. MFC Windows 程序设计[161]之启动画面(附源码)
  4. 关于GPU显存占满(即memory usage 很大),但GPU-util很小,导致模型训练很慢
  5. matlab中相关系数图并绘图,相关系数图可视化
  6. 题解- [USACO09OCT]热浪Heat Wave
  7. python同步枚举(遍历)两个list_拔剑-浆糊的传说_新浪博客
  8. 安装docker 并构建私有库
  9. 高级语言参数传递方式_大学C语言难学?来这里教你自学C语言!高分不是梦!干货预警!!!...
  10. 2022年熔化焊接与热切割考试资料及熔化焊接与热切割免费试题