提交要求

  1. 本页面中的习题包括文档与代码,所有题目均写在同一份文档中,并导出为 PDF 格式,命名为 SynX 招新-基础题目-20xxxxxxxxxxx-XXX.pdf。请注意排版。要求提交代码的题目请将代码放在单独的文件夹中。提交时要求将其打包成 ZIP 压缩包,命名为SynX 招新-基础题目-<学号>-<姓名>.zip,例如:
    SynX 招新-基础题目-20xxxxxxxxxxx-XXX.zip
    ├── SynX 招新-基础题目-20xxxxxxxxxxx-XXX.pdf.pdf
    ├── 奇怪的 C 语言语法
    |   ├── xxx.c
    │   └── xxx.c
    └── 奇怪的内存排列
    |    └── xxx.c
    └── Buffer
        └──xxx.md

    代码的文件名自拟,同时在文档中标注代码文件名所进行的工作。

  2. ZIP 压缩包通过邮箱提交,邮箱为:[email protected],邮件的主题为 SynX 招新-基础题目类题目-<学号>-<姓名>
  3. 题目提交的截止时间为 2022 年 10 月 9 日 24:00,在截止时间之前,可以无限次的提交。
  4. 本页面的题目不要求全部做出来,但请尽量都看一看,完成感兴趣的题目即可。
  5. 题目在完成的过程中可以利用互联网、教材及包括但不限于图书馆的各种图书资源,也可以与他人交流。遇到困难请一定不要闭门造车,积极讨论,或是向出题人寻求帮助。

相关提示

文档写作表达能力是大学生应具有的重要能力之一,也是必要的人生技能之一。“质胜文则野,文胜质则史”,一个优秀的文档应具备充实的内容与美观的排版。对于软件工程这一专业,文档尤其重要:在学习中,文档可以整理我们学到的知识、记录我们的心得体会;在工作中,文档可以记录自己的工作、便于与他人的沟通协作。

Markdown 是一种轻量级的标记语言,这门语言在纯文本中添加一些标记,这些标记会告诉渲染器这段文本期望的表现:它是一级标题还是二级标题?这几行字应当加粗还是转换成斜体?这一段应是正文还是代码段?Markdown 以其简单易用的特性,广泛用于博客、即时通讯、在线论坛、协作软件、文档页面和自述文件等场景。因此我们非常推荐同学们使用 Markdown 来回答招新题,并导出成 PDF 再进行提交。

Markdown 规范并没有规定文本应怎样渲染:一级标题是否应当居中?超链接应当是什么颜色?文本的字体是什么?这些都可以由用户自己进行配置,形成一个适合自己的排版格式(当然,配置是比较复杂麻烦的)。许多 Markdown 编辑器有自己默认的排版格式,这些格式一般都符合大众的审美。

选一个适合自己的 Markdown 编辑器是很有必要的,Visual Studio Code 提供开箱即用的 Markdown 编写与渲染功能,如果要导出为 PDF,可能需要一些第三方插件;Pandoc 是一个文件格式互转的开源工具,你可以使用文本编辑器编写 Markdown 文件,然后使用它将其转换成 PDF 文件并检查,但是使用它需要一定的命令行知识;也可以使用一些 WYSIWYG(所见即所得)的 Markdown 编辑器。

如果你对这些软件提供的 Markdown 排版不满意,那么完全可以使用专业的排版系统 \LaTeX。除非你对自己的 Word 排版水平足够自信,否则不建议使用 Word。当然,提交的形式都是导出为 PDF 再提交。

配置 C 语言开发环境(大一)

[blame cxd]

工欲善其事,必先利其器,一个良好的编译环境会让人心情愉悦。本节要求配置一个适合自己的 C 语言开发环境。
要求:

  • 你可以选择任何操作系统(原生的 Linux、Windows、MACos,以及 WSL、虚拟机等),任何你喜欢的编译器(GCC、Clang 等)
  • 你可以选择任何你喜欢的现代编辑器、IDE(集成开发环境),例如 Visual Studio Code、CLion,或是 Vim 等。
  • 配置完成后可以编写代码并实现在终端或是开发环境中输出 hello world!。
  • 编写文档,文档内容:

    • C语言代码是如何从高级语言变成计算机可以运行的机器语言,中间经历了哪些步骤

我们的建议是原生系统配合 Visual Studio Code/CLion,它们足以应对 C 语言课程的所有程序了。如果你的原生系统是 Windows,我们也很推荐你使用 WSL 环境,它与 Visual Studio Code/CLion 的配合也很好。

轻松的算法题(选做)

[blame cxd]

本题目的很多符号与概念是抽象代数中的,但是本题的核心不涉及太多抽象代数的知识,只要知道一些概念就可以做了,当然,LAuemtihneer 给大家添加了一些背景知识,更新了排版。不过遇到问题时一定要狠狠地 blame 出题人! —— by LAuemtihneer

一些抽象代数的背景知识:

  • 域(Field):一个集合,在这个集合中可以对集合的非零元素进行四则运算。域的概念是数域以及四则运算的推广,例如全体复数集合 \mathbb{C}、全体有理数集合 \mathbb{Q} 都是域,\{0,1\} 也是一个域。域可以被记作 \mathbb{F}
  • 环(Ring):系数取自域 \mathbb{F} 的全体多项式构成一个环,记为 \mathbb{F}[x],即:
    \mathbb{F}[x]=\{a_0+a_1x+\dots+a_nx^n, 0\le n\ {\rm and} \  a_0,a_1,\dots,a_n\in\mathbb{F}\}
  • 度数(degree):对于一个多项式 A(x),最高项的次数即这个多项式的度数,记为 \deg(A)

下面是原题:

f(x),g(x)\in \mathbb{F}[x]g(x)\ne 0,则一定存在多项式 q(x),r(x)\in \mathbb{F}[x],使得 f(x)=q(x)g(x)+r(x)
其中 \deg(r)\le\deg(g) 或者 r(x)=0,而且 q(x)r(x) 唯一。q(x) 称为 g(x)f(x) 的商式,r(x) 称为 g(x)f(x) 的余式,记 g(x)\mod f(x)=r(x)
对于 \mathbb{F}[x] 中的多项式 f(x)g(x),一定存在最大公因式 d(x)\in \mathbb{F}[x],且 d(x) 可以表示成 f(x)g(x) 的一个组合,即存在 u(x),v(x)\in \mathbb{F}[x],使得 d(x)=u(x)f(x)+v(x)g(x)。当 d(x)=1 时,则称 u(x)f(x) \mod g(x) 的逆元。

要求:多项式的系数取 0,1 两个值,(当两者系数大于或等于 2 时,系数 mod 2),求 f(x) \mod g(x) 的逆元多项式 ,记为u(x)
如:f(x)=x^3+x^2+1g(x)=x^2+1, 计算得到 u(x)=x, 因为 1= (x^3+x^2+1)*x+(x^2+1)*(x^2+x+1)

输入:被除多项式 f(x), 除数多项式 g(x)

输出 f(x) \mod g(x) 的逆元

注意:分类讨论

字符串与数字之间的互相转换

[blame LAuemtihneer]

  1. 字符串与数字之间的转换是一种很常见的需求,C 标准库中也提供了许多函数帮助我们进行这一转换。请列举你知道的可以实现数字转字符串以及字符串转数字功能的标准库函数,并指出它们的优缺点(整数以 32 位的 int 为例)。

  2. 有人在 C 语言中设计了一个整型数转字符串的函数,函数原型为:

    char* num_to_string(int num);

    如果让你来设计,你会设计原型是这样的函数吗?为什么?

英语

[blame LAuemtihneer]

马克思曾经说过,“外国语是人生斗争的一种武器”。互联网的引领者之一 David D. Clark 提出过一段关于计算机科学领域的共识精神:“We reject: kings, presidents, and voting. We believe in: rough consensus and running code.”,在理想中,软件工程、计算机技术应当是开放的。以后在论坛上、在代码托管平台上或是在某些会议上,我们可能会与各个国家的朋友们交流。同时这一领域国外发展的比较早,我们应努力学习他们的先进知识,一方面填补自己的不足,另一方面勇于创新,做出自己的成就。这都要求我们要学好外语。

RFC 包含了关于 Internet 的几乎所有重要的文字资料。请阅读 RFC 1925:The Twelve Networking Truths,尽管标题上看它主要面向计算机网络,但显然它的内容不限于此。请选择其中一个或几个感兴趣的 Truth,谈谈你的理解。写完之后注意将它保存好,等到一年后的这个时间再回过头来看看,看看自己有没有有没有不一样的体会,如果你还能记住的话。

好玩的数据结构(需要指针知识,大一)

[blame cxd]

工作室很多学长,学姐喜欢玩王者(有省标大佬),但是他们无法记住王者中各个英雄技能名字,因此需要你来帮助学长牢记英雄名称和技能名称

要求:

  • 使用C语言
  • 使用链表进行存储
  • 只按照英雄名称排序,先按照长度进行排序,若长度一样,则按照拼音进行排序
  • 输入英雄大招的名字与英雄名称,输出链表排序得到排序

建议:

  • 使用malloc获取内存
  • 一定要记着free内存
  • 使用结构体

提交内容:

  • 代码内容
  • 说明文档 (题解,说明思路)提交PDF
  • 运行视频展示

Buffer I?

[blame Galaxy]

Galaxy同学今天上午C语言课上刚刚学习了标准输入输出函数,于是就写了个C语言程序练习一下:

#include<stdio.h>

int main(){
    int num;
    char str1,str2;
    printf("输入一个数字:");
    scanf("%d",&num);
    printf("数字:%d",num);
    printf("输入两个字符:");
    scanf("%c %c",&str1,&str2);
    printf("字符1:%c\n 字符2:%c\n",str1,str2);
    return 0;
}

但是令他困惑的时,最终程序输出结果居然是这样的:

输入一个数字:1
数字:1
输入两个字符:w j
字符1:

字符2:w

这是为什么呢?如何改进可以实现Galaxy预期的功能呢?

Tip:见标题。

Buffer II?

[blame Galaxy]

!!!建议在linux环境下完成下面题目

在你的帮助下,Galaxy成功解决了刚刚的问题,但是好学的Galaxy反手又写了一个C程序:

#include <stdio.h>
#include <string.h>
#include <unistd.h>

int main() {
    const char *msg0 = "hello printf";
    const char *msg1 = "hello fwrite";
    const char *msg2 = "hello write";

    printf("%s", msg0);
    fwrite(msg1, strlen(msg1), 1, stdout);
    write(1, msg2, strlen(msg2));

    _exit(0);
}

但是输出结果却不符合Galaxy同学的预期(结果是什么呢?自己跑一下就知道了),如何改进可以使得msg0~3都能成功输出呢?(方法不止一种)

Tip:

  1. 思考一下writefwriteprintf的区别
  2. 思考一下_exitreturn的区别

Buffer III?

[blame Galaxy]

好学的Galaxy同学还在继续探索,刚刚学习了shell命令的他试着将程序(II中修改成功的程序)结果重定向到a.txt文件里

要求:II中程序的退出方式仍要求采用_exit(0)

gcc test.c
./a.out > a.txt
cat a.txt

但是文件的内容又又又不符合他的预期。

Tip:此题无需改进,只需要说明为什么会出现不符合预期的结果即可。

Buffer IV?

[blame Galaxy]

Tip:此题大一同学选做

Galaxy十分感谢你的帮助,但是他又又又遇到了困难,刚刚学习了进程的他,想在程序里试试fork函数(除此之外,还做了一些其他的小改动,你注意到了吗?):

#include <stdio.h>
#include <string.h>
#include <unistd.h>

int main() {
    const char *msg0 = "hello printf";
    const char *msg1 = "hello fwrite";
    const char *msg2 = "hello write";

    printf("%s", msg0);
    fwrite(msg1, strlen(msg1), 1, stdout);
    write(1, msg2, strlen(msg2));

    fork()

    return 0;
}

Galaxy编译完之后,将程序结果重定向到a.txt文件,

gcc test.c
./a.out > a.txt
cat a.txt

但是a.txt的内容又又又又又又出乎Galaxy同学的预料,
这又又又又难住了Galaxy同学。你能向他解释解释为什么会这样吗?


0 条评论

发表回复

Avatar placeholder

您的电子邮箱地址不会被公开。 必填项已用 * 标注