From 54ea4ecc70b397c71f535226326baaa3e53e2fe2 Mon Sep 17 00:00:00 2001 From: Zhao Zuohong <1040110848@qq.com> Date: Wed, 6 Jan 2021 00:35:47 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=A7=E4=BD=9C=E4=B8=9A=E5=8F=82=E8=80=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _config.next.yml | 4 +- answer8/initializr63059.zip | 7 - source/_posts/big-functions.md | 572 +++++++++++++++++++++++++++++++++ source/_posts/homework.md | 4 + 4 files changed, 578 insertions(+), 9 deletions(-) delete mode 100644 answer8/initializr63059.zip create mode 100644 source/_posts/big-functions.md diff --git a/_config.next.yml b/_config.next.yml index ec51faf..a6b5af1 100644 --- a/_config.next.yml +++ b/_config.next.yml @@ -118,7 +118,7 @@ sidebar: # - always expand for all pages automatically. # - hide expand only when click on the sidebar toggle icon. # - remove totally remove sidebar including sidebar toggle. - display: remove + display: post # Sidebar padding in pixels. padding: 18 @@ -177,7 +177,7 @@ toc: # If true, all words will placed on next lines if header width longer then sidebar width. wrap: false # If true, all level of TOC in a post will be displayed, rather than the activated part of it. - expand_all: false + expand_all: true # Maximum heading depth of generated toc. max_depth: 6 diff --git a/answer8/initializr63059.zip b/answer8/initializr63059.zip deleted file mode 100644 index 9b09d63..0000000 --- a/answer8/initializr63059.zip +++ /dev/null @@ -1,7 +0,0 @@ - -301 Moved Permanently - -

301 Moved Permanently

-
nginx
- - diff --git a/source/_posts/big-functions.md b/source/_posts/big-functions.md new file mode 100644 index 0000000..a4a8140 --- /dev/null +++ b/source/_posts/big-functions.md @@ -0,0 +1,572 @@ +--- +title: 大作业参考函数 +date: 2021-01-05 22:09:31 +tags: +--- + +# 第一次大作业 + +## 数组逆置与左旋 + +```C +#include +#include +#include + +void Reverse(int* a, int n) +{ + for (int i = 0; i < n / 2; ++i) { + int tmp = a[i]; + a[i] = a[n - 1 - i]; + a[n - 1 - i] = tmp; + } +} + +void LeftRotate_1(int* a, int n, int m) +{ + int* b = (int*)malloc(n * sizeof(int)); + for (int i = 0; i < m; ++i) { + b[n - m + i] = a[i]; + } + for (int i = m; i < n; ++i) { + b[i - m] = a[i]; + } + memcpy(a, b, n * sizeof(int)); + free(b); +} + +void LeftRotate_2(int* a, int n, int m) +{ + Reverse(a, m); + Reverse(a + m, n - m); + Reverse(a, n); +} + +void LeftRotate_3(int* a, int n, int m) +{ + int max; + int min; + if (m > n) { + max = m; + min = n; + } else { + max = n; + min = m; + } + int t = 1; + while (t != 0) { + t = max % min; + max = min; + min = t; + } + for (int i = 0; i < max; ++i) { + int k = i; + int oldValue = a[k]; + for (int j = 0; j < n / max; ++j) { + k = (k + n - m) % n; + int newValue = a[k]; + a[k] = oldValue; + oldValue = newValue; + } + } +} + +int main() +{ + int a[] = { 1, 2, 3, 4, 5 }; + LeftRotate_3(a, 5, 2); + for (int i = 0; i < 5; ++i) { + printf("%d ", a[i]); + } + putchar('\n'); + return 0; +} +``` + +## 筛法求素数 + +```C +#define N 100 +void prime(void) +{ + int a1, i, j; + int a[N] = { 0 }; + char x; + int m = 0; + printf("请输入想要查找素数范围的上界(不大于%d):\n", N); + while (scanf("%d", &a1) != 1) { + while ((x = getchar()) != '\n') + putchar(x); + printf("是无效的命令,重新输入\n"); + } + if ((a1 <= N) && (a1 >= 2)) { + for (i = 1; i < a1; i++) + a[i] = i + 1; + for (i = 1; i < a1; i++) { + if (a[i] != 0) + for (j = i + 1; j < a1; j++) + if ((a[j] % a[i]) == 0) + a[j] = 0; + } + printf("素数有:\n"); + for (i = 0; i < a1; i++) + if (a[i] != 0) { + m++; + printf("%d%c", a[i], m % 5 ? ' ' : '\n'); + } + } + if (a1 <= 1) + printf("该区间不存在素数\n"); + if (a1 > N) + printf("上界溢出\n"); +} +``` + +# 第二次大作业 + +## 插入 + +```C +//字符串连接 +char a[N1][N2]; +static int b[N1]; +int* q = b; +char (*p)[N2] = a; +int length(int d) //计算字符串长度 +{ + int i = 0; + while (*(*(p + d) + i) != '\0') + i++; + return i; +} +void insert(int d, int e, int f) //字符串插入 +{ + //d,e是字符串序号,因为可能同时存储着多个字符串,存储使用了二维数组 + //f作为作为插入位置,d为主字符串 + int i; + for (i = (length(d) + length(e) + 1); i > (f + length(e) - 1); i--) + *(*(p + d) + i) = *(*(p + d) + i - length(e)); + for (i = 0; i < length(e); i++) + *(*(p + d) + i + f) = *(*(p + e) + i); +} +``` + +## 子串与查找 + +```C +include + +void SubString(char* s, int pos, int n, char* sub) +{ + int i; + for (i = 0; i < n; ++i) { + sub[i] = s[pos + i]; + } + sub[i] = '\0'; +} + +int BeginsWith(char* a, char* b) +{ + for (int i = 0;; ++i) { + if (a[i] == b[i]) { + if (a[i] == '\0') { + return 0; + } + continue; + } + if (b[i] == '\0') { + return 1; + } + return 0; + } +} + +int Search(char* s, char* t) +{ + for (int i = 0; s[i] != '\0'; ++i) { + printf("%s\n%s\n", s + i, t); + if (BeginsWith(s + i, t)) { + return i; + } + } + return -1; +} +``` + +## 替换 + +```C +#include +#include +#define MAX_LEN 100 + +void StrReplace(char *s, char *sub, char *new_sub) +{ + // s: 输入的字符串 + // sub: 需要替换的子串 + // new_sub:替换的新子串 + char *p = s, *q; + char *s_last = s + strlen(s); // s的结尾'\0'的位置 + int sub_len = strlen(sub); + int new_sub_len = strlen(new_sub); + int diff = new_sub_len - sub_len; + // 省略了查找子串的实现,直接调用库函数strstr,找不到子串时返回NULL + while (p = strstr(p, sub)) + { + // 把从p开始的sub字符串替换成new_sub + // 首先调整s中这个sub之后的字符的位置 + if (diff > 0) + { + // 如果new_sub比sub长,需要把后面的字符(包括'\0')往后移 + for (q = s_last; q >= p + sub_len; q--) + { + *(q + diff) = *q; + } + } + else if (diff < 0) + { + // 如果new_sub比sub短,需要把后面的字符(包括'\0')往前移 + for (q = p + sub_len; q <= s_last; q++) + { + *(q + diff) = *q; + } + } + // 把new_sub复制过来 + for (q = new_sub; *q != '\0'; q++, p++) + { + *p = *q; + } + // 更新s字符串的结尾位置 + s_last += diff; + } +} + +int main() +{ + char s[MAX_LEN] = "deabcdeafdegdea"; + StrReplace(s, "dea", "ii"); + printf("%s\n", s); + return 0; +} +``` + +# 第三次大作业 + +## 打开文件创建链表 + +```C +#include +#include + +struct Student +{ + char name[10]; + float score; + struct Student *next; +}; + +struct Student *CreateFromFile(char *filename) +{ + struct Student *temp, *head, *p; + FILE *fp; + // temp: 新建结点的地址 + // head: 链表的头结点地址 + // p: 链表最后一个结点的地址 + head = (struct Student *)malloc(sizeof(struct Student)); + p = head; + + if (!(fp = fopen(filename, "r"))) + { + printf("Failed to open file: %s\n", filename); + return head; + }; + + temp = (struct Student *)malloc(sizeof(struct Student)); + // fscanf读到文件末尾时会返回EOF + while (fscanf(fp, "%s %f", temp->name, &temp->score) != EOF) + { + p->next = temp; + p = p->next; + temp = (struct Student *)malloc(sizeof(struct Student)); + } + p->next = NULL; + free(temp); + + return head; +} + +void Print(struct Student *head) +{ + struct Student *p = head->next; + while (p != NULL) + { + printf("%s %f\n", p->name, p->score); + p = p->next; + } +} + +int main() +{ + struct Student *head; + head = CreateFromFile("test.txt"); + Print(head); + return 0; +} +``` + +## 在指定位置插入、有序插入 + +```C +#include +#include + +typedef struct student { + int num; + char name[20]; + float score; + struct student* next; +} stu; + +stu* delete_pos(stu* head, int pos) +{ + /* + 删除指定位置记录 + :param pos: 指定位置,从0开始 + :return head: 返回链表头结点 + */ + int i; + stu *t, *s = head; + + //链表为空 + if (head == NULL) { + printf("error: null linked list\n"); + } + + //删除头结点 + if (pos == 0) { + head = head->next; + free(s); + return head; + } + + //删除其他节点 + for (i = 1; i < pos; i++) { + if (s->next == NULL) { + printf("error: pos out of range\n"); + return head; + } + s = s->next; + } + if (s->next == NULL) { + printf("error: pos out of range\n"); + return head; + } + t = s->next; + s->next = t->next; + free(t); + return head; +} + +stu* insert_pos(stu* head, stu* s, int pos) +{ + /* + 指定位置插入 + :param head: 头指针 + :param pos: 指定位置,从0开始 + :return head: 返回链表头结点 + */ + stu* t = head; + int i; + + if (i < 0) { + printf("error: pos out of range\n"); + return head; + } + + //头插 + if (pos == 0) { + if (head == NULL) { //链表为空 + head = s; + head->next = NULL; + return head; + } else { //非空 + s->next = head; + head = s; + return head; + } + } + + //其他位置 + for (i = 1; i < pos; i++) { + if (t->next == NULL) { + printf("error: pos out of range\n"); + return head; + } + t = t->next; + } + s->next = t->next; + t->next = s; + return head; +} + +stu* insert_order(stu* head, stu* s) +{ + /* + 保持有序插入,只考虑正序 + :param head: 头指针 + :param s: 插入节点 + :param pos: 指定位置,从0开始 + :return head: 返回链表头结点 + */ + stu* t = head; + int pos = 0; + + //找到插入位置 + while (s->num >= t->num) { + if (t->next == NULL) { + //链表达到结尾,尾插 + pos++; + break; + } else { + t = t->next; + pos++; + } + } + + return insert_pos(head, s, pos); +} +``` + +## 删除指定位置、重写学生文件 + +```C +#include +#include +#include +#define Student struct list +struct list { + char number[100]; + char name[100]; + float score; + Student* next; +}; //利用头结点建立链表,在链表最开头建立一个空白结点 +void A_delete(Student* p1) +{ //删除p1结点的下一个结点 + Student* p2 = p1->next; + p1->next = p2->next; + free(p2); +} +void A_print(Student* p) +{ //从p结点开始打印 + int n = 1; + printf("\n##STUDENT MESSAGE:\n"); + while (p != NULL) { + printf("No.%d\nSchool Number:%s\nName:%s\nScore:%-5.2f\n\n", n++, p->number, p->.name, p->.score); + p = p->next; + } +} +void Delete_pos(Student* head) +{ + Student* p0; + int pos, i; + A_print((*head).pointer); + printf("**MENU/Delete/in certain position**\nPlease input the position(input 0 to break)\n"); + scanf("%d", &pos); + while (pos) { + p0 = head; + for (i = 1; ((i < pos) && (p0->next != NULL)); i++) + p0 = p0->next; + A_delete(p0); + A_print(head->next); + printf("Please input a position(input 0 to break)\n"); + scanf("%d", &pos); + } +} +void Record_write(Student* head, char* a) +{ //a用于不同的功能,当a为‘w’代表重写,当a为'a'代表追加 + FILE* f; + char filename[100]; + Student* p = head->next; + printf("**MENU/Record**\n"); + printf("Please input the file name\n"); + gets(filename); + f = fopen(filename, a); + while (p != NULL) { + fputs(p->number, f); + fprintf(f, "\n"); + fputs(p->name, f); + fprintf(f, "\n"); + fprintf(f, "%-5.2f\n", p->score); + p = p->next; + } + fclose(f); + printf("Write OK!\n"); +} +``` + +## 追加学生文件、清空学生文件 + +```C +#include +#include +#include + +struct student { + int id; + char name[20]; + int score; + struct student *next; +}; + +void append_file(struct student *head, char *file_path) { + struct student *p; + FILE *fp; + + if (head == NULL) { + return; + } + fp = fopen(file_path, "a"); + if (fp == NULL) { + printf("open file %s failed", file_path); + return; + } + p = head; // head 是第一个节点 + // p=head->next; // 如果 head 是专门的头节点,用这种写法 + while (p != NULL) { + fprintf(fp, "%d %s %d\n", p->id, p->name, p->score); + p = p->next; + } + fclose(fp); +} + +void clear_file(char *file_path) { + FILE *fp = fopen(file_path, "w"); + if (fp == NULL) { + printf("open file %s failed", file_path); + return; + } + fclose(fp); +} + +int main() { + struct student *head, *p; + char file_path1[] = "stu1.txt"; + char file_path2[] = "stu2.txt"; + head = malloc(sizeof(struct student)); + head->id = 0; + strcpy(head->name, "stu0"); + head->score = 90; + head->next = NULL; + p = malloc(sizeof(struct student)); + p->id = 1; + strcpy(p->name, "stu1"); + p->score = 89; + p->next = NULL; + head->next = p; + append_file(head, file_path1); + append_file(head, file_path1); + append_file(head, file_path2); + clear_file(file_path2); + return 0; +} +``` \ No newline at end of file diff --git a/source/_posts/homework.md b/source/_posts/homework.md index dbebca9..0f38c42 100644 --- a/source/_posts/homework.md +++ b/source/_posts/homework.md @@ -6,6 +6,10 @@ date: 2020-10-30 09:39:53 tags: --- +# 大作业参考函数 + +[点我](/~zhaozuohong/big-functions) + # 第八次作业 - [题目](/~zhaozuohong/homework8/)