大作业参考
This commit is contained in:
parent
5e8ae36141
commit
54ea4ecc70
4 changed files with 578 additions and 9 deletions
|
@ -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
|
||||
|
||||
|
|
|
@ -1,7 +0,0 @@
|
|||
<html>
|
||||
<head><title>301 Moved Permanently</title></head>
|
||||
<body>
|
||||
<center><h1>301 Moved Permanently</h1></center>
|
||||
<hr><center>nginx</center>
|
||||
</body>
|
||||
</html>
|
572
source/_posts/big-functions.md
Normal file
572
source/_posts/big-functions.md
Normal file
|
@ -0,0 +1,572 @@
|
|||
---
|
||||
title: 大作业参考函数
|
||||
date: 2021-01-05 22:09:31
|
||||
tags:
|
||||
---
|
||||
|
||||
# 第一次大作业
|
||||
|
||||
## 数组逆置与左旋
|
||||
|
||||
```C
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
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 <stdio.h>
|
||||
|
||||
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 <stdio.h>
|
||||
#include <string.h>
|
||||
#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 <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
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 <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
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 <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#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 <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
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;
|
||||
}
|
||||
```
|
|
@ -6,6 +6,10 @@ date: 2020-10-30 09:39:53
|
|||
tags:
|
||||
---
|
||||
|
||||
# 大作业参考函数
|
||||
|
||||
[点我](/~zhaozuohong/big-functions)
|
||||
|
||||
# 第八次作业
|
||||
|
||||
- [题目](/~zhaozuohong/homework8/)
|
||||
|
|
Loading…
Reference in a new issue