Skip to content

Commit f344750

Browse files
committed
re-organize project
1 parent 507b1af commit f344750

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+159
-6
lines changed

.gitignore

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
*
22
!*/
3-
![0-9]*/*.md
4-
![0-9]*/*/*.png
3+
!CMakeLists.txt
4+
!Tutorial/*.md
5+
!Tutorial/*/*.md
6+
!Tutorial/*/*/*.png
57
!Slides/*/*.tex
68
!Slides/*/*.bib
79
!Slides/*/*/*.tex
8-
!Slides/*/*/*.png
10+
!Slides/*/*/*.png
11+
!OJ/lib/*
12+
!OJ/example.*
13+
/OJ/src/CMakeLists.txt

CMakeLists.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
cmake_minimum_required(VERSION 3.14)
2+
project(programming-tutorial-2019)
3+
4+
add_subdirectory(OJ)
5+
add_subdirectory(Slides)
6+
add_subdirectory(Tutorial)

OJ/CMakeLists.txt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
project(OJ)
2+
3+
set(CMAKE_C_STANDARD 99)
4+
set(CMAKE_CXX_STANDARD 11)
5+
6+
add_subdirectory(lib)
7+
include_directories(lib)
8+
9+
add_compile_options(-Wall -Wextra -Wpedantic -Werror -fno-asm)
10+
link_libraries(m redirect)
11+
12+
if (EXISTS ${PROJECT_SOURCE_DIR}/src/CMakeLists.txt)
13+
add_subdirectory(src)
14+
endif()
15+
16+
add_executable(oj-example_c example.c)
17+
add_executable(oj-example_cpp example.cpp)

OJ/example.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
#ifndef ONLINE_JUDGE
2+
#include "redirect.h"
3+
#endif
4+
5+
#include <stdio.h>
6+
7+
int main(int argc, char *argv[]) {
8+
#ifndef ONLINE_JUDGE
9+
init(argc, argv);
10+
#endif
11+
12+
int sum = 0, i;
13+
while (scanf("%d", &i) == 1)
14+
sum += i;
15+
printf("%d\n", sum);
16+
return 0;
17+
}

OJ/example.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#ifndef ONLINE_JUDGE
2+
#include "redirect.h"
3+
#endif
4+
5+
#include <iostream>
6+
7+
using namespace std;
8+
9+
int main(int argc, char *argv[]) {
10+
#ifndef ONLINE_JUDGE
11+
init(argc, argv);
12+
#endif
13+
14+
int sum = 0, i;
15+
while (cin >> i)
16+
sum += i;
17+
cout << sum << endl;
18+
return 0;
19+
}

OJ/lib/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
add_library(redirect redirect.c)

OJ/lib/redirect.c

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
//
2+
// Created by Ruize Tang on 2019/10/27.
3+
//
4+
5+
#include <fcntl.h> /* 获得 open() 和 close() 的声明 */
6+
#include <unistd.h> /* 获得 dup2() 的声明 */
7+
#include <sys/stat.h> /* 获得 S_IRUSR 和 S_IWUSR 的声明 */
8+
9+
/* 函数说明:每次做 OJ 都要调好几百遍,把输入一次又一次地复制粘贴太麻烦了,不如从文件读取吧!
10+
* 参数说明:argv 是一个数组,每个元素是一个字符串
11+
* argc 表示 argv 有多少个字符串
12+
* 命令行使用说明:./main [input] [output]
13+
* ./main 本程序,argv[0]
14+
* input 可选,输入文件,argv[1]。不指定输入文件输入就是从原来的黑框框读取输入
15+
* output 可选,输出文件,argv[2]。不指定就是打印到原来的黑框框。必须要有输入文件才能有输出文件。 */
16+
void init(int argc, char *argv[]) {
17+
if (argc > 1) { /* 如果命令行参数个数大于1
18+
* 比如 "./main input" 中的 "./main" 是第0个 argv[0],"input" 是第1个 argv[1] */
19+
20+
int fd = open(argv[1], O_RDONLY); /* 以只读方式打开输入文件 argv[1] 并获得文件描述符 fd */
21+
22+
if (fd != -1) { /* 判断是否打开成功,绝大多数 Linux 系统调用返回 -1 为失败 */
23+
dup2(fd, STDIN_FILENO); /* 将 fd 复制到 STDIN_FILENO (将输入流重定向为文件描述符 fd)
24+
* 原来的输入流文件描述符 STDIN_FILENO 先被关闭
25+
* 新的文件描述符 fd 被复制 (duplicate) 到 STDIN_FILENO */
26+
}
27+
28+
close(fd); /* 由于 fd 被复制了,所以用不上了,关掉释放资源 */
29+
30+
if (argc > 2) { /* 如果命令行参数个数大于2,比如 "./main input output" */
31+
32+
/* 以写入 (O_WRONLY) 方式打开输出文件 argv[2]
33+
* 如果 argv[2] 不存在将被创建 (O_CREAT),创建的权限为用户可读 (S_IRUSR) 写 (S_IWUSR)
34+
* 如果 argv[2] 存在将被重写 (O_TRUNC) */
35+
fd = open(argv[2], O_CREAT | O_WRONLY | O_TRUNC, S_IRUSR | S_IWUSR);
36+
37+
if (fd != -1)
38+
dup2(fd, STDOUT_FILENO); /* 将 fd 复制到 STDOUT_FILENO (将输出流重定向为文件描述符 fd) */
39+
close(fd);
40+
}
41+
}
42+
}

OJ/lib/redirect.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
//
2+
// Created by Ruize Tang on 2019/10/27.
3+
//
4+
5+
#ifndef TUTORIAL_REDIRECT_H
6+
#define TUTORIAL_REDIRECT_H
7+
8+
#ifdef __cplusplus
9+
extern "C"
10+
#endif
11+
12+
void init(int argc, char *argv[]);
13+
14+
#endif //TUTORIAL_REDIRECT_H

Slides/CMakeLists.txt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
project(Slides)
2+
3+
add_custom_target(slides
4+
COMMAND $(MAKE)
5+
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR})
6+
7+
add_custom_target(slides-clean
8+
COMMAND $(MAKE) clean
9+
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR})
10+
11+
add_custom_target(slides-introduction.pdf
12+
COMMAND $(MAKE) DIR=2019-10-25_Introduction
13+
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR})

Slides/Makefile

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ DIR ?=
44
VIEWER ?=
55

66
ifeq ($(DIR),)
7-
AUTODIR = $(wildcard 201*)
7+
AUTODIR = $(wildcard */)
88
else
99
AUTODIR = $(DIR)
1010
ifeq ($(VIEWER),)
@@ -19,7 +19,7 @@ endif
1919
TEX = $(filter-out $(wildcard $(AUTODIR:%=%/preamble.tex)),$(wildcard $(AUTODIR:%=%/*.tex)))
2020
PDF = $(TEX:.tex=.pdf)
2121

22-
pdf: $(PDF)
22+
slides: $(PDF)
2323
@if which "$(VIEWER)" &> /dev/null; then $(VIEWER) $(PDF) & fi
2424

2525
$(PDF): %.pdf: %.tex
@@ -28,5 +28,5 @@ $(PDF): %.pdf: %.tex
2828
clean:
2929
@find $(AUTODIR) -type f ! -name \*.tex -a ! -name \*.bib -a ! -name \*.png -a ! -name Makefile -delete
3030

31-
.DEFAULT_GOAL := pdf
31+
.DEFAULT_GOAL := slides
3232
.PHONY: $(PDF)

Tutorial/CMakeLists.txt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
project(Tutorial)
2+
3+
add_custom_command(OUTPUT gitbook-update
4+
COMMAND rsync -rut --exclude=CMakeLists.txt --exclude=_book --delete Tutorial ${PROJECT_BINARY_DIR}
5+
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
6+
7+
add_custom_target(gitbook-clean
8+
COMMAND rm -rf Tutorial
9+
WORKING_DIRECTORY ${PROJECT_BINARY_DIR})
10+
11+
add_custom_target(gitbook-build
12+
COMMAND gitbook build
13+
DEPENDS gitbook-update
14+
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/Tutorial)
15+
16+
add_custom_target(gitbook
17+
COMMAND gitbook serve --no-live --no-watch
18+
DEPENDS gitbook-update
19+
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/Tutorial)

0 commit comments

Comments
 (0)