Skip to content

Commit 507b1af

Browse files
committed
+slide: introduction
1 parent 31c4542 commit 507b1af

File tree

8 files changed

+413
-1
lines changed

8 files changed

+413
-1
lines changed

.gitignore

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
*
22
!*/
33
![0-9]*/*.md
4-
![0-9]*/figs/*.png
4+
![0-9]*/*/*.png
5+
!Slides/*/*.tex
6+
!Slides/*/*.bib
7+
!Slides/*/*/*.tex
8+
!Slides/*/*/*.png
Loading
Loading
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
\documentclass[10pt]{beamer}
2+
3+
\input{preamble}
4+
5+
\title{程序设计教程}
6+
\subtitle{环境搭建和C语言入门}
7+
\date{2019-10-25}
8+
\author{唐瑞泽}
9+
\institute{tangruize@smail.nju.edu.cn}
10+
11+
\begin{document}
12+
13+
\maketitle
14+
15+
\begin{frame}{目录}
16+
\setbeamertemplate{section in toc}[sections numbered]
17+
\tableofcontents[hideallsubsections]
18+
\end{frame}
19+
20+
\input{sections/environment}
21+
22+
\input{sections/c-tutorial}
23+
24+
\begin{frame}[standout]
25+
Questions?
26+
\end{frame}
27+
28+
\end{document}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
\usepackage{xeCJK}
2+
3+
\usepackage[T1]{fontenc}
4+
5+
\usepackage[utf8]{inputenc}
6+
7+
8+
\usetheme{metropolis}
9+
\usepackage{appendixnumberbeamer}
10+
11+
\usepackage{booktabs}
12+
\usepackage[scale=2]{ccicons}
13+
14+
\usepackage{pgfplots}
15+
16+
\usepackage{xspace}
17+
18+
\usepackage{listings}
19+
20+
\lstset{
21+
basicstyle=\ttfamily,
22+
escapeinside=||
23+
}
24+
25+
\usepackage{graphicx}
26+
27+
\newcommand{\emptyline}{\vspace{\baselineskip}}
28+
29+
\usepackage{ulem}
Lines changed: 181 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,181 @@
1+
\section{C语言入门}
2+
3+
\begin{frame}[fragile]{再看第一个程序}
4+
\begin{columns}[T,onlytextwidth]
5+
\column{0.50\textwidth}
6+
\emptyline
7+
\emptyline
8+
\emptyline
9+
\small\begin{lstlisting}[language=c,numbers=left]
10+
/* my first program in C */
11+
#include <stdio.h>
12+
int main() {
13+
printf("Hello, world!\n");
14+
}
15+
\end{lstlisting}
16+
17+
\column{0.05\textwidth}
18+
\column{0.45\textwidth}
19+
\begin{block}{第1行}
20+
C语言风格注释, C99标准可以使用C++单行注释(//\ldots)
21+
\end{block}
22+
\begin{block}{第2行}
23+
包含头文件, 该头文件声明了printf()函数(去掉编译试试?)
24+
\end{block}
25+
\begin{block}{第3行}
26+
定义了main函数, 这个函数是程序入口(改个名字试试?)
27+
\end{block}
28+
\begin{block}{第4行}
29+
输出\textquotedblleft \texttt{Hello, world!\textbackslash n}\textquotedblright
30+
\end{block}
31+
\end{columns}
32+
\end{frame}
33+
34+
\begin{frame}[fragile]{变量}
35+
\begin{verbatim}
36+
int a = 8, b = 4, c = 7, d = 6, result_24;
37+
result_24 = (a - c) * b * d;
38+
\end{verbatim}
39+
\begin{itemize}[<+- | alert@+>]
40+
\item 代码中的\texttt{a}, \texttt{b}, \texttt{c}, \texttt{d}, \texttt{result\_24}是变量名
41+
\item 变量名由字母, 数字和下划线(\_)组成
42+
\item 不能以数字开头, 尽量不要以下划线开头
43+
\item 不能是C语言关键词
44+
\item \textbf{大小写敏感}
45+
\end{itemize}
46+
\end{frame}
47+
48+
\begin{frame}[fragile]{基本数据类型}
49+
\begin{columns}[T,onlytextwidth]
50+
\column{0.20\textwidth}
51+
\begin{verbatim}
52+
_Bool a;
53+
char b;
54+
int c;
55+
double d;
56+
\end{verbatim}
57+
58+
\column{0.80\textwidth}
59+
\begin{itemize}[<+- | alert@+>]
60+
\item 数据存储在内存中, 计算机看来都是01比特串
61+
\item 变量名使计算机能找到变量存储在内存的什么地方
62+
\item 而类型确定了该内存区域二进制值的转译方式
63+
\item 代码中\texttt{bool}, \texttt{char}, \texttt{int}, \texttt{double}是几种数据类型
64+
\item 具体解释见 \href{http://problemoverflow.top/c/1.C%E8%AF%AD%E8%A8%80%E5%85%A5%E9%97%A8/1.1.%E5%8F%98%E9%87%8F%E5%92%8C%E7%B1%BB%E5%9E%8B.html}{problemoverflow.top/c}
65+
\item 可以编译运行main.cpp观察你的开发环境下各种数据类型的字节长度和最小值最大值
66+
\end{itemize}
67+
\end{columns}
68+
\end{frame}
69+
70+
\begin{frame}[fragile]{条件语句}
71+
\begin{itemize}[<+- | alert@+>]
72+
\item 如果今天是周六, 我就出去玩; 如果是周日, 就睡大觉; 否则去上学
73+
\item 翻译成C代码:
74+
\begin{verbatim}
75+
if (today == SATURDAY) {
76+
// play outside
77+
} else if (today == SUNDAY) {
78+
// sleep all day
79+
} else {
80+
// go to school...
81+
}
82+
\end{verbatim}
83+
\item if条件语句中的\texttt{else if}和\texttt{else}语句块不是必需的
84+
\item 语句块中如果只有一个语句, 则可以去掉大括号
85+
\item 相等(==), 不等(!=), 大于(>), 不小于(>=), 逻辑与(\&\&), 逻辑或(||)
86+
\item \textbf{判断相等是两个等号}
87+
\end{itemize}
88+
\end{frame}
89+
90+
\begin{frame}[fragile]{循环语句}
91+
\begin{quote}
92+
Three or more, use a for.
93+
\end{quote}
94+
95+
\begin{itemize}[<+- | alert@+>]
96+
\item 程序员最讨厌重复劳动, 循环语句是消除重复劳动的利器
97+
\item 现在让你打印 \texttt{Hello, world!} 三千遍
98+
\item 我们分别用for循环和while循环实现:
99+
\item \begin{verbatim}
100+
for (int i = 0; i != 3000; ++i) {
101+
printf("Hello, world!\n");
102+
}
103+
\end{verbatim}
104+
\item \begin{verbatim}
105+
int i = 3000;
106+
while (i--)
107+
printf("Hello, world!\n");
108+
\end{verbatim}
109+
110+
\end{itemize}
111+
\end{frame}
112+
113+
\begin{frame}[fragile]{格式化输出printf()}
114+
\begin{itemize}[<+- | alert@+>]
115+
\item 前面已经用过 printf() 了, 它的功能远不止打印 \texttt{Hello, world!}
116+
\item 打印一个char类型字符ch: \texttt{printf("\%c", ch);}
117+
\item 打印一个int类型的整数i: \texttt{printf("\%d", i);}
118+
\item 打印一个short int类型的整数s: \texttt{printf("\%hd", s);}
119+
\item 打印一个double类型的浮点数d和保留两位小数: \texttt{printf("\%f \%.2f", d, d);}
120+
\item 观察有什么不同?
121+
\end{itemize}
122+
\end{frame}
123+
124+
\begin{frame}[fragile]{格式化输出printf()}
125+
格式化字符串可以很复杂:
126+
\href{http://www.cplusplus.com/reference/cstdio/printf/}{\texttt{\%[flags][width][.precision][length]\alert{specifier}}}
127+
\begin{table}
128+
\begin{tabular}{@{} cl @{}}
129+
\toprule
130+
\textbf{specifier} & \textbf{输出} \\
131+
\midrule
132+
d 或 i & 有符号十进制整数 \\
133+
u & 无符号十进制整数 \\
134+
o & 无符号八进制 \\
135+
x & 无符号十六进制 \\
136+
f & 十进制小数 \\
137+
e & 科学计数法 \\
138+
g & \%e或\%f输出长度短的 \\
139+
c & 字符 \\
140+
s & 字符串 \\
141+
p & 指针地址 \\
142+
\% & 打印特殊字符: \% \\
143+
\bottomrule
144+
\end{tabular}
145+
\caption{常用的specifier}
146+
\end{table}
147+
\end{frame}
148+
149+
\begin{frame}[fragile]{格式化输出printf()}
150+
\href{http://www.cplusplus.com/reference/cstdio/printf/}{\texttt{\%[flags][width][.precision]\alert{[length]}specifier}}
151+
\begin{table}
152+
\begin{tabular}{clll}
153+
\toprule
154+
& \multicolumn{3}{c}{\textbf{specifiers}} \\
155+
\textbf{length} & d i & u o x X & f F e E g G a A \\
156+
\midrule
157+
(none) & int & unsigned int & double \\
158+
hh & signed char & unsigned char & \\
159+
h & short int & unsigned short int & \\
160+
l & long int & unsigned long int & \\
161+
ll & long long int & unsigned long long int & \\
162+
\bottomrule
163+
\end{tabular}
164+
\caption{常用的length}
165+
\end{table}
166+
\end{frame}
167+
168+
\begin{frame}[fragile]{格式化输入scanf()}
169+
\begin{itemize}[<+- | alert@+>]
170+
\item 格式: \href{http://www.cplusplus.com/reference/cstdio/scanf/}{\%[*][width][length]specifier}
171+
\item 读取整数到int类型变量i: \texttt{scanf("\%d", \alert{\&}i);}
172+
\item 大多数specifier, length和printf()的相同
173+
\item 除了double要用\texttt{\%lf}, 而 float 仍然用 \texttt{\%f}
174+
\item printf()输出double也可以用 \texttt{\%lf}
175+
\item 小技巧: scanf()的返回值表示成功读取了多少个变量, 如果小于等于0表示出错或者输入结束, 可以放在循环的条件中:
176+
\begin{verbatim}
177+
while (scanf("%d", &i) > 0)
178+
sum += i;
179+
\end{verbatim}
180+
\end{itemize}
181+
\end{frame}
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
\section{环境搭建}
2+
3+
\begin{frame}[fragile]{第一个程序}
4+
\begin{columns}[T,onlytextwidth]
5+
\column{0.50\textwidth}
6+
\begin{block}{源代码}
7+
\small\begin{lstlisting}[language=c]
8+
#include <stdio.h>
9+
int main() {
10+
printf("Hello, world!\n");
11+
}
12+
\end{lstlisting}
13+
\end{block}
14+
15+
\column{0.05\textwidth}
16+
\begin{block}{}\end{block}
17+
\begin{block}{->}\end{block}
18+
\begin{block}{}\end{block}
19+
20+
\column{0.30\textwidth}
21+
\begin{block}{执行结果}
22+
\small\begin{lstlisting}
23+
Hello, world!
24+
\end{lstlisting}
25+
\end{block}
26+
\end{columns}
27+
28+
\begin{itemize}[<+- | alert@+>]
29+
\item C源代码是如何变成 exe 文件的呢?
30+
\item 编译
31+
\end{itemize}
32+
\end{frame}
33+
34+
\begin{frame}[fragile]{如何编译C源代码?}
35+
\begin{itemize}[<+- | alert@+>]
36+
\item 需要一个编译器
37+
\item 常见的编译器: GCC, CLANG, MSVC
38+
\item 以GCC为例, 编译并执行main.c
39+
\begin{verbatim}
40+
gcc main.c -o main
41+
./main
42+
\end{verbatim}
43+
\item 代码用什么修改? VIM? EMACS?
44+
\item 改了代码再编译呢? 重新敲一遍? 写个脚本或Makefile?
45+
\item 出BUG了,怎么调试呢? 听说可以用GDB?
46+
\item \sout{可是vim, gcc, make, gdb我都不会啊}
47+
\item 你需要一个集成开发环境(IDE)
48+
\end{itemize}
49+
\end{frame}
50+
51+
\begin{frame}[fragile]{集成开发环境}
52+
VS和CLion都很优秀, 这里有安装教程:
53+
\href{http://problemoverflow.top/c/0.%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/0.0.Microsoft_Visual_Studio.html}{VS},
54+
\href{http://problemoverflow.top/c/0.%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/0.1.CLion.html}{CLion}
55+
56+
CLion相比于VS有许多\href{http://problemoverflow.top/index.php?qa=33&qa_1=%E6%89%80%E4%BB%A5%E5%88%B0%E5%BA%95%E7%94%A8%E4%BB%80%E4%B9%88-ide-%E5%86%99-oj%EF%BC%9F&show=36#a36}{优点}
57+
\begin{itemize}
58+
\item 使用跨平台的CMAKE管理工程
59+
\item 编辑器提示更智能
60+
\item 可高度定制等
61+
\end{itemize}
62+
如果还没有安装CLion, 请下载: \href{https://www.jetbrains.com/clion/download}{CLion}, \href{https://nchc.dl.sourceforge.net/project/mingw-w64/Toolchains%20targetting%20Win64/Personal%20Builds/mingw-builds/8.1.0/threads-posix/seh/x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z}{MinGW}
63+
\end{frame}
64+
65+
\begin{frame}[fragile]{CLion快速配置}
66+
\href{https://nchc.dl.sourceforge.net/project/mingw-w64/Toolchains%20targetting%20Win64/Personal%20Builds/mingw-builds/8.1.0/threads-posix/seh/x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z}{MinGW} (提供make, gcc, g++, gdb):
67+
68+
解压缩 \href{https://nchc.dl.sourceforge.net/project/mingw-w64/Toolchains%20targetting%20Win64/Personal%20Builds/mingw-builds/8.1.0/threads-posix/seh/x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z}{x86\_64-8.1.0-release-posix-seh-rt\_v6-rev0.7z} 到任意目录
69+
70+
\emptyline
71+
\href{https://www.jetbrains.com/clion/download}{CLion} (IDE):
72+
73+
安装 \href{https://www.jetbrains.com/clion/download}{CLion-2019.2.4.exe}, 打开 CLion 设置, 将刚才的解压目录填入红框
74+
\begin{figure}[ht!]
75+
\centering
76+
\includegraphics[width=75mm]{figs/clion_mingw.png}
77+
\caption{CLion 配置MinGW}
78+
\end{figure}
79+
\end{frame}
80+
81+
\begin{frame}[fragile]{自定义 CMakeLists.txt}
82+
下载 \href{http://problemoverflow.top/download/OJ.zip}{http://problemoverflow.top/download/OJ.zip}
83+
84+
解压并用CLion打开该目录, 打开 CMakeLists.txt
85+
86+
\emptyline
87+
88+
部分解释:
89+
\begin{itemize}[<+- | alert@+>]
90+
91+
\item 第4-5行: 定义使用的标准为C99和C++11 (符合OJ设置)
92+
93+
\item 第7行: 使编译器产生更多警告, 并将警告视为错误 (比OJ严格)
94+
95+
\item 第8行: 定义了一个宏\texttt{DEBUG}, 用于 redirect.h (后面讲, 不影响OJ)
96+
97+
\item 第9行: math.h需要链接的数学函数库 (符合OJ设置)
98+
99+
\item 第11-22行: 定义多个可执行文件设置, 方便管理
100+
\end{itemize}
101+
102+
\end{frame}
103+
104+
105+
\begin{frame}[fragile]{输入输出重定向}
106+
\begin{itemize}[<+- | alert@+>]
107+
\item 调试OJ时, 一个很烦的事情是每次都需要重新输入
108+
109+
\item 程序员最讨厌重复劳动. 如何解决这个问题?
110+
111+
\item 如果你用的是Linux, 一个很简单的方法就是输入重定向:
112+
\begin{verbatim}
113+
./sum <input.txt
114+
echo 1 2 3 | ./sum
115+
\end{verbatim}
116+
117+
\item 但在用CLion的时候输入命令行仍然很麻烦
118+
\item redirect.h 解决了这个问题
119+
\begin{itemize}
120+
\item 不提供输入文件时从命令行窗口读取用户输入
121+
\item 提供输入文件时通过输入文件读取输入
122+
\item 提供输出文件时输出到该文件
123+
\end{itemize}
124+
\end{itemize}
125+
\end{frame}
126+
127+
\begin{frame}[fragile]{输入输出重定向}
128+
\begin{itemize}[<+- | alert@+>]
129+
\item 代码编写样例见 main.c
130+
\item 命令行: \texttt{./main [input] [output]} (中括号为可选)
131+
\item 在Program arguments中添加 \texttt{../input/1-1-a\_sum.txt}
132+
\emptyline\begin{figure}[ht!]
133+
\centering
134+
\includegraphics[width=65mm]{figs/clion_cmdargs.png}
135+
\caption{CLion 添加命令行参数}
136+
\end{figure}
137+
\end{itemize}
138+
\end{frame}

0 commit comments

Comments
 (0)