diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..05813ac --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +* +!*.* +!*/ +!.gitignore \ No newline at end of file diff --git a/2207/C语言/2.文件/文件概述.c b/2207/C语言/2.文件/文件概述.c new file mode 100644 index 0000000..5d5bf44 --- /dev/null +++ b/2207/C语言/2.文件/文件概述.c @@ -0,0 +1,5 @@ +#include +int main(){ + + return 0; +} \ No newline at end of file diff --git a/2207/C语言/3.线性结构/链表.c b/2207/C语言/3.线性结构/链表.c new file mode 100644 index 0000000..ed06f09 --- /dev/null +++ b/2207/C语言/3.线性结构/链表.c @@ -0,0 +1,24 @@ +#include +/* +定义结构体类型 +*/ + +typedef struct Node{ + int data; + struct Node * pNext; +}Node, *pNode; + + +int main(){ + + Node node; + pNode p; + p = &node; + node.data = 10; + node.pNext = NULL; + + printf("%d\n", p->data); + + + return 0; +} \ No newline at end of file diff --git a/2207/C语言/3.线性结构/顺序表.c b/2207/C语言/3.线性结构/顺序表.c new file mode 100644 index 0000000..e69de29 diff --git a/2207/C语言/4.常用十大排序/十大排序.c b/2207/C语言/4.常用十大排序/十大排序.c new file mode 100644 index 0000000..1635916 --- /dev/null +++ b/2207/C语言/4.常用十大排序/十大排序.c @@ -0,0 +1,254 @@ +#include + +// 交换两个整数的值 +void swap(int* a, int* b) { + int temp = *a; + *a = *b; + *b = temp; +} + +// 冒泡排序 +void bubbleSort(int arr[], int n) { + for (int i = 0; i < n-1; i++) { + for (int j = 0; j < n-i-1; j++) { + if (arr[j] > arr[j+1]) { + swap(&arr[j], &arr[j+1]); + } + } + } +} + +// 选择排序 +void selectionSort(int arr[], int n) { + int i, j, min_idx; + for (i = 0; i < n-1; i++) { + min_idx = i; + for (j = i+1; j < n; j++) { + if (arr[j] < arr[min_idx]) { + min_idx = j; + } + } + swap(&arr[min_idx], &arr[i]); + } +} + +// 插入排序 +void insertionSort(int arr[], int n) { + int i, key, j; + for (i = 1; i < n; i++) { + key = arr[i]; + j = i-1; + while (j >= 0 && arr[j] > key) { + arr[j+1] = arr[j]; + j = j-1; + } + arr[j+1] = key; + } +} + +// 归并排序 +void merge(int arr[], int l, int m, int r) { + int i, j, k; + int n1 = m - l + 1; + int n2 = r - m; + + int L[n1], R[n2]; + + for (i = 0; i < n1; i++) { + L[i] = arr[l + i]; + } + for (j = 0; j < n2; j++) { + R[j] = arr[m + 1 + j]; + } + + i = 0; + j = 0; + k = l; + while (i < n1 && j < n2) { + if (L[i] <= R[j]) { + arr[k] = L[i]; + i++; + } else { + arr[k] = R[j]; + j++; + } + k++; + } + + while (i < n1) { + arr[k] = L[i]; + i++; + k++; + } + + while (j < n2) { + arr[k] = R[j]; + j++; + k++; + } +} + +void mergeSort(int arr[], int l, int r) { + if (l < r) { + int m = l + (r - l) / 2; + mergeSort(arr, l, m); + mergeSort(arr, m + 1, r); + merge(arr, l, m, r); + } +} + +// 快速排序 +int partition(int arr[], int low, int high) { + int pivot = arr[high]; + int i = (low - 1); + + for (int j = low; j <= high - 1; j++) { + if (arr[j] < pivot) { + i++; + swap(&arr[i], &arr[j]); + } + } + swap(&arr[i + 1], &arr[high]); + return (i + 1); +} + +void quickSort(int arr[], int low, int high) { + if (low < high) { + int pi = partition(arr, low, high); + quickSort(arr, low, pi - 1); + quickSort(arr, pi + 1, high); + } +} + +// 希尔排序 +void shellSort(int arr[], int n) { + for (int gap = n/2; gap > 0; gap /= 2) { + for (int i = gap; i < n; i++) { + int temp = arr[i]; + int j; + for (j = i; j >= gap && arr[j - gap] > temp; j -= gap) { + arr[j] = arr[j - gap]; + } + arr[j] = temp; + } + } +} + +// 计数排序 +void countSort(int arr[], int n) { + int max = arr[0]; + for (int i = 1; i < n; i++) { + if (arr[i] > max) { + max = arr[i]; + } + } + + int count[max+1]; + for (int i = 0; i <= max; i++) { + count[i] = 0; + } + + for (int i = 0; i < n; i++) { + count[arr[i]]++; + } + + int index = 0; + for (int i = 0; i <= max; i++) { + while (count[i] > 0) { + arr[index++] = i; + count[i]--; + } + } +} + +// 基数排序 +void countingSortForRadix(int arr[], int n, int exp) { + int output[n]; + int count[10] = {0}; + + for (int i = 0; i < n; i++) { + count[(arr[i] / exp) % 10]++; + } + + for (int i = 1; i < 10; i++) { + count[i] += count[i - 1]; + } + + for (int i = n - 1; i >= 0; i--) { + output[count[(arr[i] / exp) % 10] - 1] = arr[i]; + count[(arr[i] / exp) % 10]--; + } + + for (int i = 0; i < n; i++) { + arr[i] = output[i]; + } +} + +void radixSort(int arr[], int n) { + int max = arr[0]; + for (int i = 1; i < n; i++) { + if (arr[i] > max) { + max = arr[i]; + } + } + + for (int exp = 1; max / exp > 0; exp *= 10) { + countingSortForRadix(arr, n, exp); + } +} + +// 堆排序 +void heapify(int arr[], int n, int i) { + int largest = i; + int left = 2 * i + 1; + int right = 2 * i + 2; + + if (left < n && arr[left] > arr[largest]) { + largest = left; + } + + if (right < n && arr[right] > arr[largest]) { + largest = right; + } + + if (largest != i) { + swap(&arr[i], &arr[largest]); + heapify(arr, n, largest); + } +} + +void heapSort(int arr[], int n) { + for (int i = n / 2 - 1; i >= 0; i--) { + heapify(arr, n, i); + } + + for (int i = n - 1; i >= 0; i--) { + swap(&arr[0], &arr[i]); + heapify(arr, i, 0); + } +} + +// 打印数组 +void printArray(int arr[], int size) { + for (int i = 0; i < size; i++) { + printf("%d ", arr[i]); + } + printf("\n"); +} + +// 测试排序函数 +int main() { + int arr[] = {64, 34, 25, 12, 22, 11, 90}; + int n = sizeof(arr)/sizeof(arr[0]); + + printf("Original array: \n"); + printArray(arr, n); + + bubbleSort(arr, n); + printf("Sorted array using Bubble Sort: \n"); + printArray(arr, n); + + // 你可以在这里测试其他排序函数 + + return 0; +} \ No newline at end of file diff --git a/2207/C语言/5.寒假作业/C语言练习题合集.md b/2207/C语言/5.寒假作业/C语言练习题合集.md new file mode 100644 index 0000000..8bf2a54 --- /dev/null +++ b/2207/C语言/5.寒假作业/C语言练习题合集.md @@ -0,0 +1,879 @@ +## 一、顺序结构 + +1. 将华氏温度转换为摄氏温度和绝对温度的公式分别为: +c= (f-32) (摄氏温度) +k=273.16+c (绝对温度) +请编程序:当给出f 时,求其相应摄氏温度和绝对温度。 +测试数据:① f=34 +② f=100 + +2. 写一个程序把极坐标(r,θ) (θ之单位为度)转换为直角坐标( X,Y)。转换公式是: +x=r.cosθ +y=r.sinθ +测试数据:① r=10 θ=45° +② r=20 θ=90° + +3. 写一个程序,按如下格式输出数据。 +name number math english computer +zhanghua 9901 80.50 87.0 80 +lina 9902 70.00 80.0 90 +wanggang 9903 87.00 76.0 78 + +4. 输入3 个双精度实数,分别求出它们的和、平均值、平方和以及平方和的开方,并输 +出所求出各个值。 + +5. 输入一个3 位整数,求出该数每个位上的数字之和。如123,每个位上的数字和就是 +1+2+3=6。 + +## 二、分支结构 + +1. 输入一个字符,判断它如果是小写字母输出其对应大写字母;如果是大写字母输出其 +对应小写字母;如果是数字输出数字本身;如果是空格,输出“space”;如果不是 +上述情况,输出“other”。 + +2. 有三个数a、b、c,由键盘输入,输出其中最大的数。 + +3. 输入一个数,判断它能否被 3 或者被 5 整除, 如至少能被这两个数中的一个整除则将 +此数打印出来,否则不打印,编出程序。 + +4. 读入1 到7 之间的某个数,输出表示一星期中相应的某一天的单词:Monday、 Tuesday +等等,用switch 语句做。 + +5. 给出一百分制成绩,要求输出成绩等级‘A’,‘B’,‘C’,‘D’,‘E’,90 分以上为 +‘A’,80~89 分为‘B’,70~79 分为‘C’,60~69 分为‘D’,60 分以下为‘E’。 + +6. 有一函数,请编程序计算y 的值(x 的值由键盘输入)。 +image-20241130003549906 + + + +## 三、循环结构 + +1. 计算n 的阶乘 + +2. 求 1 到 100 之间的奇数之和、偶数之积。 + +3. 输入一行字符,统计其中的英文字母、数字、空格和其他字符个数。 + +4. 用循环语句编写求下列表达式值的程序。 +image-20241130003536421 + +5.求1!+2!+3!+...+20! + +6.求下列分数序列的前20项之和。 +image-20241130003647576 + +7. 任意十个数,打印出它们中的最大数、最小数。 +测试数据:① 1,-12,20,30,-5,-23,33,125,200,-100 + ② 0,10,3,1,5,6,-10,90,9,-4 + ③ 12,13,14,15,10,-10,-11,-12,-9,9 + +8. 判断一个数是否是素数 + +9. 打印1-100 之间所有素数 + +10. 求1-100 之间所有非素数的和 + +11. 输入两个正整数 m 和 n,求其最大公约数和最小公倍数 +提示: +求 m,n的最大公约数:首先将 m除以 n(m>n)得余数 R,再用余数 R 去除原来的除数,得新的余数,重复此过程直到余数为 0 时停止,此时的除数就是m 和 n的最大公约数。 +求 m和 n的最小公倍数: m和 n的积除以 m和 n 的最大公约数。 +测试数据: m=12, n=24 + m=100, n=300 + +12. 打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数, 其各位数字立方 +和等于该数本身。例如 153 是一个水仙花数,因为 153=1\*1\*1+5\*5\*5+3\*3\*3(要求分别用一重循环和三重循环实现)。 + +13. 一个数恰好等于它的平方数的右端,这个数称为同构数。如 5 的平方是25, 5 是25 中的右端的数, 5 就是同构数。找出1~1000 之间的全部同构数。 + +14. 3025 这个数具有一种独特的性质:将它平分为两段,即30 和25,使之相加后求平方,即(30+25),恰好等于3025 本身。请求出具有这样性质的全部四位数。 + +15. 两位数13 和62 具有很有趣的性质:把它们个位数字和十位数字对调,其乘积不变,即13*62=31*26。 编程序求共有多少对这种性质的两位数(个位与十位相同的不在此列,如11、22,重复出现的不在此列,如 13*62 与62*13)。 + +16. 一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如,6 的因子为1、2、3,而6=1+2+3,因此6 是“完数”。编程序找出1000 之内的所有完数,并按下面格式输出其因子: + 6 its factors are 1,2,3 + +17. 有一个四位正整数,组成这个四位数的四个数字各不相同,如果把它们的首尾互换,第二位与第三位互换,组成一个新的四位数。原四位数为新四位数的4 倍,请找出一个这样的四位数。 + +18. 给出一个不多于4 位的正整数,要求:① 求出它是几位数 ② 分别打印出每一位数字 ③ 按逆序打印出各位数字。 + +19. 在一个程序中计算出给定误差小于0.1,0.01,0.001,0.0001,0.00001 时,下式的值: +![image-20241130004016370](https://yp.smallkun.cn/markdown/image-20241130004016370.png!compress) +提示:本题中误差指前 n+1项之积与前 n项积之差。 + +20. 用泰勒展开式求sinx 的近似值 +![image-20241130004040849](https://yp.smallkun.cn/markdown/image-20241130004040849.png!compress) + +测试数据:① x=0.3 , n=8 + ② x=0.5 , n=20 + +21. 验证歌德巴赫猜想。一个充分大的偶数(大于或等于6)可以分解为两个素数之和。试编程序,将 6 至50 之间全部偶数表示为两个素数之和。 + +22. 用牛顿迭代法求方程在 1.5 附近的根(精度为image-20241130004125210)。 +![image-20241130004157841](https://yp.smallkun.cn/markdown/image-20241130004157841.png!compress) + +23. 两个乒乓球队进行比赛,各出三人,甲队为A、B、C 三人,乙队为X、Y 、Z 三人,已知抽签决定比赛名单。有人向队员打听比赛的名单, A 说他不和 X 比,C 说他不和X、Z 比,请编程序找出三对赛手的名单。 + + + +## 四、数组 + +1. 有一个正整数数组,包含N 个元素,要求编程求出其中的素数之和以及所有素数的平均值。 + +2. 有一个数组,内放10 个整数。要求找出最小的数和它的下标,然后把它和数组中最前面的元素对换位置。 + +3. 有 N 个数已按由小到大的顺序排好,要求输入一个数, 把它插入到原有序列中,而且仍然保持有序。 + +4. 输入N 个数到数组中,输出所有大于N 个数平均值的数。 + +5. 输入N 个数到数组中,选出其中最大的数和最小的数,并分别将它们与最前面和最后面的数互换。 + +6. 用选择法对10 个整数由大到小排序。 + +7. 用筛选法求 2 到 100 之间的素数。方法如下:首先 2 是素数,凡 2 的倍数都不是素数,于是把这些数从数表中筛去, 2 以后没有被筛去的第一个数是 3, 然后把 3的倍数都从数表中筛去, 3 以后没被筛去的第一个数是 5,然后把 5 的倍数都从数表中筛去。如此下去,直到遇到某数 K(≤ N),其后没有数可筛选为止, 这时保留下的未被筛去的数就是 2 到 N 的素数。 + +8. 求一个 3×3 矩阵两条对角线上元素之和(每个元素只加一次)。 + +9. 打印如下形式的杨辉三角形 +1 +1 1 +1 2 1 +1 3 3 1 +1 4 6 4 1 +1 5 10 10 5 1 +输出前10行,从 0行开始,分别用一维数组和二维数组实现。 + +10.有一个二维数组整型数组中,每一行都有一个最大值,编程求出这些最大值以及它们的和。 + +11.把一个二维实型数组a 按照第0 列的元素进行排序(由小到大排序,用起泡法)。例如:如果a[i][0]大于a[i+1][0],则i 行与i+1 行中所有元素都要进行对换。 + +12.编程序将一个字符串的前 N 个子字符送到一个字符型数组中去, 然后再加上一个'\0'(不允许使用strcpy(str1,str2,n)函数)。 + +13.将字符数组 A 中下标为双号(0,2,4,6,8...) 的元素值传给另一个字符数组 B,然后将 B 数组的元素按逆序输出。 + +14.有一行字符,统计其中的单词个数(单词之间以空格分隔),并将每一个单词的第一个字母改为大写。 + +15.有 N 个国家名,要求按字母先后顺序排列(用起泡排序法)后输出。 + +16.有17 个人围成一圈(编号为0~16),从第 0 号的人开始从 1 报数, 凡报到 3 的倍数的人离开圈子,然后再数下去,直到最后只剩下一个人为止。 问此人原来的位置是多少号? + +17.编程产生如下形式的方阵。 +1 2 2 2 2 2 1 +3 1 2 2 2 1 4 +3 3 1 2 1 4 4 +3 3 3 1 4 4 4 +3 3 1 5 1 4 4 +3 1 5 5 5 1 4 +1 5 5 5 5 5 1 +要求:不允许使用键盘输入语句和静态赋值语句,尽量少用循环。 + +18.打印所有不超过 n( n<256)的其平方具有对称性的数(也称回文数)。 + +19.求N 个数中的最大值,最大值出现的次数,然后求出次大值(次大值一定存在)。 + +20.找出 M×N 数组中所有不相邻元素,并求出它们的和(相邻的数:前一个是偶数,后一个是素数)。 + +21.已知 100 个自然数 1~100,我们取 1, 2, 3, 4 时, 我们可将其排成一圈使每两个数之和都是素数,即→1→2→3→4→,问 1~100 内连续取 n 个数,即 1~ n(≤ 100)能满足上述要求的最大的 n 是多少? + +22.打印魔方阵。所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。 +例如:三阶魔方阵为 +8 1 6 +3 5 7 +4 9 2 + +要求打印由 1到N\* N的自然数构成的魔方阵。 +提示:魔方阵中各数的排列规律如下: +⑴ 将“1”放在第一行中间一列; +⑵ 从“2”开始直到n×n为止各数依次按下列规则存放:每一个数存放的行比前一个数的行数减1,列数加1; +⑶ 如果上一个数的行数为1,则下一个数的行数为 n(指最下一行); +⑷ 当一个数的列数为 n,下一个数的列数应为1,行数减1; +⑸ 如果按上面规则确定的位置已有数,或上一个数是第 1行第 n列时, 则把下一个数放在上一个数的下面。 + +23.统计一个单位职工的年龄,要求把相同年龄最多的那个年龄找出来(可能有几个这样的年龄),并统计出现的次数。 + +24.n×n 的拉丁方阵的每行、每列均为自然数的一个全排列, 每行(列)上均无重复数。 +如 n=5 时, 5×5 的一种拉丁方阵可以为: +1 5 2 4 3 +2 3 4 5 1 +4 1 5 3 2 +5 2 3 1 4 +3 4 1 2 5 +该数组的第一行 1,5,2,4,3 用程序自动生成,但产生的第一行不一定非得是 1,5,2,4,3,第一行填写完毕后,即以第一行作为全方阵索引, 即若第一行中的第 i 列的元素值为 j ,则 j在各行中的列号即为从第一行中元素值为 i的那一列开始读出的 n个自然数(到行末则从行头接着读),例如第一行第2列的元素值为5, 则从元素值为2的那一列(第3列)开始读出2,4,3,1,5,这就是元素5在各行中的列标号。 +测试数据:① n=5 ② n=8 + +## 五、函数 + +1.编写一函数判断某数是否素数。 + +2.编写一函数求三个整数的最大值。 + +3.打印出3 到1100 之间的全部素数(判素数由函数实现)。 + +4.写一函数,使给定的一个二维数组(3×3)转置,即行列互换。 + +5.写一函数,将两个字符串连接,即编写一strcat 函数。 + +6.写一函数,求一字符串长度,即编写一strlen 函数。 + +7.写一函数将字符数组s1 中的全部字符复制到字符数组s2 中,不用strcpy 函数。 + +8.写一函数判断某数是否“水仙花数”,所谓“水仙花数”是指一个三位数, 其各位数字立方和等于该数本身。 + +9.在主函数内任意输入一个5×6 矩阵,编写一函数求出每一行的和放到一个一维数组中,输出此矩阵及其每一行的和。 + +10.写一主函数输入一数组,写一子函数实现对该数组的冒泡排序并输出。 + +11.任意输入20 个正整数,找出其中的素数,并将这些素数按由小到大排序。要求:判断一 +个数是否为素数用函数实现;排序用函数实现。 + +12.编写计算m 的n 次方的递归函数。 + +13.编一个程序,读入具有5 个元素的整型数组,然后调用一个函数,递归计算这些元素的积。 + +14.编一个程序,读入具有5 个元素的实型数组,然后调用一个函数,递归地找出其中的最大元素,并指出它位置。 + +## 六、指针 + +1、 输入三个整数,按由小到大的顺序输出。 + +```c +#include +//定义一个函数 传入两个整型指针 交换 两个指针所指向的值 +void swap(int *x, int *y){ + int temp; + temp = *x; + *x = *y; + *y = temp; +} + +int main(void){ + int a, b, c; + printf("请输入三个数字(以空格间隔):"); + scanf("%d %d %d", &a, &b, &c); + //由小到大 升序 + if(a > b){//b为 a、b两个变量中 最大值 + swap(&a, &b); + } + if(b > c){//c 为 a、b、c中最大值 + swap(&b, &c); + } + if(a > b){//b为 a、b两个变量中 最大值 + swap(&a, &b); + } + printf("%d %d %d\n", a, b, c); + return 0; +} +``` + + + +2、 输入10 个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。写三个函数:①输入10 个数;②进行处理;③输出10 个数。 + +```c +#include +void swap(int *x, int *y){ + int temp; + temp = *x; + *x = *y; + *y = temp; +} +//输入数组元素 +void input(int *arr, int n){ + int i; + for(i=0;i *max){ + max = arr+i; + } + if(*(arr+i) < *min){ + min = arr+i; + } + } + //如果最大值的地址为数组的首地址 则最小值和首地址交换后 最大值地址为最小值地址 + if(max == arr){ + max = min; + } + swap(min, arr);//最小值和数组首元素交换 + swap(max, arr+9);//最大值和数组最后一个元素交换 +} +//输出数组元素 +void output(int *arr, int n){ + int i; + for(i=0;i +#include + +void move(int *arr, int n){ + int i, temp; + temp = *(arr+n-1); + //1 2 3 4 5 + // 1 2 3 4 + for(i=n-1;i>0;i--){ + arr[i] = arr[i-1]; + } + arr[0] = temp; +} + +void output(int *arr, int n){ + int i; + for(i=0;i + +int getStrLen(char *str){ + int n=0; + while(*str != '\0'){ + str++; + n++; + } + return n; +} + +int main(void){ + + char str[100]; + gets(str); + + printf("len=%d\n", getStrLen(str)); + + return 0; +} +``` + + + +5、 写一函数,将一个3×3 的矩阵转置。 + +```c +#include + +void revse(int (*num)[3]){ + int *start, *end; + int temp; + start = *num;//第一个数组的首个元素地址 + end = *(num+2)+2;//第三个数组的最后一个元素地址 + + while(start < end){ + temp = *start; + *start = *end; + *end = temp; + start++; + end--; + } +} + + +int main(void){ + + int num[3][3]; + int i, j; + for(i=0;i<3;i++){ + for(j=0;j<3;j++){ + scanf("%d", *(num+i)+j); + } + } + printf("\n"); + + revse(num); + + + for(i=0;i<3;i++){ + for(j=0;j<3;j++){ + printf("%d ", *(*(num+i)+j)); + } + printf("\n"); + } + + return 0; +} +``` + + + +6、 在主函数中输入10 个等长的字符串。用另一函数对它们排序。然后在主函数输出这10 个已排好序的字符串。 + +```c +#include +#include + +/* +strcmp(字符串1, 字符串2); 比较两个字符串的大小 大于返回1 小于返回-1 等于返回0 +strcpy(字符串1, 字符串2); 复制两个字符串 字符串2->字符串1 +*/ +void sort(char (*strs)[100]){ + int i, j; + char temp[100]; + for(i=0;i<10-1;i++){ + for(j=0;j<10-i-1;j++){ + if(strcmp(strs[j],strs[j+1]) > 0){ + strcpy(temp ,strs[j]); + strcpy(strs[j], strs[j+1]); + strcpy(strs[j+1], temp); + } + } + } +} + +int main(void){ + char strs[10][100]; + int i; + + for(i=0;i<10;i++){ + gets(*(strs+i)); + } + sort(strs); + printf("\n"); + for(i=0;i<10;i++){ + puts(*(strs + i)); + } + + + return 0; +} +``` + + + +7、 编一程序,打入月份号,输出该月的英文月名。例如,输入"3",则输出"March",要求用指针数组处理。 +1: January, 2: February, 3: March, 4: April, 5: May, 6: June, 7: July, 8: August, 9: September, 10: October, 11: November, 12: December + +```c +#include +#include + +int main(void){ + + //存着地址的数组 存储字符串的首地址的数组 + char *month[12] = {"January", "February", "March", "April", + "May", "June", "July", "August", "September", "October", + "November", "December"}; + int num; + + printf("请输入月份数字形式:"); + scanf("%d", &num); + printf("%s\n", *(month+num-1)); + + return 0; +} +``` + +8、 写一函数完成查找串s2 在串s1 中第一次出现的位置。 + +```c +#include +#include + +int instr(char *dest, char *substr){ + int i=0, j; + while(*(dest+i) != '\0'){ + j=0;//对子串匹配从首个开始 + while(*(substr+j)!='\0' && *(dest+i) == *(substr+j)){ + i++; + j++; + }//暴力查找主串中和子串相等的字符 到子串结尾或遇到不相同元素时退出循环 + if(j==0){//当前主串中没有和子串首元素相同的元素时 主串下标后移 + i++; + } + //匹配到子串结尾标记时代表找到首个子串 + if(*(substr+j) == '\0'){ + return i-strlen(substr)+1; + } + } + return -1;//没有找到子串 +} + +int main(void){ + char str[100]; + char substr[100]; + + gets(str); + gets(substr); + printf("%d\n", instr(str, substr)); + + + return 0; +} +``` + +9、 写一函数完成将无符号十进制整数转换成十六进制字符表示并存于字符串数组中。 + +```c +#include + +void decimalToHex(int dec, char *hex){ + int i, j, temp, count=0; + //i, j, temp 用来数组倒置 + //count 用来统计元素的个数 + while(dec){ + //模除十进制数字得余数后判断是否为数字 如果为 使用'0'加上该数之后存储为字符 + if(dec%16 < 10){ + *(hex+count++) = dec%16 + 48; + }else{ + //得到A~F时,使用大写字符ASCALL值将其转换为字符 + *(hex+count++) = dec%16-10 + 65; + } + dec /= 16; + } + //数组元素的倒置 + i = 0; + j = count - 1; + while(i < j){ + temp = *(hex + i); + *(hex + i) = *(hex + j); + *(hex + j) = temp; + i++; + j--; + } + *(hex+count) = '\0';//标记结束符 +} + +int main(void){ + int dec;//用来存储需要转换的十进制数字 + char hex[1000];//用来存储转换后的数字的 + printf("请输入一个数字:"); + scanf("%d", &dec); + + decimalToHex(dec, hex); + puts(hex); + + return 0; +} +``` + +10、 用指向指针的指针的方法对N 个整数排序并输出。要求排序单独写成一个函数。N 个整数和N 在主程序中输入,最后在主函数中输出。 + +```c +#include + +void sort(int (*arr)[10]){ + int i, j, temp; + for(i=0;i<10-1;i++){ + for(j=0;j<10-1-i;j++){ + if((*arr)[j]> (*arr)[j+1]){ + temp = (*arr)[j]; + (*arr)[j] = (*arr)[j+1]; + (*arr)[j+1] = temp; + } + } + } +} + +int main(){ + + //指针->数组 int (*变量名)[数组的元素个数] + //数组指针 指向数组的指针 + int num[10]; + int i; + + printf("请输入10个整数:"); + for(i = 0;i<10;i++){ + scanf("%d", num+i); + } + + sort(&num); + for(i = 0;i<10;i++){ + printf("%d ", num[i]); + } + printf("\n"); + + return 0; +} +``` + + + +## 七、结构体与共用体 + +1.定义一个结构体其中包括: 职工号、职工名、性别、年龄、工资、地址。按结构体类型定义一个结构体数组, 从键盘输入每个结构体元素所需的数据,然后逐个输出这些元素的数据(可设数组只有三个元素)。 + +2.有一批图书,每本书有:书名(name),作者(author) , 编号(num),出版日期(date)四个数据,希望输入后按书名的字母顺序将各书的记录排列好,供以后查询。今输入一本书的书名,如果查询到库中有此书,打印出此书的书名,作者,编号和出版日期。如果查不到此书,则打印出“无此书”。 + +3.13 个人围成一圈,从第一个人开始顺序报号1、2、3。 凡报到“3”者退出圈子。找出最后留在圈子里的人原来的序号。 + +4.编写一个程序,输入n 个(少于10 个)学生的姓名、性别、 成绩、出生年月日及入学年月日,输出成绩在80 分以上的学生的姓名、性别、成绩、出生和入学的年份。 + +5.将上题改为“输出成绩在80 分以上的18 岁以下的女生的姓名、成绩、出生和入学的年份”,试编写程序实现之。 + +6.有10 个学生,每个学生的数据包括学号、姓名、三门课的成绩,从键盘输入10 个学生数据,要求打印出三门课总平均成绩,以及最高分的学生的数据(包括学号、 姓名、三门课成绩、平均分数)。 + +7.设链表中每个结点包括学号、成绩、和指针三个字段, 试编程序打印出链表中第1,3,5,7...结点。 + +8.设链表中每个结点包括学号、成绩、和指针三个字段, 试编程序将大于平均成绩的各个结点打印出来。 + +9.设链表中每个结点包括学号、成绩、和指针三个字段, 试编程序将成绩最高的结点作为链表的第一个结点,成绩最低的结点作为尾结点。 + +10.建立一个链表,每个结点包括:学号、姓名、性别、年龄。输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,则将此结点删去。 + +## 八、文件 + +1.将10 个整数写入数据文件f3.dat 中,再读出f3.dat 中的数据并求其和。 + +2.一个以%5d 格式存放20 个整数的文件f4.dat,顺序号定为0~19。输入某一顺序号之后,读出相应的数据并显示在屏幕上。 + +3.将10 名职工的数据从键盘输入, 然后送入磁盘文件worker1. rec 中保存。设职工数据包括:职工号、职工名、性别、年龄、工资,再从磁盘调入这些数据,依次打印出来(用 fread 和fwrite 函数)。 + +4.将存放在worker1.rec 中的职工数据按工资高低排序,将排好序的各记录存放在worker2.rec 中(用 fread 和fwrite 函数)。 + +5.用scanf 函数从键盘读入 5 个学生数据(包括:学生名、学号、三门课程的分数),然后求出平均分数。用 fprintf 函数输出所有信息到磁盘文件stud.rec 中,再用fscanf 函数从 stud.rec 中读入这些数据并在显示屏上显示出来。 + +6.在文件 worker2.rec 中插入一个新职工的数据,并使插入后仍保持原来的顺序(按工资高低顺序插入到原有文件中),然后写入worker3.rec 中。 + +7.删除worker2.rec 中某个序号的职工记录,再存入原文件中(用fread 和fwrite 函数)。 + +8.有两个磁盘文件,各自存放已排好序的若干个字符(如a1. dat 中放"abort", a2.dat中放 "boy")要求将两个文件合并,合并后仍保持有序,存放在a3.dat 文件中。 +提示:可先将两个文件中的字符存入一个字符型数组中,而后对数组重新排序,再将该数组写入a3.dat文件中。 +如果不引入一个中间数组进行重新排序,该如何编程? + +## 附加题 + +1.编程序求 5X+2Y+Z=50 的所有非负整数解。 + +2.有一长度不大于40 的字符串,已知其中包含两个字符“A”,求处于这两个字符“A”中间的字符个数,并把这些字符依次打印出来。 + +3.把25 个字母A、B 、C、··· 、X、Y 按如下要求打印出来:从最中间的字母M开始打印,然后一左一右依次打印出其它字母,即M,L,N,K,O,...。要求:初始化时按字母表顺序赋值。 + +4.编一个程序,把一批非零整数中的偶数、奇数的平均值分别计算出来。用零作为终止标记。 + +5.某单位排队形,开始排成3 路纵队,末尾多出了2 人。后改成5 路纵队,末尾又多出了3 人,最后改成7 路纵队,正好没有余数。编程序求出该单位至少有多少人。 + +6.将一个6×6 数组的第一行、第六行、主对角线和副对角线上的元素都存入1,其余的元素都存入-1。请编程序实现。 +要求:1)不许对数组初始化。 + 2)尽量少用循环。 + +7.个位数是6,且能被3 整除的五位数共有多少个。 + +8.求100 至200 之间能同时被6 和8 整除的数,把这些数打印出来,并且打印这些数的和。 + +9.雨淋湿了一道算术题,9 个数字现在只能认清4 个(第一个数字虽模糊不清但肯定不是1): +image-20241130010005134 +请编程序找出那些看不清的数字。 + +10.编程序计算下述函数在X=-7,-1,0,7 时的值。 + +11.判断一个给定的5×5 方阵是否以第3 列为轴线对称? + +12.编写一个函数JOIN,让它实现字符串连接运算功能。 + +13.编写函数IND,让它判断一个字符串是否为另一个字符串的子串的功能,若是则返回第一次出现的起始位置,否则返回0。 + +14.编写一个函数,由参数传来一个字符串,分别求出此字符串中字母、数字和其它字符(不包括空格)的个数,输入和输出均由主函数实现。 + +15.已知某年不是闰年,给定该年某一天的月份和日期,求这一天是该年的第几天。 + +16.找规律,编程序打印6×6 的矩阵: +1 2 3 5 8 13 +1 4 9 17 30 51 +1 6 19 45 92 173 +. . . + +17.有人说在400,401,402,...499 这些数中4 这个数字共出现112 次,请编程序判定这种说法是否正确。若正确请打印出'YES',否则打印出'NO'及4 的出现次数。 + +18.设有8×8 的二维数组a,其中每个元素取值如下: +当 i=j 时 a[i\][j\]=M (M 是你的学号) +当 ij 时 a[i\][j\]=i×j +编程序求所有的数组元素之和。 + +19.找3 个数字,填在下面式子中,使等式成立。 +image-20241130010139383 +① 若答案有多个,则打印一组即可; +② 若无满足条件的数字,则显示'NO DIGITALS'。 + +20.某航空公司规定:在旅游旺季7─9 月份,若订票超过20 张,优惠票价的15%,20 张以下,优惠5%;在旅游淡季1─5 月、10 月、11 月份订票超过20 张,优惠30%,20 张以下,优惠20%;其余月份不优惠。请编程序能根据月份和旅客订票张数决定优惠率。 + +21.请编程序按如下格式打印一个直角三角形的九九乘法表: +1 2 3 4 5 6 7 8 9 +4 6 8 10 12 14 16 18 +9 12 15 18 21 24 27 +16 20 24 28 32 36 +25 30 35 40 45 +36 42 48 54 +49 56 63 +64 72 +81 + +22.有一批实数,用零作终止标记。请编程序找出这批数中的最大值及最小值,并输出该最大值数是这批数中的第几个数(若最大值数多次出现,只打印出第一个的位置)。 + +23.有10 个两位整数,把这些数作以下变化,如果它是素数,则把它乘以2,若它是偶数则除以2,其余的数减1,请将变化后的10 个数按从小到大的次序打印出来。 + +24.已知有N 个无规律的正整数,请编程序求出其中的素数并打印出能被5 整除的数之积。 + +25.把一个偶数位的数从当中分开成为两个数,这两个数的和的平方等于原数。如(8+1)2=81,(20+25)2=2025。求10 至9999 之间满足这样条件的数是哪些? 共有多少个? + +26.已知有9 个数,请求出这些数中的最大值、最小值及平均值,以及有多少个数等于平均值? + +27.求二维数组中每行元素的平均值,不许引入其它的数组。 + +28.编程序计算函数 +image-20241130010348202 +的值。要求先将X 的各项系数先输入到数组B 中,然后再用循环结构求P(X)的值。 + +29.猜号码∶由随机函数产生一个1 至1000 之间的整数,让人猜之。计算机仅回答人猜的数大、小还是相等,当人猜对时,由计算机打印出人一共猜了几次。 + +30.编程序将一个正整数写成其它两个正整数的平方和,若不能成立时输出“NO”。 +例如 +![image-20241130010437816](https://yp.smallkun.cn/markdown/image-20241130010437816.png!compress) + +31.将一个一维数组中的偶数依次交换。例如有8 个元素, 若其中第1、4、5 三元素是偶数时应按下图交换。 +image-20241130010458976 + +32.编程序将一个6×6 的二维数组左下三角部分全赋值为-1,右上三角全赋值为1,主对角线(行,列下标相同)上的元素送入2。把数组中的值按列对齐方式输出。 +要求: 不允许使用scanf 函数。 + +33.用随机函数求出10 组三位正整数,每组十个数,调用一函数打印出每组数,并编一函数求出每组中的最大数。 + +34.已知有三个数组A,B,C,A 为5 行5 列的二维数组,B、C 为只有5 个元素的一维数组,键盘输入数据的顺序如下: +23,45,6,1,-3,4,5,233,456,0,3,56,78,-56,5,6,77,8,89,9,3,6,8,9,90 +请编写程序,求出A 的各行之和放至数组B 的相应元素中,求出数组A 的各列之和放至数组C 的相应元素之中。程序的输出部分要按下边形式显示: +![image-20241130010557737](https://yp.smallkun.cn/markdown/image-20241130010557737.png!compress) + +35.假设a-1 和a+1 是大于10 的素数,验证image-20241130010624492 可被120 整除。编程序输入a 的值,判a-1 和a+1 是否为素数。若不是输出“NOTPRIME!”;若都是素数,再验证image-20241130010624492是否可被120 整除。 + +36.有n 个整数,编程序将前面的各个数依次向后移动k 个位置,最后k 个数移到最前边的k 个位置(见下图,其中n=8,k=3)。 +image-20241130010716416 +思考: 程序中不许引入其它数组。 + +37.将一个数M 分解为质因数(M≠0)。 + +38.将一个整数(最多是10 位数)从低位到高位打印出来,如该数是12345 时,输出应是54321(只占一行)。 + +39.写一个函数比较两个字符串,如果s1=s2,则返回值0;如果s1>s2,则返回值1;如果s1k, n=>m; +3)若m<5,转第5 步,否则执行第4 步; +4)m/5(取整)=>m, k+m=>k, 转第3 步; +5)输出k(n!末尾零的个数)。 + +41.分别输入N 和M 个数到数组A 和数组B 中。把只在其中一个数组中出现的那些数送入到数组C 中,并指出它们在A 或B 数组中的位置。 + +42.用记录来描述一个学生的成绩情况,内容包括:姓名、学号、数学成绩和PASCAL成绩。要求对一个小组的10 个学生的成绩进行统计处理: +1)计算学生的总平均分,并按平均分高低排出名次,打印出姓名。 +2)打印出90 分以上和不及格者的名字。 +要求用子程序来完成。 + +43.已知M1 是3×5 的矩阵, M2 是5×2 的矩阵, 编程序求出M1 与M2 之积。 + +44.百马百瓦问题。有100 匹马,100 块瓦,大马驮3 块,小马驮2 块,两个马驹驮1块。问大马、小马、马驹各多少? +要求:① 不许用for 循环; ② 循环次数尽量少。 + +45.找规律填写N×N 方阵。如N=8 时, 其方阵为: +image-20241130011036567 + +46.插入排序。许多玩牌的人是以这样的方式来对他们手中的牌进行排序的:设手中原有3张牌已排好序,抓1 张新牌,若这张新牌的次序在原来的第2 张牌之后,第3 张牌之前,那么就把这张新牌放在第3 张牌的位置上,原来的第3 张改为第4 张, 然后再抓新牌。按着这个算法,编写一个排序程序。 +注:开始一张牌也没有,从第一张牌开始抓起。 + +47.求N 阶方阵(即N×N 数组)中各条反斜线上的元素之和。如4×4 数组共有7 条反斜线: +![image-20241130011108944](https://yp.smallkun.cn/markdown/image-20241130011108944.png!compress) + +48.自然数N 一般写成如下形式: +![image-20241130011124712](https://yp.smallkun.cn/markdown/image-20241130011124712.png!compress!compress) +如果image-20241130011207358>di (i=k-1,k-2,...,1),则称N 是严格降序数;如果image-20241130011207358=di (i=k-1,k-2,...,1),则称N 是等序数;此外,则称N是无序数。例如, 4321 是严格降序数,1234 是严格升序数,2222 是等序数,1243 是无序数。从键盘上输入一个大于9 的整数N,判它属于上述哪一类。 + +49.用简单迭代法解方程 image-20241130011311960它有两个根(如图),其迭代公式为: +![image-20241130011327616](https://yp.smallkun.cn/markdown/image-20241130011327616.png!compress!compress) +注:本程序中选取初值image-20241130011341115 不同时,要分别使用公式1 或公式2 迭代,得原方程<0 或>0 +的解。(公式由来略) + +50.洗扑克牌。将54 张牌分别编号为1,2,…,54 号,并放在数组M 中。洗牌方法如下:产生[1,54]区间内的一个随机数K,将M[1]与M[K]交换;然后产生[2,54]之间的随机整数K,让M[2]与M[K]交换;…,直到剩下最后一张牌为止。请编写实现上述洗牌的程序。 + +51.有N 张牌,计算机和你轮流取牌,每次只能取 1─2 张,谁最后取完谁胜利。编写完成此功能的程序。 +要求: +1)让计算机先取。 +2)你取的张数由键盘输入。 +3)计算机第一次取牌时由键盘输入来确定是取1 还是取2,以后它再取牌时由程序 +判断来决定取几张牌。 + +52.已知A 是有30 个元素的整型数组,编写一个对A[I1]到A[I2](I1≤I2)之间的元素排序的函数(从大到小排序)。请调用上述函数先将A[5]至A[20]之间的元素排序,然后将A中的所有元素值输出。再调用上述函数对A[15]至A[30]之间的元素排序,最后再将A 中30 个元素值输出。 +要求:1) 输入输出均由主函数实现。 + 2)输出时每10 个元素占1 行。 + +53.编程序求3 至39 之间满足下列条件的各组素数:每组有3 个素数,第2 个比第一个大2,第3 个比第2 个大4。例如 5,7,11 就是满足条件的一组。 +要求:1) 不许使用数组。 + 2)打印满足条件的各组素数。 + 3)求出满足条件的素数共有多少组。 + +54.已知N 是正整数, 它可拆写成三个正整数N1、N2和N3 之和的形式N=N1+N2+N3。请编程序打印出满足上式的全部组合,并当N1、N2 和N3 中至少有两个是素数时打印“YES”否则打印“NO”。 +image-20241130011603125 + +55.编写程序,按照 1,2, ... , 28 的顺序填一个7×7 数组的左上角,程序的输出结果为: +![image-20241130011618828](https://yp.smallkun.cn/markdown/image-20241130011618828.png!compress) + +56.二维数组排序。设有4×5 的数组M,通过排序使M[1\][1\]≤M[1\][2\]≤...≤M[1\][5\]≤M[2\][1\]≤M[2\][2\]≤...≤M[2\][5\]≤...≤M[4\][1\]≤M[4\][2\]≤...≤M[4\][5\]。排序时不允许引入其它数组。 + +57.编写将一个十进制数M 转化成N 进制数(2≤N≤16)的程序。提示:转化成N 进制数的各位数可以分别放在数组的各个元素中。 +注意:进制N 超过10 时, 用A 表示10,B 表示11,…,F 表示15。 + +58.在主函数中输入10 个不等长的字符串,用另一函数对它们排序。然后在主函数中输出这10 个已排好序的字符串,用指针数组完成。 + +59.建立一个链表,每个结点包括:学号、姓名、性别、年龄。输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,将此结点删除,输出最后的链表。 + +60.有两个链表a和b。设结点中包含学号、姓名。从a链表中删除与b链表中有相同学号的那些结点。 diff --git a/2207/C语言/6.C语言精通120题/C语言精通120题.md b/2207/C语言/6.C语言精通120题/C语言精通120题.md new file mode 100644 index 0000000..41a9ca9 --- /dev/null +++ b/2207/C语言/6.C语言精通120题/C语言精通120题.md @@ -0,0 +1,254 @@ +1.输入一小写字母,分别以字符形式与数值形式输出与该小写字母相应的大写字母 +```sql +//输入一小写字母,分别以字符形式与数值形式输出与该小写字母相应的大写字母 +#include +int main(void) +{ + char c; + scanf("%c",&c); + if(c>='a'&&c<='z') + printf("%c\n",c-32); + else + printf("%c\n",c+32); + return 0; +} +``` + +2.输入一个华氏温度,要求输出摄氏温度。公式为c=5/9*(f-32) + +3.写一个程序,输入实数X,输出Y,计算 +image-20250116004443767 + +4.编写程序:读入三个整数a,b,c,然后交换它们中的数,使a存放b的值,b存放c的值,c存放a的值。 + +5.编写程序:输入9时23分并把它化为分钟后输出。(从零点整开始计算)。 + +6.要将“Chiina”翻译成密码,密码规律是:用原来的字母后面第4个字母代替原来的字母。例如,字母“ A”后面的4个字母是“E”,用“E”代替“A”。因此,“Chian”应译成“Glmre”。用赋初值的方法 是c1,c2,c3,c4,c5五个变量的值分别为‘C’、‘h’、‘i’、‘n’、‘a’,经过运算,使c1、c2、 c3、c4、c5分别为‘G’、‘l’、‘m’、‘r’、‘e’,并输出 + +7.编写程序,用getchar函数读入两个字符c1,c2,然后分别用putchar函数和prinf函数输出这两个字符以 及它们的ASCII值。 + +8.设圆半径r=1.5,圆柱高h=3,求圆周长,圆面积,圆球表面积,圆球体积,圆柱体积 + +9.编写程序,输入两个整数 ,计算并输出它们的和、差、积、除(精确除)、整除及模的结果。 + +10.编一程序,对于一个给定的一个百分制成绩,输出相应的五分制成绩。设:90分以上为ˊAˊ,80~89 分为ˊBˊ,70~79分为ˊCˊ,60~69分为ˊDˊ,60分以下为ˊEˊ。 + +11.输入3个整数,要求按由小到大的顺序输出 + +12.输入4个数,输出其中的最大数和最小数。 + +13.有以函数y=x(x<1);2x-1(1<=x<10);3x-11(x>=10).写一程序,输入x,输出y. + +14.给定一个不多于5的正整数,要求:(1)求它是几位数;(2)分别打印出每一位数字(3)按逆序打 印出各位数字. + +15.编写程序,要求输入整数a和b.若a2+b2大于100,则输出a2+b2百位以上的数字,否则输出两数之和。 + +16.根据输入的三角形的三边判断是否能组成三角形,若可以则输出它的面积和三角形的类型 + +17.判断输入的正整数是否既是5又是7的整倍数。若是,则输出yes,否则输出no + +18.输入4个整数,求4个数中的偶数之和. + +19.输入4个整数,求4个数中的奇数之和 + +20.假设奖金税率如下(a代表奖金,r代表税率)a<500 r=0%;500<=a<1000 r=5%;1000<=a<2000 r=8%;2000<=a<3000 r=10%;3000<=a r=15%编写程序用if语句实现:对输入的一个资金数,求税率和应交税款以及实际奖金数(扣除奖金税后)。 + +21.输入一个字符,如果是大写字母,转换为小写,如果不是不转换。最后输出。 + +22.键盘上输入三角形三边a,b,c 的值,计算三角形面积,并输出三角形的三边a,b,c及面积area的值。三 角形面积的公式:s=(a+b+c)/2 area=sqrt[s(s-a)(s-b)(s-c)]. + +23.编写一个程序,根据用户输入的一个字母判定它是星期几。要求用switch语句实现程序控制,当第一个字母相同时,如:T(t)uesday 和T(t)hursday故需要进一步输入U或u或H或h确认。 + +24.编写一个程序:输入某年某月,判断这一月有多少天? + +25.从键盘上输入字母或0~9的数字,编写程序对其进行分类。字母可分为大写字母和小写字母,数字可分 为奇数和偶数。 + +26.编写程序:加密数据,方法:对给定数值,每一位数字均加2,且在[0,9]范围内,若加密后某位数字 大于9,则取其被10除的余数. + +27.编写程序:计算从1995年1月1日至2000年12月10日共有多少天。闰年的2月有29天.闰年满足如下条件 :能被400整除或能被4 整除但不能被100整除。 + +28.编程求解一元二次方程 ax2+bx+c=0的根。 + +29.有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? + +31.已知abc+cba=1333,其中a、b、c均为一位数,编写一个程序求出a、b、c分别代表什么数字。 + +32.鸡兔共有30只,脚共有90只,编写一程序计算鸡兔各有多少只。 + +33.输入两个正整数m和n,求其最大公约数和最小公倍数. + +34.输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。见87题 + +35.一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程:找出1000以内的所 有完数。 + +36.猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩 下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再 吃时,见只剩下一个桃子了。求第一天共摘了多少. + +37.有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和. + +38.编写一个程序显示ASCII码65~90(十进制)的字符对照表。并输出6个数换一行。 + +39.已知xyz+yzz=532,其中x、y、z都是数字,编写一个程序求出x、y、z分别代表什么数字。 + +40.已知四位数a2b3能被23整除,编写一程序求此四位数。 + +41.输入n,计算s=1+1+2+1+2+3+1+2+3+4+...+1+2+3+4+...+n + +42.从两个红球,三个白球,四个黑球中任意取出五个球,且其中必有白球,编写程序输出所有可能方案 + +43.花数”是指一个三位数,其各位数字立方和等于该数。 + +44.编写一程序:求1-3+5-7+…-99+101的值。 + +45.编写一程序:输入一个正偶数n,将其分解成两个素数之和。 + +46.编写程序,从键盘输入6名学生的5门成绩,分别统计出每个学生的平均成绩。 + +47.编程在屏幕上输出具有7行的正三角形。 + +48.若用0至9之间不同的三个数构成一个三位数,编写一个程序统计出共有多少种方法。 + +49.编程输出100—200之间第一个能被3整除的之前的所有整数。 + +50.把100—200之间的不能被3整除的整数输出。 + +51.求输入的10个整数中正数的个数以及其平均值。 + +52.求出1000以内的所有素数,要求一行输出30个。 + +53.有1020个西瓜,第一天卖一半多两个,以后每天卖剩下的一半多两个,问几天以后能卖完?。 + +54.4位反序数:设N是一个四位数,它的9倍恰好是其反序数,求N. + +55.有限5位数:个位数为6且能被3整除的五位数共有多少? + +56.编写一程序计算1到正整数n之间的奇数之和以及偶数之和。 + +57.编写一程序计算100到1000之间有多少个数其各位数字之和是5。 + +58.学校有近千名学生,在操场上排队,5人一行余2人,7人一行余3人,3人一行余1人,编写一程序求该 校的学生人数。 + +59.编写一程序实现从键盘输入10个数,找到第一个能被7整除的数。若,找到,打印此数后退出循环;若 未找到,打印“not exist”。 + +60.编写一程序:计算用一角、二角和五角凑成一元有多少种组合,并打印输出每种组合。 + +61.在数组a中按照顺序查找值为y的元素。若数组a中不存在该元素,则输出不存在;若存在这样的元素,则显示元素的下标,以及元素的总个数 见实验指导书P60必做题1。 + +62.数组中存放N个元素,编写程序删除掉下标为奇数的元素,使得数组中只存放下标为偶数的元素。. + +63.数组s中存放有N个同学的某一门功课的成绩。要求编写程序,求出有多少个同学的成绩高于此门功课的平均分。 + +64.输入一个3行3列矩阵的所有元素,求该矩阵周边各元素的和。 见实验指导书P65必做题1。 + +65.判定一个字符串是否是回文串。(所谓回文串是指从开头读和从末尾读均为相同字符的字符串。例如:abcdcba。 见实验指导书P71必做题1。 + +66.读入一个字符串,要求将该字符中所有字符按照递增的顺序进行排序(采用冒泡排序算法)后输出。 + +67.编程将两个字符串连接起来,不准使用strcat函数。 + +68.有10个字符串,找出每个字符串中最大字符,并按顺序放入一维数组a[10]中,即第i个字符串中最大字符放入a[i]中,输出a[i]数组。 + +69.编程将任意十进制数转化成N进制。 + +70.设数组a中的元素均为正整数,编程求a数组中偶数的个数和偶数的平均值。 + +71.数组a包括10个整数,把a中所有的后项除以前项之商取整后存入数组b,并按每行3个元素的格式输出数组b.试编程。. + +72.编程:从键盘输入一个字符串a,并在a串中的最大元素后边插入字符串b + +73.输入一个正整数,按逆序输出各位的数字。 + +74.将二维数组行列元素互换,存到另一个数组中。 + +75.有一个3*4矩阵,求最大元素值及其行、列号。 + +76.有10个字符串,找出每个字符串中最大字符,依次存入一维字符数组a中,即第i个字符串中的最大字符放入a[i]中,输出数组a 同题68 + +77.设数组a中的元素均为正整数,编程求a数组中偶数的个数和偶数的平均值 同题70 + +78.编写一个程序,将字符数组s2中的全部字符拷贝到字符数组s1中。不得使用strcpy函数。拷贝时,‘\0‘也要拷贝过去。 + +79.将一个字符串中下标值为偶数的元素由小到大排序,其它元素不变。 + +80.使用二维数组打印杨辉三角形 + +81.从键盘输入一个二维整型数组,如a[4\][4\]={ 1,2,3,4,2,2,5,6,3,5,3,7,4,6,7,4},试编程检查一个二维数组是否对称(即对所有i,j都有a[i\][j\]=a[j\][i\])。 + +82.输入5个整数,找出最大数和最小数所在的位置,并把二者对调,然后输出调整后的5个数. + +83.将字符串S中所有下标为奇数的位置上的字母大小写互换。 + +84.求矩阵a和b的和,结果存入矩阵c中并按矩阵形式输出。 + +85.有5个同学,每个同学有4门功课的考试成绩,求每人的平均成绩和每门功课的平均成绩。要求只用一个2维数组完成; + +86. 编写一程序完成字符串处理函数(strcat字符串连接函数功能,不允许使用strcat函数实现),即连接两字符串a,b,将字符串b中字符连接到字符串a后成为一个字符串。(要求两字符串a,b 在主函数中输入,连接部分编写一函数完成,结果由主函数输出完成。) + +87.编写函数统计字符串中字母、数字、空格和其他字符的个数。(要求在主函数中输入字符串以及输出上述结果,子函数完成统计功能。) + +88.采用函数的方法实现“冒泡法”排序对输入的10个字符按从小到大的顺序进行排列。(要求在主函数中输入字符并输出排序结果。提示:字符从键盘接收到后放入数组中存放,数组名作为函数参数。) + +89.编写一函数将一十进制数转换成2进制数并按顺序输出。(要求在主函数中输入此十进制数,由子函数进行转换并把结果传递给主函数。) + +90.编写一程序实现:输入年、月、日,计算出该日是该年的第多少天。(要求在主函数中输入数据,计算过程由函数完成并将最后结果返回主函数输出。) + +91.使用函数实现求n的阶乘。(主函数输入数据n,子函数求出阶乘的值并返回给主函数) 见实验指导书P80必做题第2题。 + +92.使用函数求两个整数的最大公约数和最小公倍数。(主函数输入两个数,子函数gongyue( )用来求最大公约数,子函数gongbei( )用来求最小公倍数) 见实验指导书P81选做题第1题。 + +93.使用函数求某长整型数据的各位数字之积。(主函数输入长整型数据,子函数func( )分离出各位数字,并将乘积返回给主函数) 见实验指导书P83选做题第3题。 + +94.使用函数求3名同学5门课的平均成绩。(主函数输入3名同学5门课的成绩,子函数计算出某名同学5门课的均分并返回给主函数) + +95.使用函数实现字符串的颠倒存放操作。(主函数中使用字符串处理函数实现字符串的输入,子函数实现字符串的颠倒操作,使用字符串名作为函数参数。注意:应实现字符串的颠倒存放,而不是逆序输出) + +96.子串删除。函数delete(s,i,n)实现从字符串s中删除下标为i的字符开始的n个字符。(主函数实现全局字符数组s和全局变量i、n的输入,并假设i 、n和i+n的值都小于字符串的 + +长度) + +97.输入一字符串,如果该字符串中含有字符’s’,则返回该字符串的最后一个字符,否则输出“no”。(主函数输入一行字符,子函数getline( )的作用是判断是否含有’s’,返回最后一个字母或输出“no”。) + +98.使用函数求解一元二次方程的根,方程的系数由主函数输入得到,并且设a、b均不等于0。 + +99.编写一程序完成字符串处理函数(strcpy字符串复制函数功能,不允许使用strcpy函数实现),即将字符串a的内容完整的复制到字符串b中(连同字符串a中’\0’也要复制)。(要求字符串a内容在主函数中输入,复制部分编写一函数完成,结果由主函数输出完成。) + +100.编写一程序完成对于一个大于等于3的正整数,判断它是不是一个素数(要求数据由主函数输入,判断部分编写一函数实现,结果由主函数输出完成。) + +101.编写一程序将一包含n个字符的字符串中从第m个字符开始的全部字符复制到另外一个字符串(n>m)。(要求数据由主函数输入,复制部分编写一函数实现,复制后结果由主函数输出完成。) + +102.使用函数实现华氏温度向摄氏温度的转换,转换公式如下:C=(5/9)*(F-32),其中C为摄氏温度,F为华氏温度。(子函数实现温度转化,并将结果返回给主函数).见实验指导书P79必做题第1题。 + +103.写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。. + +104.用函数实现一些程序:计算10个学生的1门课程成绩的平均值.. 见实验指导书P85必做题第1题。 + +105.有15个数按由大到小顺序存放在一个数组int a={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}中,输入一个数用顺序查找法找出该数是数组中的第几个元素的值(元素下标值),若该数不在数组中则打印“无此数”。 (要求数据由主函数输入,查找部分编写一函数实现,结果由主函数输出完成。) + +106.定义一个带参数的宏,完成从四个数中找出最大数的操作。 + +107.根据已知算法定义一个带参数的宏,用来判别程序中输入的年份是否闰年。 + +108.试定义一个带参数的宏swap(x,y),以实现两个整数之间的交换,并利用它将一维数组a和b的所有元素的值进行交换。 + +109.输入两个整数,求它们相除的余数.用带参数的宏来实现,编程序. + +110.定义两个带参数的宏,一个用来求S(s=1/2(a+b+c)),另个用来求area(area为三角形的面积)。写程序,在程序中用带实参的宏名来求面积area。 + +111.已知字符串S中的内容为“Student!”,请用指针的方法将S中的内容逆序输出,且不能改变串中的内容。 + +112.输入一行文字,找出其中大写字母、小写字母、空格、数字以及其他字符个数。(要求用指针实现)。 + +113.通过指针操作,将输入的3个字符串,按由大到小的顺序输出。 + +114.定义整型数组a,有10个元素,用指针实现数组中的全部元素的输出. + +115.编一程序,将字符串computer赋给一个字符数组,然后从第一个字母开始间隔地输出该串。请用指针完成。 + +116.利用指针编写一程序,将字符串中的第m个字符开始的全部字符复制成另一个字符串。要求在主函数中输入字符串及m的值并输出复制结果,在被调函数中完成复制。 + +117.用指针法实现:输入10个数,按由小到大的顺序输出。 + +118.用指针法实现:写一个函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度值。 + +119.从键盘输入10个学生的成绩,显示其中的最高分、最低分和平均分。用指针实现。 + +120.数组中存放N个元素,编写程序删除掉下标为奇数的元素,使得数组中只存放下标为偶数的元素。用指针实现。 diff --git a/2207/C语言/修改颜色.c b/2207/C语言/修改颜色.c new file mode 100644 index 0000000..1cda6a4 --- /dev/null +++ b/2207/C语言/修改颜色.c @@ -0,0 +1,20 @@ +#include +// !定义一些ANSI颜色代码 +#define RESET "\033[0m" +#define BLACK "\033[30m" /* Black */ +#define RED "\033[31m" /* Red */ +#define GREEN "\033[32m" /* Green */ +#define YELLOW "\033[33m" /* Yellow */ +#define BLUE "\033[34m" /* Blue */ +#define MAGENTA "\033[35m" /* Magenta */ +#define CYAN "\033[36m" /* Cyan */ +#define WHITE "\033[37m" /* White */ + +int main() { + // 使用颜色代码输出文本 + printf(YELLOW "This is black text\n" RESET); + printf(RED "This is red text\n" RESET); + printf(GREEN "This is green text\n" RESET); + // ... 其他颜色输出 + return 0; +} \ No newline at end of file diff --git a/2207/C语言精通120题.md b/2207/C语言精通120题.md new file mode 100644 index 0000000..147ed10 --- /dev/null +++ b/2207/C语言精通120题.md @@ -0,0 +1,478 @@ +1.输入一小写字母,分别以字符形式与数值形式输出与该小写字母相应的大写字母 + + + +2.输入一个华氏温度,要求输出摄氏温度。公式为c=5/9*(f-32) + + + +3.写一个程序,输入实数X,输出Y,计算image-20250116004443767 + + + +4.编写程序:读入三个整数a,b,c,然后交换它们中的数,使a存放b的值,b存放c的值,c存放a的值。 + + + +5.编写程序:输入9时23分并把它化为分钟后输出。(从零点整开始计算)。 + + + +6.要将“Chiina”翻译成密码,密码规律是:用原来的字母后面第4个字母代替原来的字母。例如,字母“ A”后面的4个字母是“E”,用“E”代替“A”。因此,“Chian”应译成“Glmre”。用赋初值的方法 是c1,c2,c3,c4,c5五个变量的值分别为‘C’、‘h’、‘i’、‘n’、‘a’,经过运算,使c1、c2、 c3、c4、c5分别为‘G’、‘l’、‘m’、‘r’、‘e’,并输出 + + + +7.编写程序,用getchar函数读入两个字符c1,c2,然后分别用putchar函数和prinf函数输出这两个字符以 及它们的ASCII值。 + + + +8.设圆半径r=1.5,圆柱高h=3,求圆周长,圆面积,圆球表面积,圆球体积,圆柱体积 + + + +9.编写程序,输入两个整数 ,计算并输出它们的和、差、积、除(精确除)、整除及模的结果。 + + + +10.编一程序,对于一个给定的一个百分制成绩,输出相应的五分制成绩。设:90分以上为ˊAˊ,80~89 分为ˊBˊ,70~79分为ˊCˊ,60~69分为ˊDˊ,60分以下为ˊEˊ。 + + + +11.输入3个整数,要求按由小到大的顺序输出 + + + +12.输入4个数,输出其中的最大数和最小数。 + + + +13.有以函数y=x(x<1);2x-1(1<=x<10);3x-11(x>=10).写一程序,输入x,输出y. + + + +14.给定一个不多于5的正整数,要求:(1)求它是几位数;(2)分别打印出每一位数字(3)按逆序打 印出各位数字. + + + +15.编写程序,要求输入整数a和b.若a2+b2大于100,则输出a2+b2百位以上的数字,否则输出两数之和。 + + + +16.根据输入的三角形的三边判断是否能组成三角形,若可以则输出它的面积和三角形的类型 + + + +17.判断输入的正整数是否既是5又是7的整倍数。若是,则输出yes,否则输出no + + + +18.输入4个整数,求4个数中的偶数之和. + + + +19.输入4个整数,求4个数中的奇数之和 + + + +20.假设奖金税率如下(a代表奖金,r代表税率)a<500 r=0%;500<=a<1000 r=5%;1000<=a<2000 r=8%; + + 2000<=a<3000 r=10%;3000<=a r=15%编写程序用if语句实现:对输入的一个资金数,求税率和应交 税款以及实际奖金数(扣除奖金税后)。 + + + +21.输入一个字符,如果是大写字母,转换为小写,如果不是不转换。最后输出。 + + + +22.键盘上输入三角形三边a,b,c 的值,计算三角形面积,并输出三角形的三边a,b,c及面积area的值。三 角形面积的公式:s=(a+b+c)/2 area=sqrt[s(s-a)(s-b)(s-c)]. + + + +23.编写一个程序,根据用户输入的一个字母判定它是星期几。要求用switch语句实现程序控制,当第一个字母相同时,如:T(t)uesday 和T(t)hursday故需要进一步输入U或u或H或h确认。 + + + +24.编写一个程序:输入某年某月,判断这一月有多少天? + + + +25.从键盘上输入字母或0~9的数字,编写程序对其进行分类。字母可分为大写字母和小写字母,数字可分 为奇数和偶数。 + + + +26.编写程序:加密数据,方法:对给定数值,每一位数字均加2,且在[0,9]范围内,若加密后某位数字 大于9,则取其被10除的余数. + + + +27.编写程序:计算从1995年1月1日至2000年12月10日共有多少天。闰年的2月有29天.闰年满足如下条件 :能被400整除或能被4 整除但不能被100整除。 + + + +28.编程求解一元二次方程 ax2+bx+c=0的根。 + + + +29.有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? + + + +31.已知abc+cba=1333,其中a、b、c均为一位数,编写一个程序求出a、b、c分别代表什么数字。 + + + +32.鸡兔共有30只,脚共有90只,编写一程序计算鸡兔各有多少只。 + + + +33.输入两个正整数m和n,求其最大公约数和最小公倍数. + + + +34.输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。见87题 + + + +35.一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程:找出1000以内的所 有完数。 + + + +36.猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩 下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再 吃时,见只剩下一个桃子了。求第一天共摘了多少. + + + +37.有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和. + + + +38.编写一个程序显示ASCII码65~90(十进制)的字符对照表。并输出6个数换一行。 + + + +39.已知xyz+yzz=532,其中x、y、z都是数字,编写一个程序求出x、y、z分别代表什么数字。 + + + +40.已知四位数a2b3能被23整除,编写一程序求此四位数。 + + + +41.输入n,计算s=1+1+2+1+2+3+1+2+3+4+...+1+2+3+4+...+n + + + +42.从两个红球,三个白球,四个黑球中任意取出五个球,且其中必有白球,编写程序输出所有可能方案 + + + +43.花数”是指一个三位数,其各位数字立方和等于该数。 + + + +44.编写一程序:求1-3+5-7+…-99+101的值。 + + + +45.编写一程序:输入一个正偶数n,将其分解成两个素数之和。 + + + +46.编写程序,从键盘输入6名学生的5门成绩,分别统计出每个学生的平均成绩。 + + + +47.编程在屏幕上输出具有7行的正三角形。 + + + +48.若用0至9之间不同的三个数构成一个三位数,编写一个程序统计出共有多少种方法。 + + + +49.编程输出100—200之间第一个能被3整除的之前的所有整数。 + + + +50.把100—200之间的不能被3整除的整数输出。 + + + +51.求输入的10个整数中正数的个数以及其平均值。 + + + +52.求出1000以内的所有素数,要求一行输出30个。 + + + +53.有1020个西瓜,第一天卖一半多两个,以后每天卖剩下的一半多两个,问几天以后能卖完?。 + + + +54.4位反序数:设N是一个四位数,它的9倍恰好是其反序数,求N. + + + +55.有限5位数:个位数为6且能被3整除的五位数共有多少? + + + +56.编写一程序计算1到正整数n之间的奇数之和以及偶数之和。 + + + +57.编写一程序计算100到1000之间有多少个数其各位数字之和是5。 + + + +58.学校有近千名学生,在操场上排队,5人一行余2人,7人一行余3人,3人一行余1人,编写一程序求该 校的学生人数。 + + + +59.编写一程序实现从键盘输入10个数,找到第一个能被7整除的数。若,找到,打印此数后退出循环;若 未找到,打印“not exist”。 + + + +60.编写一程序:计算用一角、二角和五角凑成一元有多少种组合,并打印输出每种组合。 + + + +61.在数组a中按照顺序查找值为y的元素。若数组a中不存在该元素,则输出不存在;若存在这样的元素,则显示元素的下标,以及元素的总个数 见实验指导书P60必做题1。 + + + +62.数组中存放N个元素,编写程序删除掉下标为奇数的元素,使得数组中只存放下标为偶数的元素。. + + + +63.数组s中存放有N个同学的某一门功课的成绩。要求编写程序,求出有多少个同学的成绩高于此门功课的平均分。 + + + +64.输入一个3行3列矩阵的所有元素,求该矩阵周边各元素的和。 见实验指导书P65必做题1。 + + + +65.判定一个字符串是否是回文串。(所谓回文串是指从开头读和从末尾读均为相同字符的字符串。例如:abcdcba。 见实验指导书P71必做题1。 + + + +66.读入一个字符串,要求将该字符中所有字符按照递增的顺序进行排序(采用冒泡排序算法)后输出。 + + + +67.编程将两个字符串连接起来,不准使用strcat函数。 + + + +68.有10个字符串,找出每个字符串中最大字符,并按顺序放入一维数组a[10]中,即第i个字符串中最大字符放入a[i]中,输出a[i]数组。 + + + +69.编程将任意十进制数转化成N进制。 + + + +70.设数组a中的元素均为正整数,编程求a数组中偶数的个数和偶数的平均值。 + + + +71.数组a包括10个整数,把a中所有的后项除以前项之商取整后存入数组b,并按每行3个元素的格式输出数组b.试编程。. + + + +72.编程:从键盘输入一个字符串a,并在a串中的最大元素后边插入字符串b + + + +73.输入一个正整数,按逆序输出各位的数字。 + + + +74.将二维数组行列元素互换,存到另一个数组中。 + + + +75.有一个3*4矩阵,求最大元素值及其行、列号。 + + + +76.有10个字符串,找出每个字符串中最大字符,依次存入一维字符数组a中,即第i个字符串中的最大字符放入a[i]中,输出数组a 同题68 + + + +77.设数组a中的元素均为正整数,编程求a数组中偶数的个数和偶数的平均值 同题70 + + + +78.编写一个程序,将字符数组s2中的全部字符拷贝到字符数组s1中。不得使用strcpy函数。拷贝时,‘\0‘也要拷贝过去。 + + + +79.将一个字符串中下标值为偶数的元素由小到大排序,其它元素不变。 + + + +80.使用二维数组打印杨辉三角形 + + + +81.从键盘输入一个二维整型数组,如a\[4\]\[4\]={ 1,2,3,4,2,2,5,6,3,5,3,7,4,6,7,4},试编程检查一个二维数组是否对称(即对所有i,j都有a\[i\]\[j\]=a\[j\]\[i\])。 + + + +82.输入5个整数,找出最大数和最小数所在的位置,并把二者对调,然后输出调整后的5个数. + + + +83.将字符串S中所有下标为奇数的位置上的字母大小写互换。 + + + +84.求矩阵a和b的和,结果存入矩阵c中并按矩阵形式输出。 + + + +85.有5个同学,每个同学有4门功课的考试成绩,求每人的平均成绩和每门功课的平均成绩。要求只用一个2维数组完成; + + + +86. 编写一程序完成字符串处理函数(strcat字符串连接函数功能,不允许使用strcat函数实现),即连接两字符串a,b,将字符串b中字符连接到字符串a后成为一个字符串。(要求两字符串a,b 在主函数中输入,连接部分编写一函数完成,结果由主函数输出完成。) + + + +87.编写函数统计字符串中字母、数字、空格和其他字符的个数。(要求在主函数中输入字符串以及输出上述结果,子函数完成统计功能。) + + + +88.采用函数的方法实现“冒泡法”排序对输入的10个字符按从小到大的顺序进行排列。(要求在主函数中输入字符并输出排序结果。提示:字符从键盘接收到后放入数组中存放,数组名作为函数参数。) + + + +89.编写一函数将一十进制数转换成2进制数并按顺序输出。(要求在主函数中输入此十进制数,由子函数进行转换并把结果传递给主函数。) + + + +90.编写一程序实现:输入年、月、日,计算出该日是该年的第多少天。(要求在主函数中输入数据,计算过程由函数完成并将最后结果返回主函数输出。) + + + +91.使用函数实现求n的阶乘。(主函数输入数据n,子函数求出阶乘的值并返回给主函数) 见实验指导书P80必做题第2题。 + + + +92.使用函数求两个整数的最大公约数和最小公倍数。(主函数输入两个数,子函数gongyue( )用来求最大公约数,子函数gongbei( )用来求最小公倍数) 见实验指导书P81选做题第1题。 + + + +93.使用函数求某长整型数据的各位数字之积。(主函数输入长整型数据,子函数func( )分离出各位数字,并将乘积返回给主函数) 见实验指导书P83选做题第3题。 + + + +94.使用函数求3名同学5门课的平均成绩。(主函数输入3名同学5门课的成绩,子函数计算出某名同学5门课的均分并返回给主函数) + + + +95.使用函数实现字符串的颠倒存放操作。(主函数中使用字符串处理函数实现字符串的输入,子函数实现字符串的颠倒操作,使用字符串名作为函数参数。注意:应实现字符串的颠倒存放,而不是逆序输出) + + + +96.子串删除。函数delete(s,i,n)实现从字符串s中删除下标为i的字符开始的n个字符。(主函数实现全局字符数组s和全局变量i、n的输入,并假设i 、n和i+n的值都小于字符串的 + +长度) + + + +97.输入一字符串,如果该字符串中含有字符’s’,则返回该字符串的最后一个字符,否则输出“no”。(主函数输入一行字符,子函数getline( )的作用是判断是否含有’s’,返回最后一个字母或输出“no”。) + + + +98.使用函数求解一元二次方程的根,方程的系数由主函数输入得到,并且设a、b均不等于0。 + + + +99.编写一程序完成字符串处理函数(strcpy字符串复制函数功能,不允许使用strcpy函数实现),即将字符串a的内容完整的复制到字符串b中(连同字符串a中’\0’也要复制)。(要求字符串a内容在主函数中输入,复制部分编写一函数完成,结果由主函数输出完成。) + + + +100.编写一程序完成对于一个大于等于3的正整数,判断它是不是一个素数(要求数据由主函数输入,判断部分编写一函数实现,结果由主函数输出完成。) + + + +101.编写一程序将一包含n个字符的字符串中从第m个字符开始的全部字符复制到另外一个字符串(n>m)。(要求数据由主函数输入,复制部分编写一函数实现,复制后结果由主函数输出完成。) + + + +102.使用函数实现华氏温度向摄氏温度的转换,转换公式如下:C=(5/9)*(F-32),其中C为摄氏温度,F为华氏温度。(子函数实现温度转化,并将结果返回给主函数).见实验指导书P79必做题第1题。 + + + +103.写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。. + + + +104.用函数实现一些程序:计算10个学生的1门课程成绩的平均值.. 见实验指导书P85必做题第1题。 + + + +105.有15个数按由大到小顺序存放在一个数组int a={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}中,输入一个数用顺序查找法找出该数是数组中的第几个元素的值(元素下标值),若该数不在数组中则打印“无此数”。 (要求数据由主函数输入,查找部分编写一函数实现,结果由主函数输出完成。) + + + +106.定义一个带参数的宏,完成从四个数中找出最大数的操作。 + + + +107.根据已知算法定义一个带参数的宏,用来判别程序中输入的年份是否闰年。 + + + +108.试定义一个带参数的宏swap(x,y),以实现两个整数之间的交换,并利用它将一维数组a和b的所有元素的值进行交换。 + + + +109.输入两个整数,求它们相除的余数.用带参数的宏来实现,编程序. + + + +110.定义两个带参数的宏,一个用来求S(s=1/2(a+b+c)),另个用来求area(area为三角形的面积)。写程序,在程序中用带实参的宏名来求面积area。 + + + +111.已知字符串S中的内容为“Student!”,请用指针的方法将S中的内容逆序输出,且不能改变串中的内容。 + + + +112.输入一行文字,找出其中大写字母、小写字母、空格、数字以及其他字符个数。(要求用指针实现)。 + + + +113.通过指针操作,将输入的3个字符串,按由大到小的顺序输出。 + + + +114.定义整型数组a,有10个元素,用指针实现数组中的全部元素的输出. + + + +115.编一程序,将字符串computer赋给一个字符数组,然后从第一个字母开始间隔地输出该串。请用指针完成。 + + + +116.利用指针编写一程序,将字符串中的第m个字符开始的全部字符复制成另一个字符串。要求在主函数中输入字符串及m的值并输出复制结果,在被调函数中完成复制。 + + + +117.用指针法实现:输入10个数,按由小到大的顺序输出。 + + + +118.用指针法实现:写一个函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度值。 + + + +119.从键盘输入10个学生的成绩,显示其中的最高分、最低分和平均分。用指针实现。 + + + +120.数组中存放N个元素,编写程序删除掉下标为奇数的元素,使得数组中只存放下标为偶数的元素。用指针实现。 + diff --git a/2207/MySQL常用语法.md b/2207/MySQL常用语法.md new file mode 100644 index 0000000..d28269e --- /dev/null +++ b/2207/MySQL常用语法.md @@ -0,0 +1,107 @@ +```sql +/* +1-9题 40分 +1-4 创建表、修改、添加、删除字段,记录插入、记录删除、记录更新 +创建主键、外键、唯一约束 +5.tj11 查询 +6.tj12 查询 +7.查询+视图 +8.触发器 +9.存储过程、存储函数 +*/ +#1-4 +#创建表(最后一个字段后没有,) +CREATE TABLE 表名( + 字段名 数据类型 约束 [ZEROFILL] DEFAULT 默认值 COMMENT 备注, + 字段名 数据类型 约束 [ZEROFILL] DEFAULT 默认值 COMMENT 备注 +); +#删除表 +DROP TABLE 表名; +#清空表 +TRUNCATE 表名; +#修改字段数据类型 +ALTER TABLE 表名 MODIFY 字段名 数据类型 约束; +#修改字段名+数据类型 +ALTER TABLE 表名 CHANGE 字段名 新字段名 数据类型 约束; +#删除字段 +ALTER TABLE 表名 DROP 字段名; +#添加字段 +ALTER TABLE 表名 ADD 字段名 数据类型 约束; +#添加主键 +ALTER TABLE 表名 MODIFY 字段名 数据类型 PRIMARY KEY; +ALTER TABLE 表名 ADD CONSTRAINT 主键名 PRIMARY KEY(字段名); +#添加自动增长(字段已为主键) +ALTER TABLE 表名 MODIFY 字段名 数据类型 AUTO_INCREMENT; +#添加自动增长(字段不为主键) +ALTER TABLE 表名 MODIFY 字段名 数据类型 PRIMARY KEY AUTO_INCREMENT; +#设置自动增长的起始值 +ALTER TABLE 表名 AUTO_INCREMENT = 数值; +#设置默认值 +ALTER TABLE 表名 ALTER SET DEFAULT 默认值; +#添加外键约束 +ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY(字段名) REFERENCES 外键表(主键) [ON UPDATE CASCADE/SET NULL ON DELETE CASCADE/SET NULL] +#添加唯一约束 +ALTER TABLE 表名 MODIFY 字段名 数据类型 UNIQUE; +ALTER TABLE 表名 ADD CONSTRAINT 约束名 UNIQUE(字段名); +#插入记录 +INSERT INTO 表名() +VALUES(DEFAULT, 数值, 数值); +INSERT INTO 表名() +SET 字段名=数值, 字段名=数值, 字段名=数值; +#更新记录 +UPDATE 表名 +SET 字段名 = 数值 +WHERE 条件; +#删除记录 +DELETE FROM 表名 +WHERE 条件; + +#5-7题 查询、视图 +SELECT 字段名 +FROM 表名 +WHERE 分组前条件 +GROUP BY 分组字段 +HAVING 分组后条件 +ORDER BY 排序的字段名/字段的位置编号(1、2、3) +LIMIT 起始位置,记录个数 #位置和C语言数组一样 起始从0开始 + +#创建视图 +CREATE VIEW 视图名 AS +查询; +#修改视图 +ALTER VIEW 视图名 AS +查询; +#删除视图 +DROP VIEW 视图名; + +#8 触发器 +DELIMITER $$ +DROP TRIGGER IF EXISTS 触发器名; +CREATE TRIGGER 触发器名 +BEFORE/AFTER UPDATE/DELETE/INSERT ON 表 +FOR EACH ROW +BEGIN + #需要附带的操作写在BEGIN END 之间 +END $$ +DELIMITER ; + +#9 存储过程、存储函数 +DELIMITER $$ +DROP PROCEDURE IF EXISTS 存储过程名; +CREATE PROCEDURE 存储过程名(IN/OUT 参数名 数据类型, IN/OUT 参数名 数据类型) +BEGIN + #需要执行的操作写在BEGIN END 之间 +END $$ +DELIMITER ; + +DELIMITER $$ +DROP FUNCTION IF EXISTS 存储函数名; +CREATE FUNCTION 存储函数名(参数名 数据类型, 参数名 数据类型) +RETURNS 返回值类型 +DETERMINISTIC/NOT DETERMINISTIC #相同参数返回值确定或者不确定 +BEGIN + RETURN 返回值;#存储函数必须有返回值 +END $$ +DELIMITER ; +``` + diff --git a/2207/习题答案/1-7习题答案.md b/2207/习题答案/1-7习题答案.md new file mode 100644 index 0000000..b436cb5 --- /dev/null +++ b/2207/习题答案/1-7习题答案.md @@ -0,0 +1,21 @@ +```sql +#1.修改字段数据类型 +ALTER TABLE t_student MODIFY sex ENUM('男', '女'); +#2.添加字段 +ALTER TABLE t_student ADD tel CHAR(20); +#3.修改数据类型 +ALTER TABLE t_coach MODIFY salary INT(6) ZEROFILL; +#4.插入记录 +INSERT INTO t_coach() +VALUES(DEFAULT, '赵欣彤', '女', 25, 6000); +#5.更新记录 +UPDATE t_class c +SET c.period = 18 +WHERE c.id = 10005; +#6.条件、连接查询 tj11 + +#7.分组、连接查询 tj12 + +#8.条件、连接查询 视图 + +``` \ No newline at end of file diff --git a/2207/习题答案/12-18习题答案.md b/2207/习题答案/12-18习题答案.md new file mode 100644 index 0000000..11ae5ef --- /dev/null +++ b/2207/习题答案/12-18习题答案.md @@ -0,0 +1,246 @@ +### C语言-1 + +```c +/*------------------------------------------------------------------------------ +(1)【程序设计】定义一个大小为50的整型数组,将数字1~50存入该数组,利用指针将数组中的值输出,每行5个,每个数字占4个符号位,左对齐。 +------------------------------------------------------------------------------*/ +#include +#include +int main() +{ + int i,*p,array[50]; + for(i=0;i<50;i++) + { + array[i]=i+1; + } + p=array; +/**********Program**********/ + //p 一级指针 可以指向整型的一维数组 + for(i=0;i<50;i++){//0~49 + printf("%-4d ", p[i]); + if((i+1)%5==0){ + printf("\n"); + } + } + +/********** End **********/ +} +``` + +### C语言-2 + +```c +/*---------------------------------------------------------------------- +【程序设计】 +------------------------------------------------------------------------ +题目:要求实现一个函数,能够合并两个整数数组,合并后进行降序排序并删除重复元素。 +示例1: +输入输出如下所示: +请输入第一个数组的6个元素,每个元素之间用空格隔开:1 3 5 7 10 6 +请输入第二个数组的6个元素,每个元素之间用空格隔开:10 4 2 6 11 30 +合并后降序排列的数组:30 11 10 7 6 5 4 3 2 1 +------------------------------------------------------------------------ +注意:请勿改动程序中的其他内容。 +----------------------------------------------------------------------*/ +#include + +int* mergeArrays(int *arr1, int size1, int *arr2, int size2,int *newLen); + +int main() { + + int size1=6; + int size2=6; + int arr1[6]; + int arr2[6]; + int i; + + int newLen = 0; + int* mergedArray; + + printf("请输入第一个数组的6个元素,每个元素之间用空格隔开:"); + for ( i = 0; i < size1; i++) { + scanf("%d", &arr1[i]); + } + printf("请输入第二个数组的6个元素,每个元素之间用空格隔开:"); + for ( i = 0; i < size2; i++) { + scanf("%d", &arr2[i]); + } + + mergedArray = mergeArrays(arr1, size1, arr2, size2, &newLen); + + printf("合并后降序排列的数组:"); + for (i = 0; i < newLen; i++) { + printf("%d ", mergedArray[i]); + } + printf("\n"); + return 0; +} + + +int* mergeArrays(int *arr1,int size1,int *arr2,int size2,int *newLen) { + static int mergedArray[20]; + /**********Program**********/ + int i, j=0, temp; + //合并数组 + for(i=0;i + +int main() +{ + int a,b,c,d,i,j,sum=0; + scanf("%d",&j); + /**********Program**********/ + for(i=100;i +#include +#include +#include +#include + +#define N 4 + +void binary_power(unsigned int x) +{ + int flag =1; + unsigned int s,t,y; + printf("%u=",x); + + /**********Program**********/ + t = 1; + y = 0; + //二进制的权位值 2^2 2^1 2^0 + //从末尾开始一直乘 乘到 大于传入的x就停止 同时记录下次方数 + while(t <= x){ + t*=2; + y++; + } + y--;//2^y 会正好大于x + printf("2^%d", y);//最高位 + x -= (int)pow(2, y);//求2的y次方 同时对x进行减法运算 + y--; + + while(x > 0){ + t = 1; + s = (int)pow(2, y); + if(x >= s){//当前权位值没有大于需要运算的数据 + x -= s; + printf("+2^%d", y); + } + y--; + } + /********** End **********/ + printf("\n"); +} +int main() +{ + unsigned int n[N]={1,15,32,144}; + int i; + for(i=0;i +#define N 10 +void main( ) +{ + int a[N+5]={4,6,9,12,15,18,23,26,32,39},p,x,i,j; + for(i=0;i a[j+1]){ + x = a[j]; + a[j] = a[j+1]; + a[j+1] = x; + } + } + } + + + + + /********** End **********/ + for(i=0;i + +void main() +{ + int a,b,c,d,k,i,n; + k=0; + scanf("%d",&n); + /**********Program**********/ + + for(i=100;i<=n;i++){ + a = i;//备份一遍i的数据 + d = 0; + while(a){ + d += (a%10); + a /= 10; + } + if(d == 5){ + k++; + } + } + /********** End **********/ + printf("%d\n",k); +} + +``` + + + +### C语言-5 + +```c +/*------------------------------------------------------------------------------ +【程序设计】编写函数rtrim,用来删除字符串尾部的空格,首部和中间的空格不删除。例如:字符串为:" A BC DEF ", +删除后的结果是" A BC DEF"。要求函数形参采用指针变量。 +测试输入: A BC DEF +测试输出: A BC DEF +说明:测试输入中,A前有4个空格,F后有5个空格 +------------------------------------------------------------------------ +注意:部分源程序给出如下。请勿改动主函数main或其它函数中给出的内容,否则不得分。 +仅在Program-End之间填入若干语句。不要删除标志否则不得分。 +------------------------------------------------------------------------------*/ +#include +#include +void main() +{ + void rtrim(char *p); + char s[100]; + gets(s); + rtrim(s); + puts(s); +} +void rtrim(char *p) +{ + int i; + /**********Program**********/ + i=0; + while(*(p+i) != '\0'){ + i++; + } + while(*(p+i-1) == ' '){ + *(p+i-1) = '\0'; + i--; + } + + /********** End **********/ +} + +``` + + + +### C语言-6 + +```c +/*------------------------------------------------------------------------------ +【程序设计】定义一个函数实现字符串的逆序存放(连续的字符串,中间不包含空格),要求用指针实现。 +在主函数中调用函数实现字符串逆序存放。运行程序,输入字符串,输出逆序后的字符串。 +------------------------------------------------------------------------ +注意:部分源程序给出如下。请勿改动主函数main或其它函数中给出的内容,否则不得分。 +仅在Program-End之间填入若干语句。不要删除标志否则不得分。 +------------------------------------------------------------------------------*/ +#include +#include +void reversed_str(char *str){ + char *p=str,*q=str; + int temp; + while(*q!='\0'){ + q++; + } + q--; + /**********Program**********/ + while(p < q){ + temp = *p; + *p = *q; + *q = temp; + p++; + q--; + } + /********** End **********/ +} +int main(){ + char s[50]; + printf("输入字符串:"); + scanf("%s",s); + printf("逆序前:%s\n",s); + reversed_str(s); + printf("逆序后:%s\n",s); + return 0; +} + +``` + + + +### C语言-7 + +```c +/*------------------------------------------------------------------------------ +【程序设计】从键盘输入一位整数i,计算其各位数字之和。 +------------------------------------------------------------------------ +注意:部分源程序给出如下。请勿改动主函数main或其它函数中给出的内容,否则不得分。 +仅在Program-End之间填入若干语句。不要删除标志否则不得分。 +------------------------------------------------------------------------------*/ +#include +#include +int main(){ + int i,sum=0,a; + scanf("%d",&i); + /**********Program**********/ + while(i){ + sum += i%10; + i/=10; + } + /********** End **********/ + printf("%d\n",sum); + return 0; +} + +``` + + + +### C语言-8 + +```c +/*------------------------------------------------------------------------------ +【程序设计】编写函数,判断一个字符串是否是回文。在主函数中输入一个字符串,调用自定义函数,输出结果。 +所谓回文是指顺读和倒读都一样的字符串。如"XZYKYZX"是回文。 +------------------------------------------------------------------------ +注意:部分源程序给出如下。请勿改动主函数main或其它函数中给出的内容,否则不得分。 +仅在Program-End之间填入若干语句。不要删除标志否则不得分。 +------------------------------------------------------------------------------*/ +#include +#include +void main() +{ + char s[50]; + int hw(char *s); + gets(s); + if(hw(s)) + printf("是回文!\n"); + else + printf("不是回文!\n"); +} +int hw(char *s) +{ + int flag=1; + char *p,*q; + /**********Program**********/ + p = s;//指向字符串首元素 + q = s+strlen(s)-1;//指向末尾元素 + while(p < q){ + if(*p != *q){ + flag = 0; + break; + } + p++; + q--; + } + + return flag; + /********** End **********/ +} + +``` + diff --git a/2207/小游戏.md b/2207/小游戏.md new file mode 100644 index 0000000..ff8c472 --- /dev/null +++ b/2207/小游戏.md @@ -0,0 +1,297 @@ +### 贪吃蛇 + +```c +#include +#include +#include +#include +#include +#include + +#define WIDTH 50 //宽度 +#define HEIGHT 30 //高度 +#define SNAKE_LENGHT 100 //蛇的最大长度 + +#define UP 1 +#define DOWN 2 +#define LEFT 3 +#define RGIHT 4 + +char map[HEIGHT][WIDTH];//地图字符数组 +int sankeX[SNAKE_LENGHT], sankeY[SNAKE_LENGHT];//蛇的坐标 +int foodX, foodY;//食物的坐标 +int size = 1;//当前蛇的长度 +int gameStatus = 1; +int direction = RGIHT; + +/* +_kbhit()用来判断输入的是否是空格 +_getch()用来判断键盘输入的内容 +*/ + +void draw(void* param){ + int i, j; + char buffer[(HEIGHT+1)*(WIDTH+1)]; + int k; + while(gameStatus){ + system("cls"); + k=0; + for(i=0;i + +image-20250104225957306 + +### 飞机大战 + +```c +#include +#include +#include +#include +#include +#include +#include + +#define HEIGHT 40 +#define WIDTH 30 + +char map[HEIGHT][WIDTH]; +int score = 0; +int gameStatus = 1; + +int planeX = 12; +int planeY = 36; + +#define bulletNum 1000 + +int bulletX[bulletNum]; +int bulletY[bulletNum]; +int bulletRear = 0;//最后的子弹 +int bulletFront = 0;//最前面的子弹 + +char* plane[6] = {" * ", "*****", " * * "}; + +void changeMap(void* param){ + int i, j; + while(gameStatus){ + for(i=0;i \ No newline at end of file diff --git a/2207/标准库函数.md b/2207/标准库函数.md new file mode 100644 index 0000000..d753d44 --- /dev/null +++ b/2207/标准库函数.md @@ -0,0 +1,67 @@ +### 标准输入输出 + +```c +#include + +/* +scanf 格式化输入 +printf 格式化输出 +getchar 读取单个字符 +putchar 输出单个字符 +gets 读取一行字符串 空格也会读入 +puts 输出字符串(会自带一个换行) +*/ +int main(){ + + char str[100]; + /* + scanf("%s", str);//占位符遇到空格结束 + */ + gets(str);//读取一行字符串 + printf("%s\n", str); + + return 0; +} +``` + +### 字符串处理 + +```c +#include +#include + +/* +strlen 返回当前字符串长度 以结束符为标记 +strcpy(目标串, 需要复制的串) 复制字符串 +strncpy(目标串, 需要复制的串) 复制指定长度的字符串 +strcat(字符串1, 字符串2) 拼接两个字符串,相当于在字符串1后加上字符串2后返回字符串1的首地址 +strncat(字符串1, 字符串2) 拼接指定长度字符串(字符串2的长度) +*/ +int main(void){ + /* + 烫烫烫:未初始化的字符数组打印出来 + 屯屯屯:未初始化的堆空间(C++) + 锟斤拷:将GBK字符编码的文字转换为UTF-8后再转换成GBK + */ + char *str = "HelloWolrd";//指向一个字符串常量的首地址 + char str2[20]; + char str3[20]; + char *str4; + char str5[20] = ""; + strcpy(str2, str);//将字符串str的数据复制到str2这个字符数组中 + strncpy(str3, str, 5);//复制str中的前5个字符到str3中 + + str3[5] = '\0';//设置结束标记 + puts(str2);//会一直打印字符直到遇到字符串结束标记 + puts(str3); + + str4 = strcat(str2, str3);//str4相当于指向str2的首地址 + puts(str2);//打印str2字符数组 + puts(str4);//str4是一个字符串指针 指向str2的首个元素 + strncat(str5, str3, 3);//将str5和str3中的三个字符拼接起来并存储在str5中 + puts(str5);//打印str5 + + return 0; +} +``` + diff --git a/2207/汉诺塔.md b/2207/汉诺塔.md new file mode 100644 index 0000000..8354677 --- /dev/null +++ b/2207/汉诺塔.md @@ -0,0 +1,111 @@ +```c +/* +这段代码实现的是经典的 汉诺塔问题 的递归解法。 +汉诺塔问题 是一个数学问题,具体描述如下: +给定三个柱子:A、B、C; +有若干个大小不等的圆盘(通常为n个),初始时所有圆盘都堆叠在A柱子上,从小到大按顺序叠放; +目标是将这些圆盘从A柱子移动到C柱子上,并且每次只能移动一个圆盘,且大的圆盘不能放在小的圆盘上面。 +在这段代码中,hanoi 函数递归地解决了这个问题,参数 n 表示要移动的圆盘数,x、y、z 分别表示源柱子、辅助柱子和目标柱子。 +代码详解: +基本思路: +如果只有一个盘子(n == 1),直接从 x 移动到 z。 +如果有多个盘子(n > 1),可以通过以下步骤完成: 先将前 n-1 个盘子从 x 移到 y,这时 z 作为辅助柱子。 +将第 n 个盘子从 x 移动到 z。 +最后将 n-1 个盘子从 y 移到 z,这时 x 作为辅助柱子。 +函数 hanoi 的参数: +n:表示要移动的圆盘的数量。 +x:源柱子。 +y:辅助柱子。 +z:目标柱子。 +递归过程: +对于每个递归调用,问题规模逐渐减小,最终会到达只有一个盘子的情况(基准条件)。 +程序输出: +A -> C +A -> B +C -> B +这个输出表示了将两个圆盘从A柱子移动到C柱子所需的步骤。输出结果每一行表示一个移动的操作。 +总结: +这段代码是解决汉诺塔问题的经典递归解法。通过分而治之的策略,把问题分解为更小的子问题来求解。 +*/ +``` + +### 函数递归打印汉诺塔移动步骤 + +```c +#include + +/* +n:盘片数 +x:源柱子 +y:中间柱子 +z:目标柱子 + +判断盘子个数: +如果只有一个盘子,那么直接搬到目标柱子 +否则先将上面的n-1的盘子通过目标柱子移 +动到非目标柱子上后再将剩下的最大的盘子移动到目标柱子 + +*/ +//n的盘子从x通过y移动到z +void hanoi(int n, char x, char y, char z){ + if(n == 1){ + printf("%c -> %c\n", x, z); + }else{ + hanoi(n-1, x, z, y); + printf("%c -> %c\n", x, z); + hanoi(n-1, y, x, z); + } +} + +int main(void){ + + hanoi(3, 'A', 'B', 'C'); + + return 0; +} +``` + + + +### 函数递归求汉诺塔移动的次数 + +```c +#include + +/* +n:盘片数 +x:源柱子 +y:中间柱子 +z:目标柱子 + +判断盘子个数: +如果只有一个盘子,那么直接搬到目标柱子 +否则先将上面的n-1的盘子通过目标柱子移 +动到非目标柱子上后再将剩下的最大的盘子移动到目标柱子 + +*/ +//n的盘子从x通过y移动到z +//int count = 0;//移动盘片的次数 +//而不是只经过B柱子的次数 +int hanoi(int n, char x, char y, char z){ + int count = 0;//局部变量 用来存储当前这次函数调用中的移动盘子的次数 + if(n == 1){ + //printf("%c -> %c\n", x, z); + count++; + }else{ + count += hanoi(n-1, x, z, y); + //printf("%c -> %c\n", x, z); + count++; + count += hanoi(n-1, y, x, z); + } + return count; +} + +int main(void){ + + printf("%d\n", hanoi(3, 'A', 'B', 'C')); + + return 0; +} +``` + diff --git a/2207/约瑟夫环.md b/2207/约瑟夫环.md new file mode 100644 index 0000000..a38fe31 --- /dev/null +++ b/2207/约瑟夫环.md @@ -0,0 +1,107 @@ +### 写法1-暴力写法 使用数组来模拟队列 + +```c +#include + +/* +约瑟夫环,人数n,编号m + +队列 先进先出 +a 3 1 2 + +头 下标 +尾 下标 +*/ +//rear尾巴 front头 +int queue[200] = {0}; +int rear=0, front=0; +//用来拿到队列最前面的元素值 +int get(){ + int temp = queue[front]; + queue[front++] = 0; + return temp; +} +//用来在队列末尾差值 +void put(int n){ + queue[rear++] = n; +} +//打印队列当前状态 +void print(){ + int i; + for(i=0;i<200;i++){ + if(queue[i] != 0){ + printf("%d ", queue[i]); + } + } + printf("\n"); +} +//判断队列是否为空 +int isEmpty(){ + int count = 0; + int i; + for(i=0;i<200;i++){ + if(queue[i] != 0){ + count++; + } + } + return count; +} +int main(){ + int n, m;//n人数 m为弹出的编号 + int i, count = 0; + scanf("%d %d", &n, &m); + for(i=1;i<=n;i++){ + put(i); + } + print(); + while(isEmpty()){ + count++; + if(count % m == 0){ + printf("%d ", get()); + }else{ + put(get()); + } + } + + return 0; +} +``` + +### 写法2-循环队列 使用数组模拟循环队列 + +```c +#include + +/* +使用数组模拟循环队列 +*/ + +int main(){ + + int joseph[100] = {0}; + int n, m, count = 0;//n:人数 m:编号数 count:已出局的人数 + int i = 1, k = 0;//i:用来遍历数组 k用来记录已经报数的编号 + printf("请输入人数以及编号数:"); + scanf("%d %d", &n, &m); + for(i = 0; i < n;i++){ + joseph[i] = i+1;//标记为1 则为非空代表当前下标编号有人 + } + + i = 0; + while(n > count){ + if(joseph[i]){ + k++;//报数 + if(k%m == 0){//判断是否弹出 + printf("%d ", joseph[i]); + joseph[i] = 0;//标记为0 代表当前下标的人已经弹出 + count ++; + } + } + i = (i+1)%n; + } + printf("\n"); + + return 0; +} +``` + diff --git a/2207/线性结构.md b/2207/线性结构.md new file mode 100644 index 0000000..bf628a6 --- /dev/null +++ b/2207/线性结构.md @@ -0,0 +1,156 @@ +### 顺序表 + +```c +#include +#include +#include +#include +#include +#include +/* +顺序表 连续存储的动态数组 +链表 分散存储的动态数组 +栈 后进先出的数组 +队列 先进先出的数组 +*/ +//顺序表 +typedef struct List{ + int *arr;//用来存储数据首地址 + int size;//用来存储当前已经插入的元素个数 + int capacity;//用来存储最大的容量 +}List; +//函数声明 +//对顺序表进行初始化 +void init(List *list, int n){ + //对List结构体中arr指针变量 指向一块动态内存分配的地址 + list->arr = (int *)malloc(sizeof(int)*n); + //malloc 用来分配指定大小的内存空间并返回 void*类型的首地址 + list->size = 0;//设置当前元素个数为0 + list->capacity = n;//设置当前数组容量为n + memset(list->arr, 0, sizeof(int)*n); + //memset对指定内存空间 设置初始值为0 +} + + +//传入list结构体指针 并对其中 +void enlargeList(List *list){ + //对数组元素进行扩容 数组起始地址 扩大后的内存大小 + list->arr = (int *)realloc(list->arr, sizeof(int)*list->capacity*2); + //对扩容后的空间进行初始化赋值给0 + memset(list->arr + list->capacity, 0, list->capacity*sizeof(int)); + //容量扩大一倍 + list->capacity *= 2; +} + +//在顺序表最后面插值 +void add(List *list, int num){ + //对数组最后一个位置进行赋值 + //当前数组元素个数应小于当前容量 + if(list->size == list->capacity){ + enlargeList(list); + } + *(list->arr + list->size) = num; + list->size++;//元素个数加一 +} + +//遍历数组中元素并打印 +void traverse(List *list){ + int i; + for(i=0;isize;i++){ + + printf("%2d ", *(list->arr + i)); + if((i+1)%10==0){ + printf("\n",(i+1)); + //Sleep(1000); + } + } + printf("\n"); +} + +int getRandNum(int startNum, int endNum){ + + return rand()%(endNum - startNum) + startNum; + //计算出start~end之间的随机整数并包括start和end +} + +//在指定位置插值 +void addByIndex(List *list, int num, int n){ + int i; + if(list->size == list->capacity){ + enlargeList(list); + } + //将这个位置-1开始的所有元素整体往后挪动一个位置 + for(i=list->size-1;i>=n-1;i--){ + *(list->arr+i+1) = *(list->arr+i); + } + *(list->arr+n-1) = num; + list->size++;//元素个数+1 +} + +//删除指定位置元素并返回该元素 +int deleteByIndex(List *list, int n){ + int i; + //从删除位置n-1开始 元素整体前移,覆盖掉n-1位置需要删除的元素 + for(i=n-1;isize-1;i++){ + *(list->arr + i) = *(list->arr + i + 1); + } + *(list->arr + list->size - 1) = 0; + list->size--; +} + +//判断顺序表是否为空 +//size为0则返回1 代表数组是空的 +int isEmpty(List *list){ + return list->size?0:1; +} + +//判断顺序表是否已满 +//size==capacity 为真 +int isFull(List *list){ + return list->size == list->capacity?1:0; +} + +//获取顺序表中的元素个数 +int size(List *list){ + return list->size; +} + +//对顺序表中元素进行升序排序 +void sort(List *list){ + int i, j, temp; + for(i=0;isize-1;i++){ + for(j=0;jsize-1-i;j++){ + if(list->arr[j] > list->arr[j+1]){ + temp = list->arr[j]; + list->arr[j] = list->arr[j+1]; + list->arr[j+1] = temp; + } + } + } +} + + +int main(void){ + List list;//定义结构体变量 + List *p = &list; + int i; + + system("color f4"); + srand((unsigned)time(NULL));//以当前时间为随机数种子 + init(p, 1);//顺序表的初始化 + + add(p, 1); + add(p, 2); + add(p, 3); + addByIndex(p, 66, 2); + addByIndex(p, 100, 1); + deleteByIndex(p, 3); + sort(p); + traverse(p); + + + + return 0; +} +``` + diff --git a/2207/练习题/MySQL——网上书店.md b/2207/练习题/MySQL——网上书店.md new file mode 100644 index 0000000..1c82398 --- /dev/null +++ b/2207/练习题/MySQL——网上书店.md @@ -0,0 +1,199 @@ +创建一个空数据库名字为`book_store_db`,字符集使用UTF8 + +## 创建表 + +目的: + +(1)熟练掌握创建表结构的方法。 + +(2)掌握查看表信息的方法。 + +内容: + +(1)使用 MySQL 创建会员表(如表 3-9 所示)、图书表(如表 3-10 所示)的表结构。 + +(2)使用 MySQL 创建图书类别表(如表 3-11 所示)、订购表(如表 3-12 所示)的表结构。 + +(3)使用 DROP TABLE 语句删除上述创建的表,然后使用 CREATE TABLE 语句再次创建上述表。 + +(4)查看会员表的信息。 + +(5)修改会员表结构。添加字段「联系地址」,数据类型设置为 VARCHAR(50);更改「联系地址」为「联系方式」;删除添加的字段「联系地址」。 + +(6)使用创建表时添加约束和为已存在的表添加约束这两种方式给表添加约束。 + +表 3-9 会员表(user)结构 + +![48910-00-93-1](https://yp.smallkun.cn/markdown/v2-1f98e1d0f99c7b562479e8a54e940cf1_r.jpg!compress) + +表 3-10 图书表(book)结构 + +![48910-00-93-2](https://yp.smallkun.cn/markdown/v2-396b2759e6c20106ecc661ccdf6c7c68_r.jpg!compress) + +表 3-11 图书类别表(category)结构 + +![48910-00-94-1](https://yp.smallkun.cn/markdown/v2-38a46a4e9729af94160e6169e388daf3_r.jpg!compress) + +表 3-12 订购表(b_order)结构 + +![48910-00-94-2](https://yp.smallkun.cn/markdown/v2-bb75ef1b2b959a881528f9e922659618_r.jpg!compress) + +## 插入、更新、删除数据 + +目的:熟练掌握使用 INSERT、DELETE、UPDATE 语句向表中添加、删除、修改记录。 + +内容: + +(1)「网上书店」数据库中的数据分别如表 4-1 至表 4-4 所示。 + +表 4-1 user 表数据 + +![48910-00-101-1](https://yp.smallkun.cn/markdown/v2-47201f068f5b42aef0ffdf868fbd9941_r.jpg!compress) + +表 4-2 book 表数据 + +![48910-00-101-2](https://yp.smallkun.cn/markdown/v2-071c5c7c1866bfe8454f256a58ec0459_r.jpg!compress) + +表 4-3 category 表数据 + +![48910-00-101-3](https://yp.smallkun.cn/markdown/v2-1d54f4342cf93f74586bf84b78741e70_r.jpg!compress) + +表 4-4 b_order 表数据 + +![48910-00-102-1](https://yp.smallkun.cn/markdown/v2-a4033c268bbe2e6a74002332b5d76b07_r.jpg!compress) + +(2)使用 SQL 语句分别向 user 表(表 4-1)、book 表(表 4-2)、category 表(表 4-3)、b_order 表(表 4-4)插入记录。 + +(3)使用 SQL 语句修改表中记录。 + +① 把 user 表中 uid 字段值为 1001 的记录的 uname 字段值修改为「何大姑」。 + +② 把 b_order 表中 uid 字段值为 1003 且 bid 字段值为 3 的记录的 ordernum 字段值改为「10」,并把该记录的 orderdate 字段值改为「2016-10-01」,deliverydate 字段值设为「2016-10-03」。 + +(4)使用 SQL 语句删除表中记录。 + +① 删除 2015 年的订单信息。 + +② 清空 book 表。 + +## 简单查询 + +目的:掌握 SELECT 语句中 DISTINCT 子句、LIMIT 子句、WHERE 子句以及 ORDER BY 子句的使用。 + +内容如下。 + +(1)查询会员表,输出积分高于 500 分的会员昵称和联系电话。 + +(2)查询会员表,输出积分低于 200 分的会员昵称和联系电话,分别用英文 username、telephone 指定别名。 + +(3)查询会员表,输出 E-mail 是 QQ 邮箱的会员昵称及其 E-mail。 + +(4)查询订购表,输出订购日期是 2016 年 10 月的订单的详细信息。 + +(5)查询订购表,输出订货的会员编号,要求删除重复行。 + +(6)查询图书表,输出图书的名称和价格,并把查询结果按价格降序排列。 + +(7)查询图书表,输出价格最高的三种图书的名称和价格。 + +## 分组查询 + +目的:掌握集合函数、GROUP BY 子句、HAVING 子句。 + +内容如下。 + +(1)查询图书表,输出所有图书的最高价格、最低价格、平均价格。 + +(2)查询图书表,输出每一类图书的数量。 + +(3)查询图书表,输出每一类图书的最高价格、最低价格、平均价格。 + +(4)查询订购表,输出订购数量超过 3 本的会员编号和订购数量。 + +## 多表连接查询、子查询 + +目的:掌握连接查询和子查询 + +内容如下。 + +(1)输出所有图书的图书名称、价格以及所属类别名称。 + +(2)输出订购了《平凡的世界》的会员昵称、联系电话、订购数量。 + +(3)输出订购了图书的会员昵称和联系电话。 + +(4)输出无人订购的图书名称和价格。 + +(5)输出详细订购信息,包括订购图书的会员呢称、联系电话、所订图书名称、数量、价格、折扣价。 + +## 存储过程 + +目的:掌握存储过程的创建和执行。掌握存储过程中输入、输出参数的使用。 + +内容: + +(1)在「网上书店」数据库中创建一个名为 proc_1 的存储过程,实现查询所有会员信息的功能。 + +(2)在「网上书店」数据库中创建一个名为 proc_2 的存储过程,要求实现如下功能:根据会员昵称查询会员的积分情况。并调用存储过程,查询「平平人生」和「感动心灵」的积分。 + +(3)在「网上书店」数据库中创建一个名为 proc_3 的存储过程,要求实现如下功能:根据会员昵称查询会员的订购信息,如果该会员没有订购任何图书,则输出「某某会员没有订购图书」的信息;否则输出订购图书的相关信息。调用存储过程,显示会员「四十不惑」订购图书的情况。 + +## 视图 + +目的:掌握视图的定义、维护、使用。 + +内容: + +(1)定义基于图书表的视图(包含图书编号、图书名称、作者、价格、出版社、图书类别)。 + +(2)查询图书表视图,输出图书的名称和价格,并把查询结果按价格降序排列。 + +(3)查询图书表视图,输出价格最高的三种图书的名称和价格。 + +## 触发器 + +### 创建 + +目的:掌握触发器的创建和执行。 + +内容:在「网上书店」数据库中创建一个名为 tri_1 的触发器,当向订购表中插入记录时,如果订购量 <=0,就将订购量设置为 1。 + +### 使用 + +目的:掌握触发器的使用。 + +内容: + +(1)在「网上书店」数据库中创建一个名为 tri_2 的触发器,要求实现如下功能:当删除图书类别表中的某个图书类别时,将图书表中对应的图书类别的值设置为 NULL。 + +(2)在「网上书店」数据库中创建一个名为 tri_3 的触发器,要求实现如下功能:当删除某个会员的时候,自动删除该会员的订购信息。 + +### 删除 + +目的:掌握触发器的删除 + +内容:删除网上书店数据库中的触发器 tri_1。 + +## 用户管理 + +### 创建新用户 + +目的:掌握使用 SQL 语句进行用户的创建、查看和删除操作。 + +内容: + +(1)使用 SQL 语句创建 test 用户。 + +(2)使用 SQL 语句查看创建的 test 用户的信息。 + +(3)使用 SQL 语句删除 test 用户。 + +### 用户权限授予和回收 + +目的:掌握使用 SQL 语句授予和收回用户权限。 + +内容: + +(1)使用 SQL 语句授予 test 用户对「学生选课」数据库中 studentInfo 表、teacher 表的查询、插入、更新和删除数据的权限。 + +(2)使用 SQL 语句收回 test 用户的全部权限。 \ No newline at end of file diff --git a/2207/结构体.md b/2207/结构体.md new file mode 100644 index 0000000..e1e04ed --- /dev/null +++ b/2207/结构体.md @@ -0,0 +1,334 @@ +### 结构体类型定义 + +```c +/* +struct 结构体名{ + 数据类型 变量名; + 数据类型 变量名; +}; +CREATE TABLE 表名( + 字段名 数据类型, + 字段名 数据类型 +); +*/ + +//声明了一个结构体类型 学生类型 +struct student{ + int id;//学号 + char name[20];//姓名 + int age;//年龄 + char sex;//性别 + double score;//成绩 +}; +``` + + + +### 结构体变量定义 + +```c +#include +#include +/* +struct 结构体名{ + 数据类型 变量名; + 数据类型 变量名; +}; +CREATE TABLE 表名( + 字段名 数据类型, + 字段名 数据类型 +); +*/ + +//定义了一个结构体类型 学生类型 +struct student{ + int id;//学号 + char name[20];//姓名 + int age;//年龄 + char sex[2];//性别 + double score;//成绩 +}; + +int main(void){ + //结构体类型如果没有取别名的情况下 + //需要 使用 struct 结构体名 结构体变量名; 来定义结构体变量 + //定义了一个学生变量s1 + struct student s1;//存储一个的学生 + //对结构体变量进行赋值操作 + s1.id = 100; + strcpy(s1.name, "小明"); + s1.age = 18; + strcpy(s1.sex, "男"); + s1.score = 99; + //对结构体变量进行取值操作 + printf("%d %s %d %s %.0lf\n", s1.id, s1.name, s1.age, s1.sex, s1.score); + + + return 0; +} +``` + +```c +#include +#include + +//结构体类型的定义 +//1.在主函数内 通过struct 结构体类型名 变量1, 变量2; +//2.在定义结构体类型的时候定义 +//3.只在定义结构体类型时定义变量(结构体类型只使用一次) +struct student{ + int id;//学号 + char name[20];//姓名 + int age;//年龄 + char sex[2];//性别 + double score;//成绩 +}stu1, stu2; +//在定义结构体类型的时候同时定义了两个结构体变量stu1, stu2 + +int main(void){ + + stu1.id = 1; + stu2.id = 2; + printf("%d %d\n", stu1.id, stu2.id); + + return 0; +} +``` + + + +### 使用typedef对结构体类型起别名 + +```c +#include +#include +/* +struct 结构体名{ + 数据类型 变量名; + 数据类型 变量名; +}; +CREATE TABLE 表名( + 字段名 数据类型, + 字段名 数据类型 +); +*/ + +//定义了一个结构体类型 学生类型 + +//typedef 数据类型 类型别名; +//typedef int element; +/* +typedef struct 结构体类型名{ + 数据类型 变量名1; + 数据类型 变量名2; +}别名; +*/ +typedef struct student{ + //4+20+4+2+8 + int id;//学号 + char name[20];//姓名 + int age;//年龄 + char sex[2];//性别 + double score;//成绩 +}student; +//struct student <=> student + +int main(void){ + //结构体类型如果没有取别名的情况下 + //需要 使用 struct 结构体名 结构体变量名; 来定义结构体变量 + //定义了一个学生变量s1 + struct student s1;//存储一个的学生 + + student s2; + //对结构体变量进行赋值操作 + s1.id = 100; + strcpy(s1.name, "小明"); + s1.age = 18; + strcpy(s1.sex, "男"); + s1.score = 99; + //对结构体变量进行取值操作 + + + printf("%d %s %d %s %.0lf\n", s1.id, s1.name, s1.age, s1.sex, s1.score); + + return 0; +} +``` + +### 习题-1 + +```c +#include +/* +1.定义一个图书类型,要求存储以下数据,图书编号、图书名、作者名、出版社、价格 +定义两个图书变量,别分命名为book1、book2存储以下数据 +1 数据结构 桃桃 高等教育出版社 59.9 +2 操作系统 台球王子 高等教育出版社 58.9 +并打印出来 +*/ +struct book{ + int id;//图书编号 + char title[50];//图书名称 + char author[50];//作者名称 + char publishing[50];//出版社 + double price;//价格 +}; + +int main(){ + struct book book1={1, "数据结构", "桃桃", "高等教育出版社", 59.9}; + struct book book2={2, "操作系统", "台球王子", "高等教育出版社", 58.9}; + + printf("%d\t %s\t %s\t\t %s\t %.1lf\n", book1.id, book1.title, + book1.author, book1.publishing, book1.price); + printf("%d\t %s\t %s\t %s\t %.1lf\n", book2.id, book2.title, + book2.author, book2.publishing, book2.price); + + return 0; +} +``` + +### 习题-2 + +```c +#include +/* +2.定义一个动物类型,要求存储以下数据,自行推断成员变量类型 +1 斑马 素食 一级保护动物 +2 小熊猫 素食 一级保护动物 +3 蝙蝠 肉食 其他动物 +*/ + +typedef struct animal{ + int id; + char type[20]; + char foodType[20]; + char leve[20]; +}animal; + +int main(){ + animal a1 = {1, "斑马", "素食", "一级保护动物"}; + animal a2 = {2, "小熊猫", "素食", "一级保护动物"}; + animal a3 = {3, "蝙蝠", "肉食", "一级保护动物"}; + + printf("%d\t %s\t %s\t %s\n", a1.id, a1.type, a1.foodType, a1.leve); + printf("%d\t %s\t %s\t %s\n", a2.id, a2.type, a2.foodType, a2.leve); + printf("%d\t %s\t %s\t %s\n", a3.id, a3.type, a3.foodType, a3.leve); + + + return 0; +} +``` + +### 结构体数组、指针 + +```c +#include +/* +2.定义一个动物类型,要求存储以下数据,自行推断成员变量类型 +1 斑马 素食 一级保护动物 +2 小熊猫 素食 一级保护动物 +3 蝙蝠 肉食 其他动物 +*/ + +typedef struct animal{ + int id; + char type[20]; + char foodType[20]; + char leve[20]; +}animal; + +int main(){ + int i; + animal aList[3] = { + {1, "斑马", "素食", "一级保护动物"}, + {2, "小熊猫", "素食", "一级保护动物"}, + {3, "蝙蝠", "肉食", "一级保护动物"}}; + animal *pA = aList;//定义一个动物指针指向数组的第一个结构体变量的元素 + //(*pA).id <=> pA->id + //1.使用*访问符得到元素 + //printf("%d\n", (*pA).id); + //printf("%d\n", pA->id); + + for(i=0;i<3;i++){ + //aList[i] <=> *(aList+i) + printf("%d\t %s\t %s\t %s\n", (aList+i)->id, (aList+i)->type, + (aList+i)->foodType, (aList+i)->leve); + } + + return 0; +} +``` + +### 结构体类型作为函数的参数 + +```c +#include +/* +2.定义一个动物类型,要求存储以下数据,自行推断成员变量类型 +1 斑马 素食 一级保护动物 +2 小熊猫 素食 一级保护动物 +3 蝙蝠 肉食 其他动物 +*/ + +typedef struct animal{ + int id; + char type[20]; + char foodType[20]; + char leve[20]; +}animal; + +//结构体变量作为函数的参数 +void print(animal a){ + printf("%d\t %s\t %s\t %s\n", a.id, a.type, a.foodType, a.leve); +} +//结构体的指针变量作为函数的参数 +void print2(animal *a){ + printf("%d\t %s\t %s\t %s\n", a->id, a->type, a->foodType, a->leve); +} + +int main(){ + int i; + animal aList[3] = { + {1, "斑马", "素食", "一级保护动物"}, + {2, "小熊猫", "素食", "一级保护动物"}, + {3, "蝙蝠", "肉食", "一级保护动物"}}; + animal *pA = aList;//定义一个动物指针指向数组的第一个结构体变量的元素 + //(*pA).id <=> pA->id + //1.使用*访问符得到元素 + //printf("%d\n", (*pA).id); + //printf("%d\n", pA->id); + + for(i=0;i<3;i++){ + print2(aList+i); + } + + return 0; +} +``` + +### 使用结构体存储点通过函数计算两个点之间的距离 + +```c +#include +#include + +typedef struct point{ + int x; + int y; +}point; + +float distance(point *p1, point *p2){ + /* + pow((float)(p2->y - p1->y), 2) <=> (y2-y1)*(y2-y1) + */ + return sqrt(pow((float)(p2->y - p1->y), 2) + pow((float)(p2->x - p1->x), 2)); +} + +int main(){ + point p1 = {1, 2}, p2 = {2, 2}; + printf("两点之间的距离为%.2lf\n", distance(&p1, &p2)); + + return 0; +} +``` + diff --git a/2207/调考试题答案/2024年12月.md b/2207/调考试题答案/2024年12月.md new file mode 100644 index 0000000..a27ef48 --- /dev/null +++ b/2207/调考试题答案/2024年12月.md @@ -0,0 +1,110 @@ +### 数据库 + +```sql +#1 创建表 +CREATE TABLE t_family( + fno INT(11) PRIMARY KEY AUTO_INCREMENT, + eno INT(11) NOT NULL COMMENT '职工编号', + ename VARCHAR(255) NOT NULL COMMENT '职工姓名', + faname VARCHAR(255), + moname VARCHAR(255) +); + +#2 添加字段 +ALTER TABLE t_salary ADD grade VARCHAR(255) COMMENT '评级'; + +#3 修改字段数据类型 +ALTER TABLE t_employee MODIFY sex ENUM('男', '女'); + +#4 更新记录 +UPDATE t_department d +SET d.tel = '128' +WHERE d.dname = '法务部'; + +#5 条件、排序查询 +SELECT e.ename, e.sex, e.birthday +FROM t_employee e +WHERE e.birthday >= '2000-1-1' +ORDER BY e.birthday DESC; + +#6 分组、多表连接查询 +SELECT d.dname, SUM(s.basepay+s.overtime+s.allowance+s.insurance) +FROM t_department d, t_employee e, t_salary s +WHERE e.dno = d.dno AND e.eno = s.eno +GROUP BY d.dno; +#7 分组+排序 视图 +CREATE VIEW v_jobcount AS +SELECT j.jobtitle, COUNT(*) +FROM t_job j, t_employee e +WHERE j.jno = e.jobno +GROUP BY j.jno +ORDER BY 2; + +#8 触发器 +CREATE TRIGGER tri_updateGrade +BEFORE UPDATE ON t_salary FOR EACH ROW +BEGIN + IF NEW.basepay < 6000 THEN + SET NEW.grade = 'C'; + ELSEIF NEW.basepay < 8000 THEN + SET NEW.grade = 'B'; + ELSEIF NEW.basepay >= 8000 THEN + SET NEW.grade = 'A'; + END IF; +END; +#9 存储过程 +CREATE PROCEDURE `pro_getDepartmentTel`(in `in_dno` int, OUT dept_phone VARCHAR(100)) + BEGIN + + SELECT CONCAT('部门名称-', dname, ',电话-', tel) INTO dept_phone + FROM t_department + WHERE dno = `in_dno` limit 1; + + IF dept_phone IS NULL THEN + SET dept_phone = '没有找到相应的部门'; + END IF; + END +``` + +### C语言-1 + +```c +/*--------------------------------------------------------- +【程序设计】输入n个整数,以-1结束,求所输入的整数中,十位是奇数的所有整数之和。 +例1: +输入n个整数,求十位为奇数的数之和(输入-1结束): +10 15 20 25 30 40 50 -1 +十位为奇数的数之和为: 105 +例2: +输入n个整数,求十位为奇数的数之和(输入-1结束): +8 18 28 -38 48 58 -1 98 +十位为奇数的数之和为: 38 +------------------------------------------------------------------------ +注意:部分源程序给出如下。请勿改动主函数main或其它函数中给出的内容,仅在 +Program-End之间填入若干语句。不要删除标志否则不得分。 +---------------------------------------------------------*/ +#include +int main() { + int num,tenDigit; + int sum = 0,i; + printf("输入n个整数,求十位为奇数的数之和(输入-1结束):\n"); + while (1) + { + scanf("%d", &num); + /**********Program**********/ + if(num == -1){ + break; + } + if((num<0?num*-1:num)%100/10%2==1){ + sum += num; + } + + + + + /********** End **********/ + } + printf("十位为奇数的数之和为: %d\n", sum); +} +``` + diff --git a/2208/MySQL常用语句.md b/2208/MySQL常用语句.md new file mode 100644 index 0000000..bc05693 --- /dev/null +++ b/2208/MySQL常用语句.md @@ -0,0 +1,95 @@ +```sql +/* +40分 +1-4 创建表、修改表结构、添加主键外键、更新记录、删除记录 +5-6 单表、多表连接、条件、分组、排序、分页查询 +7 视图 +8 触发器 +9 存储过程、存储函数 +*/ +#1-4 +#创建表 +CREATE TABLE 表名( + 字段名 数据类型 约束 DEFAULT 默认值 COMMENT 备注, + 字段名 数据类型 约束 DEFAULT 默认值 COMMENT 备注 +); +#修改表字段数据类型 +ALTER TABLE 表名 MODIFY 字段名 数据类型 约束; +#修改表字段名+数据类型 +ALTER TABLE 表名 CHANGE 字段名 新字段名 数据类型 约束; +#删除表字段 +ALTER TABLE 表名 DROP 字段名; +#添加表字段 +ALTER TABLE 表名 ADD 字段名 数据类型 约束; +#设置字段默认值 +ALTER TABLE 表名 ALTER 字段名 SET DEFAULT 默认值; +#设置唯一约束 +ALTER TABLE 表名 MODIFY 字段名 数据类型 UNIQUE; +ALTER TABLE 表名 ADD UNIQUE(字段名); +#添加主键 +ALTER TABLE 表名 MODIFY 字段名 数据类型 PRIMARY KEY; +ALTER TABLE 表名 ADD CONSTRAINT 主键名 PRIMARY KEY(字段名); +#设置非主键字段自动增长 +ALTER TABLE 表名 MODIFY 字段名 数据类型 PRIMARY KEY AUTO_INCREMENT; +#设置主键字段自动增长 +ALTER TABLE 表名 MODIFY 字段名 数据类型 AUTO_INCREMENT; +#设置自动增长值 +ALTER TABLE 表名 AUTO_INCREMENT=数值; +#添加外键 +ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY(字段名) REFERENCES 外键表(主键字段名) ON UPDATE CASCADE/SET NULL ON DELETE CASCADE/SET NULL; +#记录更新 +UPDATE 表名 +SET 字段名 = 数值 +WHERE 条件; +#记录删除 +DELETE FROM 表名 +WHERE 条件; + +#5-7 查询+视图 +SELECT 字段名 +FROM 表名 +WHERE 条件 +GROUP BY 分组字段 +HAVING 分组后条件 +ORDER BY 排序字段 +LIMIT 起始位置, 记录个数; + +#创建视图 +CREATE VIEW 视图名 AS +查询; + +#8 触发器 +DELIMITER $$ +DROP TRIGGER IF EXISTS 触发器名; +CREATE TRIGGER 触发器名 +BEFORE/AFTER UPDATE/INSERT/DELETE ON 表名 +FOR EACH ROW +BEGIN + #BEGIN END 之间写需要附带的操作 +END $$ +DELIMITER ; + +#9 存储过程、存储函数 +DELIMTIER $$ +DROP PROCEDURE IF EXISTS 存储过程名; +CREATE PROCEDURE 存储过程名(IN 参数名 数据类型, OUT 参数名 数据类型) +BEGIN + #BEGIN END 之间写需要执行的操作 +END $$ +DELIMITER ; + +DELIMTIER $$ +DROP FUNCTION IF EXISTS 存储函数名; +CREATE FUNCTION 存储函数名(参数名 数据类型) +RETURNS 返回值类型 +DETERMINISTIC/NOT DETERMINISTIC +BEGIN + #BEGIN END 之间写需要执行的操作 +END $$ +DELIMITER ; + +/* +寒假作业:19+10套 +*/ +``` + diff --git a/2208/习题答案/1-3日习题答案.md b/2208/习题答案/1-3日习题答案.md new file mode 100644 index 0000000..952b8dd --- /dev/null +++ b/2208/习题答案/1-3日习题答案.md @@ -0,0 +1,65 @@ +### MySQL-1 + +```sql +#1.添加字段 +ALTER TABLE t_student ADD descr VARCHAR(200) DEFAULT '无'; + +#2.插入记录 +INSERT INTO t_student() +VALUES(DEFAULT, '林小莉', '女', 8, 10005,'13971555555', '身体瘦弱,训练强度需要调整'); + +#3.简单查询 tj11 +SELECT c.id, c.`name`, CONCAT(YEAR(c.time),'年',MONTH(c.time),'月', DAY(c.time),'日') +FROM t_class c; + + +#4.排序、分页查询 tj12 +SELECT * +FROM t_coach c +ORDER BY c.salary +LIMIT 1, 2; + +#5.模糊、多表连接查询 tj13 +SELECT co.`name`, cl.`name`, cl.period +FROM t_coach co, t_class cl +WHERE co.id = cl.coachId AND co.`name` LIKE '何%'; + +#6.更新记录 +UPDATE t_coach c +SET c.salary = c.salary + 200 +WHERE c.age >= 30; + +#7.多表联查+视图 +CREATE VIEW v_swim AS +SELECT s.`name` '学员姓名', co.`name` '教练姓名', cl.`name` '班级名称' +FROM t_student s, t_class cl, t_coach co +WHERE s.classId = cl.id AND cl.coachId = co.id; + +#8.插入操作的触发器 +DELIMITER $$ +DROP TRIGGER IF EXISTS tri_familylog; +CREATE TRIGGER tri_familylog +AFTER DELETE ON t_family +FOR EACH ROW +BEGIN + INSERT INTO t_log() + VALUES(DEFAULT, OLD.fid, '删除家庭', '2024-01-01'); +END $$ +DELIMITER ; + +#9.条件查询+聚合函数 存储过程 +DELIMITER $$ +DROP PROCEDURE IF EXISTS pro_getStudentNumber; +CREATE PROCEDURE pro_getStudentNumber(IN in_classId INT, OUT out_number INT) +BEGIN + SELECT COUNT(*) INTO out_number + FROM t_student s + WHERE s.classId = in_classId; +END $$ +DELIMITER ; + +#测试存储过程 +CALL pro_getStudentNumber(10002, @result); +SELECT @result; +``` + diff --git a/2208/习题答案/12-18日习题答案.md b/2208/习题答案/12-18日习题答案.md new file mode 100644 index 0000000..4ec70c5 --- /dev/null +++ b/2208/习题答案/12-18日习题答案.md @@ -0,0 +1,181 @@ +### C语言-1 + +```c +/*------------------------------------------------------------------------------ +(1)【程序设计】定义一个大小为50的整型数组,将数字1~50存入该数组,利用指针将数组中的值输出,每行5个,每个数字占4个符号位,左对齐。 +------------------------------------------------------------------------------*/ +#include +#include +int main() +{ + int i,*p,array[50]; + for(i=0;i<50;i++) + { + array[i]=i+1; + } + p=array; +/**********Program**********/ + for(i=0;i<50;i++){ + //p指针变量 存着数组array首元素地址 + printf("%-4d ", *(p+i));//*间接访问符 用来返回指针所指向数值 + if((i+1)%5==0){ + printf("\n"); + } + } +/********** End **********/ +} +``` + +### C语言-2 + +```c +/*---------------------------------------------------------------------- +【程序设计】 +------------------------------------------------------------------------ +题目:要求实现一个函数,能够合并两个整数数组,合并后进行降序排序并删除重复元素。 +示例1: +输入输出如下所示: +请输入第一个数组的6个元素,每个元素之间用空格隔开:1 3 5 7 10 6 +请输入第二个数组的6个元素,每个元素之间用空格隔开:10 4 2 6 11 30 +合并后降序排列的数组:30 11 10 7 6 5 4 3 2 1 +------------------------------------------------------------------------ +注意:请勿改动程序中的其他内容。 +----------------------------------------------------------------------*/ +#include + +int* mergeArrays(int *arr1, int size1, int *arr2, int size2,int *newLen); + +int main() { + + int size1=6; + int size2=6; + int arr1[6]; + int arr2[6]; + int i; + + int newLen = 0; + int* mergedArray; + + printf("请输入第一个数组的6个元素,每个元素之间用空格隔开:"); + for ( i = 0; i < size1; i++) { + scanf("%d", &arr1[i]); + } + printf("请输入第二个数组的6个元素,每个元素之间用空格隔开:"); + for ( i = 0; i < size2; i++) { + scanf("%d", &arr2[i]); + } + + mergedArray = mergeArrays(arr1, size1, arr2, size2, &newLen); + + printf("合并后降序排列的数组:"); + for (i = 0; i < newLen; i++) { + printf("%d ", mergedArray[i]); + } + printf("\n"); + return 0; +} + + +int* mergeArrays(int *arr1,int size1,int *arr2,int size2,int *newLen) { + static int mergedArray[20]; + /**********Program**********/ + //将两个数组中的元素合并到一个新的数组里 + int i, j=0, temp; + *newLen = 1; + //合并 + for(i=0;i<6;i++){ + mergedArray[j++] = arr1[i]; + mergedArray[j++] = arr2[i]; + } + //排序 + for(i=0;i= '2000-1-1' +ORDER BY e.birthday DESC; + +#6 分组、多表连接查询 +SELECT d.dname, SUM(s.basepay + s.overtime + s.allowance + s.insurance) +FROM t_employee e, t_department d, t_salary s +WHERE e.dno = d.dno AND e.eno = s.eno +GROUP BY d.dno; + +#7 分组+排序 视图 +CREATE VIEW v_jobcount AS +SELECT j.jobtitle, COUNT(*) +FROM t_employee e, t_job j +WHERE e.jobno = j.jno +GROUP BY j.jno +ORDER BY 2; + +#8 触发器 +CREATE TRIGGER tri_updateGrade +BEFORE UPDATE ON t_salary FOR EACH ROW +BEGIN + IF NEW.basepay < 6000 THEN + SET NEW.grade = 'C'; + ELSEIF NEW.basepay < 8000 THEN + SET NEW.grade = 'B'; + ELSEIF NEW.basepay >= 8000 THEN + SET NEW.grade = 'A'; + END IF; +END; + +#9 存储过程 +CREATE PROCEDURE `pro_getDepartmentTel`(in `in_dno` int,OUT dept_phone VARCHAR(100)) + BEGIN + + SELECT CONCAT('部门名称-', dname, ',电话-', tel) INTO dept_phone + FROM t_department + WHERE dno = in_dno limit 1; + + IF dept_phone IS NULL THEN + SET dept_phone = '没有找到相应的部门'; + END IF; + END +``` + diff --git a/2301/作业/第一周作业.md b/2301/作业/第一周作业.md new file mode 100644 index 0000000..e69de29 diff --git a/2301/教学大纲.md b/2301/教学大纲.md new file mode 100644 index 0000000..fd71ad3 --- /dev/null +++ b/2301/教学大纲.md @@ -0,0 +1,23 @@ +## 基本数据类型 + +## 运算符和表达式 + +## 基本输入输入函数 + +## 顺序结构 + +## 选择结构 + +## 循环结构 + +## 数组 + +## 函数 + +## 指针 + +## 结构体 + +## 预处理 + +## 文件 diff --git a/2301/源码/Hello.c b/2301/源码/Hello.c new file mode 100644 index 0000000..f579928 --- /dev/null +++ b/2301/源码/Hello.c @@ -0,0 +1,8 @@ +#include + +int main(void){ + + printf("Hello 2301!\n"); + + return 0; +} \ No newline at end of file diff --git a/2302/作业/第一周作业.md b/2302/作业/第一周作业.md new file mode 100644 index 0000000..e69de29 diff --git a/2302/教学大纲.md b/2302/教学大纲.md new file mode 100644 index 0000000..fd71ad3 --- /dev/null +++ b/2302/教学大纲.md @@ -0,0 +1,23 @@ +## 基本数据类型 + +## 运算符和表达式 + +## 基本输入输入函数 + +## 顺序结构 + +## 选择结构 + +## 循环结构 + +## 数组 + +## 函数 + +## 指针 + +## 结构体 + +## 预处理 + +## 文件 diff --git a/2302/源码/Hello.c b/2302/源码/Hello.c new file mode 100644 index 0000000..5119884 --- /dev/null +++ b/2302/源码/Hello.c @@ -0,0 +1,8 @@ +#include + +int main(void){ + + printf("Hello 2302!\n"); + + return 0; +} \ No newline at end of file diff --git a/2303/作业/第一周作业.md b/2303/作业/第一周作业.md new file mode 100644 index 0000000..e69de29 diff --git a/2303/教学大纲.md b/2303/教学大纲.md new file mode 100644 index 0000000..fd71ad3 --- /dev/null +++ b/2303/教学大纲.md @@ -0,0 +1,23 @@ +## 基本数据类型 + +## 运算符和表达式 + +## 基本输入输入函数 + +## 顺序结构 + +## 选择结构 + +## 循环结构 + +## 数组 + +## 函数 + +## 指针 + +## 结构体 + +## 预处理 + +## 文件 diff --git a/2303/源码/Hello.c b/2303/源码/Hello.c new file mode 100644 index 0000000..6a3b410 --- /dev/null +++ b/2303/源码/Hello.c @@ -0,0 +1,8 @@ +#include + +int main(void){ + + printf("Hello 2303!\n"); + + return 0; +} \ No newline at end of file diff --git a/push.bat b/push.bat new file mode 100644 index 0000000..e1aeb3d --- /dev/null +++ b/push.bat @@ -0,0 +1,4 @@ +git pull +git add . +git commit -m "Auto commit" +git push origin main \ No newline at end of file diff --git a/其他/markdown语法.md b/其他/markdown语法.md new file mode 100644 index 0000000..30aede3 --- /dev/null +++ b/其他/markdown语法.md @@ -0,0 +1,83 @@ +Markdown 是一种轻量级标记语言,用于简单地格式化文本。以下是一些 Markdown 常用语法: + +### 标题 +在文本前面加上 `#` 来表示标题,数量代表标题级别,从 `#` 到 `######` 分别表示一级标题到六级标题。 + +```markdown +# 一级标题 +## 二级标题 +### 三级标题 +``` + +### 列表 +Markdown 支持有序列表和无序列表。 + +无序列表使用 `*`、`-` 或 `+` 开头: + +```markdown +- 无序列表项 1 +- 无序列表项 2 +``` + +有序列表使用数字加英文句点开头: + +```markdown +1. 有序列表项 1 +2. 有序列表项 2 +``` + +### 引用 +使用 `>` 符号表示引用: + +```markdown +> 这是一段引用的内容。 +``` + +### 粗体和斜体 +使用 `**` 或 `__` 包裹文本表示粗体,使用 `*` 或 `_` 包裹文本表示斜体。 + +```markdown +**粗体文本** +*斜体文本* +``` + +### 链接和图片 +链接使用 `[链接文本](链接地址)` 的格式,图片使用 `![图片描述](图片链接地址)` 的格式。 + +```markdown +[Google](https://www.google.com) +![Logo](https://example.com/logo.png) +``` + +### 代码块 +使用三个反引号(\`\`\`)表示代码块,可以指定语言类型。 + +```markdown +```python +def hello(): + print("Hello, World!") +``` + + + + +``` +### 水平线 +可以使用三个或更多的连字符 `-`、下划线 `_` 或星号 `*` 来创建水平线。 + +```markdown +--- +___ +*** +``` + +### 表格 +可以使用表格语法创建表格,使用 `|` 分隔单元格,使用 `-` 来分隔表头和表体。 + +```markdown +| Header 1 | Header 2 | +| -------- | -------- | +| Cell 1 | Cell 2 | +``` + +这些是 Markdown 的一些常用语法,它们可以帮助您更方便地编写格式化的文本。 \ No newline at end of file diff --git a/其他/技能高考分数线/2024年湖北省技能高考专科投档线.png b/其他/技能高考分数线/2024年湖北省技能高考专科投档线.png new file mode 100644 index 0000000..5243724 Binary files /dev/null and b/其他/技能高考分数线/2024年湖北省技能高考专科投档线.png differ diff --git a/其他/技能高考分数线/2024年湖北省技能高考本科投档线.png b/其他/技能高考分数线/2024年湖北省技能高考本科投档线.png new file mode 100644 index 0000000..069a47c Binary files /dev/null and b/其他/技能高考分数线/2024年湖北省技能高考本科投档线.png differ diff --git a/其他/技能高考分数线/湖北技能高考各专业近六年本科线.png b/其他/技能高考分数线/湖北技能高考各专业近六年本科线.png new file mode 100644 index 0000000..6111268 Binary files /dev/null and b/其他/技能高考分数线/湖北技能高考各专业近六年本科线.png differ diff --git a/其他/技能高考分数线/湖北省技能高考历年考生人数变化.png b/其他/技能高考分数线/湖北省技能高考历年考生人数变化.png new file mode 100644 index 0000000..3544798 Binary files /dev/null and b/其他/技能高考分数线/湖北省技能高考历年考生人数变化.png differ diff --git a/寒假作业/C语言精通120题.md b/寒假作业/C语言精通120题.md new file mode 100644 index 0000000..e3ec185 --- /dev/null +++ b/寒假作业/C语言精通120题.md @@ -0,0 +1,242 @@ +1.输入一小写字母,分别以字符形式与数值形式输出与该小写字母相应的大写字母 + +2.输入一个华氏温度,要求输出摄氏温度。公式为c=5/9*(f-32) + +3.写一个程序,输入实数X,输出Y,计算 +image-20250116004443767 + +4.编写程序:读入三个整数a,b,c,然后交换它们中的数,使a存放b的值,b存放c的值,c存放a的值。 + +5.编写程序:输入9时23分并把它化为分钟后输出。(从零点整开始计算)。 + +6.要将“Chiina”翻译成密码,密码规律是:用原来的字母后面第4个字母代替原来的字母。例如,字母“ A”后面的4个字母是“E”,用“E”代替“A”。因此,“Chian”应译成“Glmre”。用赋初值的方法 是c1,c2,c3,c4,c5五个变量的值分别为‘C’、‘h’、‘i’、‘n’、‘a’,经过运算,使c1、c2、 c3、c4、c5分别为‘G’、‘l’、‘m’、‘r’、‘e’,并输出 + +7.编写程序,用getchar函数读入两个字符c1,c2,然后分别用putchar函数和prinf函数输出这两个字符以 及它们的ASCII值。 + +8.设圆半径r=1.5,圆柱高h=3,求圆周长,圆面积,圆球表面积,圆球体积,圆柱体积 + +9.编写程序,输入两个整数 ,计算并输出它们的和、差、积、除(精确除)、整除及模的结果。 + +10.编一程序,对于一个给定的一个百分制成绩,输出相应的五分制成绩。设:90分以上为ˊAˊ,80~89 分为ˊBˊ,70~79分为ˊCˊ,60~69分为ˊDˊ,60分以下为ˊEˊ。 + +11.输入3个整数,要求按由小到大的顺序输出 + +12.输入4个数,输出其中的最大数和最小数。 + +13.有以函数y=x(x<1);2x-1(1<=x<10);3x-11(x>=10).写一程序,输入x,输出y. + +14.给定一个不多于5的正整数,要求:(1)求它是几位数;(2)分别打印出每一位数字(3)按逆序打 印出各位数字. + +15.编写程序,要求输入整数a和b.若a2+b2大于100,则输出a2+b2百位以上的数字,否则输出两数之和。 + +16.根据输入的三角形的三边判断是否能组成三角形,若可以则输出它的面积和三角形的类型 + +17.判断输入的正整数是否既是5又是7的整倍数。若是,则输出yes,否则输出no + +18.输入4个整数,求4个数中的偶数之和. + +19.输入4个整数,求4个数中的奇数之和 + +20.假设奖金税率如下(a代表奖金,r代表税率)a<500 r=0%;500<=a<1000 r=5%;1000<=a<2000 r=8%; + + 2000<=a<3000 r=10%;3000<=a r=15%编写程序用if语句实现:对输入的一个资金数,求税率和应交 税款以及实际奖金数(扣除奖金税后)。 + +21.输入一个字符,如果是大写字母,转换为小写,如果不是不转换。最后输出。 + +22.键盘上输入三角形三边a,b,c 的值,计算三角形面积,并输出三角形的三边a,b,c及面积area的值。三 角形面积的公式:s=(a+b+c)/2 area=sqrt[s(s-a)(s-b)(s-c)]. + +23.编写一个程序,根据用户输入的一个字母判定它是星期几。要求用switch语句实现程序控制,当第一个字母相同时,如:T(t)uesday 和T(t)hursday故需要进一步输入U或u或H或h确认。 + +24.编写一个程序:输入某年某月,判断这一月有多少天? + +25.从键盘上输入字母或0~9的数字,编写程序对其进行分类。字母可分为大写字母和小写字母,数字可分 为奇数和偶数。 + +26.编写程序:加密数据,方法:对给定数值,每一位数字均加2,且在[0,9]范围内,若加密后某位数字 大于9,则取其被10除的余数. + +27.编写程序:计算从1995年1月1日至2000年12月10日共有多少天。闰年的2月有29天.闰年满足如下条件 :能被400整除或能被4 整除但不能被100整除。 + +28.编程求解一元二次方程 ax2+bx+c=0的根。 + +29.有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? + +31.已知abc+cba=1333,其中a、b、c均为一位数,编写一个程序求出a、b、c分别代表什么数字。 + +32.鸡兔共有30只,脚共有90只,编写一程序计算鸡兔各有多少只。 + +33.输入两个正整数m和n,求其最大公约数和最小公倍数. + +34.输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。见87题 + +35.一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程:找出1000以内的所 有完数。 + +36.猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩 下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再 吃时,见只剩下一个桃子了。求第一天共摘了多少. + +37.有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和. + +38.编写一个程序显示ASCII码65~90(十进制)的字符对照表。并输出6个数换一行。 + +39.已知xyz+yzz=532,其中x、y、z都是数字,编写一个程序求出x、y、z分别代表什么数字。 + +40.已知四位数a2b3能被23整除,编写一程序求此四位数。 + +41.输入n,计算s=1+1+2+1+2+3+1+2+3+4+...+1+2+3+4+...+n + +42.从两个红球,三个白球,四个黑球中任意取出五个球,且其中必有白球,编写程序输出所有可能方案 + +43.花数”是指一个三位数,其各位数字立方和等于该数。 + +44.编写一程序:求1-3+5-7+…-99+101的值。 + +45.编写一程序:输入一个正偶数n,将其分解成两个素数之和。 + +46.编写程序,从键盘输入6名学生的5门成绩,分别统计出每个学生的平均成绩。 + +47.编程在屏幕上输出具有7行的正三角形。 + +48.若用0至9之间不同的三个数构成一个三位数,编写一个程序统计出共有多少种方法。 + +49.编程输出100—200之间第一个能被3整除的之前的所有整数。 + +50.把100—200之间的不能被3整除的整数输出。 + +51.求输入的10个整数中正数的个数以及其平均值。 + +52.求出1000以内的所有素数,要求一行输出30个。 + +53.有1020个西瓜,第一天卖一半多两个,以后每天卖剩下的一半多两个,问几天以后能卖完?。 + +54.4位反序数:设N是一个四位数,它的9倍恰好是其反序数,求N. + +55.有限5位数:个位数为6且能被3整除的五位数共有多少? + +56.编写一程序计算1到正整数n之间的奇数之和以及偶数之和。 + +57.编写一程序计算100到1000之间有多少个数其各位数字之和是5。 + +58.学校有近千名学生,在操场上排队,5人一行余2人,7人一行余3人,3人一行余1人,编写一程序求该 校的学生人数。 + +59.编写一程序实现从键盘输入10个数,找到第一个能被7整除的数。若,找到,打印此数后退出循环;若 未找到,打印“not exist”。 + +60.编写一程序:计算用一角、二角和五角凑成一元有多少种组合,并打印输出每种组合。 + +61.在数组a中按照顺序查找值为y的元素。若数组a中不存在该元素,则输出不存在;若存在这样的元素,则显示元素的下标,以及元素的总个数 见实验指导书P60必做题1。 + +62.数组中存放N个元素,编写程序删除掉下标为奇数的元素,使得数组中只存放下标为偶数的元素。. + +63.数组s中存放有N个同学的某一门功课的成绩。要求编写程序,求出有多少个同学的成绩高于此门功课的平均分。 + +64.输入一个3行3列矩阵的所有元素,求该矩阵周边各元素的和。 见实验指导书P65必做题1。 + +65.判定一个字符串是否是回文串。(所谓回文串是指从开头读和从末尾读均为相同字符的字符串。例如:abcdcba。 见实验指导书P71必做题1。 + +66.读入一个字符串,要求将该字符中所有字符按照递增的顺序进行排序(采用冒泡排序算法)后输出。 + +67.编程将两个字符串连接起来,不准使用strcat函数。 + +68.有10个字符串,找出每个字符串中最大字符,并按顺序放入一维数组a[10]中,即第i个字符串中最大字符放入a[i]中,输出a[i]数组。 + +69.编程将任意十进制数转化成N进制。 + +70.设数组a中的元素均为正整数,编程求a数组中偶数的个数和偶数的平均值。 + +71.数组a包括10个整数,把a中所有的后项除以前项之商取整后存入数组b,并按每行3个元素的格式输出数组b.试编程。. + +72.编程:从键盘输入一个字符串a,并在a串中的最大元素后边插入字符串b + +73.输入一个正整数,按逆序输出各位的数字。 + +74.将二维数组行列元素互换,存到另一个数组中。 + +75.有一个3*4矩阵,求最大元素值及其行、列号。 + +76.有10个字符串,找出每个字符串中最大字符,依次存入一维字符数组a中,即第i个字符串中的最大字符放入a[i]中,输出数组a 同题68 + +77.设数组a中的元素均为正整数,编程求a数组中偶数的个数和偶数的平均值 同题70 + +78.编写一个程序,将字符数组s2中的全部字符拷贝到字符数组s1中。不得使用strcpy函数。拷贝时,‘\0‘也要拷贝过去。 + +79.将一个字符串中下标值为偶数的元素由小到大排序,其它元素不变。 + +80.使用二维数组打印杨辉三角形 + +81.从键盘输入一个二维整型数组,如a[4\][4\]={ 1,2,3,4,2,2,5,6,3,5,3,7,4,6,7,4},试编程检查一个二维数组是否对称(即对所有i,j都有a[i\][j\]=a[j\][i\])。 + +82.输入5个整数,找出最大数和最小数所在的位置,并把二者对调,然后输出调整后的5个数. + +83.将字符串S中所有下标为奇数的位置上的字母大小写互换。 + +84.求矩阵a和b的和,结果存入矩阵c中并按矩阵形式输出。 + +85.有5个同学,每个同学有4门功课的考试成绩,求每人的平均成绩和每门功课的平均成绩。要求只用一个2维数组完成; + +86. 编写一程序完成字符串处理函数(strcat字符串连接函数功能,不允许使用strcat函数实现),即连接两字符串a,b,将字符串b中字符连接到字符串a后成为一个字符串。(要求两字符串a,b 在主函数中输入,连接部分编写一函数完成,结果由主函数输出完成。) + +87.编写函数统计字符串中字母、数字、空格和其他字符的个数。(要求在主函数中输入字符串以及输出上述结果,子函数完成统计功能。) + +88.采用函数的方法实现“冒泡法”排序对输入的10个字符按从小到大的顺序进行排列。(要求在主函数中输入字符并输出排序结果。提示:字符从键盘接收到后放入数组中存放,数组名作为函数参数。) + +89.编写一函数将一十进制数转换成2进制数并按顺序输出。(要求在主函数中输入此十进制数,由子函数进行转换并把结果传递给主函数。) + +90.编写一程序实现:输入年、月、日,计算出该日是该年的第多少天。(要求在主函数中输入数据,计算过程由函数完成并将最后结果返回主函数输出。) + +91.使用函数实现求n的阶乘。(主函数输入数据n,子函数求出阶乘的值并返回给主函数) 见实验指导书P80必做题第2题。 + +92.使用函数求两个整数的最大公约数和最小公倍数。(主函数输入两个数,子函数gongyue( )用来求最大公约数,子函数gongbei( )用来求最小公倍数) 见实验指导书P81选做题第1题。 + +93.使用函数求某长整型数据的各位数字之积。(主函数输入长整型数据,子函数func( )分离出各位数字,并将乘积返回给主函数) 见实验指导书P83选做题第3题。 + +94.使用函数求3名同学5门课的平均成绩。(主函数输入3名同学5门课的成绩,子函数计算出某名同学5门课的均分并返回给主函数) + +95.使用函数实现字符串的颠倒存放操作。(主函数中使用字符串处理函数实现字符串的输入,子函数实现字符串的颠倒操作,使用字符串名作为函数参数。注意:应实现字符串的颠倒存放,而不是逆序输出) + +96.子串删除。函数delete(s,i,n)实现从字符串s中删除下标为i的字符开始的n个字符。(主函数实现全局字符数组s和全局变量i、n的输入,并假设i 、n和i+n的值都小于字符串的 + +长度) + +97.输入一字符串,如果该字符串中含有字符’s’,则返回该字符串的最后一个字符,否则输出“no”。(主函数输入一行字符,子函数getline( )的作用是判断是否含有’s’,返回最后一个字母或输出“no”。) + +98.使用函数求解一元二次方程的根,方程的系数由主函数输入得到,并且设a、b均不等于0。 + +99.编写一程序完成字符串处理函数(strcpy字符串复制函数功能,不允许使用strcpy函数实现),即将字符串a的内容完整的复制到字符串b中(连同字符串a中’\0’也要复制)。(要求字符串a内容在主函数中输入,复制部分编写一函数完成,结果由主函数输出完成。) + +100.编写一程序完成对于一个大于等于3的正整数,判断它是不是一个素数(要求数据由主函数输入,判断部分编写一函数实现,结果由主函数输出完成。) + +101.编写一程序将一包含n个字符的字符串中从第m个字符开始的全部字符复制到另外一个字符串(n>m)。(要求数据由主函数输入,复制部分编写一函数实现,复制后结果由主函数输出完成。) + +102.使用函数实现华氏温度向摄氏温度的转换,转换公式如下:C=(5/9)*(F-32),其中C为摄氏温度,F为华氏温度。(子函数实现温度转化,并将结果返回给主函数).见实验指导书P79必做题第1题。 + +103.写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。. + +104.用函数实现一些程序:计算10个学生的1门课程成绩的平均值.. 见实验指导书P85必做题第1题。 + +105.有15个数按由大到小顺序存放在一个数组int a={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}中,输入一个数用顺序查找法找出该数是数组中的第几个元素的值(元素下标值),若该数不在数组中则打印“无此数”。 (要求数据由主函数输入,查找部分编写一函数实现,结果由主函数输出完成。) + +106.定义一个带参数的宏,完成从四个数中找出最大数的操作。 + +107.根据已知算法定义一个带参数的宏,用来判别程序中输入的年份是否闰年。 + +108.试定义一个带参数的宏swap(x,y),以实现两个整数之间的交换,并利用它将一维数组a和b的所有元素的值进行交换。 + +109.输入两个整数,求它们相除的余数.用带参数的宏来实现,编程序. + +110.定义两个带参数的宏,一个用来求S(s=1/2(a+b+c)),另个用来求area(area为三角形的面积)。写程序,在程序中用带实参的宏名来求面积area。 + +111.已知字符串S中的内容为“Student!”,请用指针的方法将S中的内容逆序输出,且不能改变串中的内容。 + +112.输入一行文字,找出其中大写字母、小写字母、空格、数字以及其他字符个数。(要求用指针实现)。 + +113.通过指针操作,将输入的3个字符串,按由大到小的顺序输出。 + +114.定义整型数组a,有10个元素,用指针实现数组中的全部元素的输出. + +115.编一程序,将字符串computer赋给一个字符数组,然后从第一个字母开始间隔地输出该串。请用指针完成。 + +116.利用指针编写一程序,将字符串中的第m个字符开始的全部字符复制成另一个字符串。要求在主函数中输入字符串及m的值并输出复制结果,在被调函数中完成复制。 + +117.用指针法实现:输入10个数,按由小到大的顺序输出。 + +118.用指针法实现:写一个函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度值。 + +119.从键盘输入10个学生的成绩,显示其中的最高分、最低分和平均分。用指针实现。 + +120.数组中存放N个元素,编写程序删除掉下标为奇数的元素,使得数组中只存放下标为偶数的元素。用指针实现。 diff --git a/寒假作业/C语言练习题合集.md b/寒假作业/C语言练习题合集.md new file mode 100644 index 0000000..8659f3b --- /dev/null +++ b/寒假作业/C语言练习题合集.md @@ -0,0 +1,879 @@ +## 一、顺序结构 + +1. 将华氏温度转换为摄氏温度和绝对温度的公式分别为: +c= (f-32) (摄氏温度) +k=273.16+c (绝对温度) +请编程序:当给出f 时,求其相应摄氏温度和绝对温度。 +测试数据:① f=34 +② f=100 + +2. 写一个程序把极坐标(r,θ) (θ之单位为度)转换为直角坐标( X,Y)。转换公式是: +x=r.cosθ +y=r.sinθ +测试数据:① r=10 θ=45° +② r=20 θ=90° + +3. 写一个程序,按如下格式输出数据。 +name number math english computer +zhanghua 9901 80.50 87.0 80 +lina 9902 70.00 80.0 90 +wanggang 9903 87.00 76.0 78 + +4. 输入3 个双精度实数,分别求出它们的和、平均值、平方和以及平方和的开方,并输 +出所求出各个值。 + +5. 输入一个3 位整数,求出该数每个位上的数字之和。如123,每个位上的数字和就是 +1+2+3=6。 + +## 二、分支结构 + +1. 输入一个字符,判断它如果是小写字母输出其对应大写字母;如果是大写字母输出其 +对应小写字母;如果是数字输出数字本身;如果是空格,输出“space”;如果不是 +上述情况,输出“other”。 + +2. 有三个数a、b、c,由键盘输入,输出其中最大的数。 + +3. 输入一个数,判断它能否被 3 或者被 5 整除, 如至少能被这两个数中的一个整除则将 +此数打印出来,否则不打印,编出程序。 + +4. 读入1 到7 之间的某个数,输出表示一星期中相应的某一天的单词:Monday、 Tuesday +等等,用switch 语句做。 + +5. 给出一百分制成绩,要求输出成绩等级‘A’,‘B’,‘C’,‘D’,‘E’,90 分以上为 +‘A’,80~89 分为‘B’,70~79 分为‘C’,60~69 分为‘D’,60 分以下为‘E’。 + +6. 有一函数,请编程序计算y 的值(x 的值由键盘输入)。 +image-20241130003549906 + + + +## 三、循环结构 + +1. 计算n 的阶乘 + +2. 求 1 到 100 之间的奇数之和、偶数之积。 + +3. 输入一行字符,统计其中的英文字母、数字、空格和其他字符个数。 + +4. 用循环语句编写求下列表达式值的程序。 +image-20241130003536421 + +5.求1!+2!+3!+...+20! + +6.求下列分数序列的前20项之和。 +image-20241130003647576 + +7. 任意十个数,打印出它们中的最大数、最小数。 +测试数据:① 1,-12,20,30,-5,-23,33,125,200,-100 + ② 0,10,3,1,5,6,-10,90,9,-4 + ③ 12,13,14,15,10,-10,-11,-12,-9,9 + +8. 判断一个数是否是素数 + +9. 打印1-100 之间所有素数 + +10. 求1-100 之间所有非素数的和 + +11. 输入两个正整数 m 和 n,求其最大公约数和最小公倍数 +提示: +求 m,n的最大公约数:首先将 m除以 n(m>n)得余数 R,再用余数 R 去除原来的除数,得新的余数,重复此过程直到余数为 0 时停止,此时的除数就是m 和 n的最大公约数。 +求 m和 n的最小公倍数: m和 n的积除以 m和 n 的最大公约数。 +测试数据: m=12, n=24 + m=100, n=300 + +12. 打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数, 其各位数字立方 +和等于该数本身。例如 153 是一个水仙花数,因为 153=1\*1\*1+5\*5\*5+3\*3\*3(要求分别用一重循环和三重循环实现)。 + +13. 一个数恰好等于它的平方数的右端,这个数称为同构数。如 5 的平方是25, 5 是25 中的右端的数, 5 就是同构数。找出1~1000 之间的全部同构数。 + +14. 3025 这个数具有一种独特的性质:将它平分为两段,即30 和25,使之相加后求平方,即(30+25),恰好等于3025 本身。请求出具有这样性质的全部四位数。 + +15. 两位数13 和62 具有很有趣的性质:把它们个位数字和十位数字对调,其乘积不变,即13*62=31*26。 编程序求共有多少对这种性质的两位数(个位与十位相同的不在此列,如11、22,重复出现的不在此列,如 13*62 与62*13)。 + +16. 一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如,6 的因子为1、2、3,而6=1+2+3,因此6 是“完数”。编程序找出1000 之内的所有完数,并按下面格式输出其因子: + 6 its factors are 1,2,3 + +17. 有一个四位正整数,组成这个四位数的四个数字各不相同,如果把它们的首尾互换,第二位与第三位互换,组成一个新的四位数。原四位数为新四位数的4 倍,请找出一个这样的四位数。 + +18. 给出一个不多于4 位的正整数,要求:① 求出它是几位数 ② 分别打印出每一位数字 ③ 按逆序打印出各位数字。 + +19. 在一个程序中计算出给定误差小于0.1,0.01,0.001,0.0001,0.00001 时,下式的值: +![image-20241130004016370](https://yp.smallkun.cn/markdown/image-20241130004016370.png!compress) +提示:本题中误差指前 n+1项之积与前 n项积之差。 + +20. 用泰勒展开式求sinx 的近似值 +![image-20241130004040849](https://yp.smallkun.cn/markdown/image-20241130004040849.png!compress) + +测试数据:① x=0.3 , n=8 + ② x=0.5 , n=20 + +21. 验证歌德巴赫猜想。一个充分大的偶数(大于或等于6)可以分解为两个素数之和。试编程序,将 6 至50 之间全部偶数表示为两个素数之和。 + +22. 用牛顿迭代法求方程在 1.5 附近的根(精度为image-20241130004125210)。 +![image-20241130004157841](https://yp.smallkun.cn/markdown/image-20241130004157841.png!compress) + +23. 两个乒乓球队进行比赛,各出三人,甲队为A、B、C 三人,乙队为X、Y 、Z 三人,已知抽签决定比赛名单。有人向队员打听比赛的名单, A 说他不和 X 比,C 说他不和X、Z 比,请编程序找出三对赛手的名单。 + + + +## 四、数组 + +1. 有一个正整数数组,包含N 个元素,要求编程求出其中的素数之和以及所有素数的平均值。 + +2. 有一个数组,内放10 个整数。要求找出最小的数和它的下标,然后把它和数组中最前面的元素对换位置。 + +3. 有 N 个数已按由小到大的顺序排好,要求输入一个数, 把它插入到原有序列中,而且仍然保持有序。 + +4. 输入N 个数到数组中,输出所有大于N 个数平均值的数。 + +5. 输入N 个数到数组中,选出其中最大的数和最小的数,并分别将它们与最前面和最后面的数互换。 + +6. 用选择法对10 个整数由大到小排序。 + +7. 用筛选法求 2 到 100 之间的素数。方法如下:首先 2 是素数,凡 2 的倍数都不是素数,于是把这些数从数表中筛去, 2 以后没有被筛去的第一个数是 3, 然后把 3的倍数都从数表中筛去, 3 以后没被筛去的第一个数是 5,然后把 5 的倍数都从数表中筛去。如此下去,直到遇到某数 K(≤ N),其后没有数可筛选为止, 这时保留下的未被筛去的数就是 2 到 N 的素数。 + +8. 求一个 3×3 矩阵两条对角线上元素之和(每个元素只加一次)。 + +9. 打印如下形式的杨辉三角形 +1 +1 1 +1 2 1 +1 3 3 1 +1 4 6 4 1 +1 5 10 10 5 1 +输出前10行,从 0行开始,分别用一维数组和二维数组实现。 + +10.有一个二维数组整型数组中,每一行都有一个最大值,编程求出这些最大值以及它们的和。 + +11.把一个二维实型数组a 按照第0 列的元素进行排序(由小到大排序,用起泡法)。例如:如果a[i][0]大于a[i+1][0],则i 行与i+1 行中所有元素都要进行对换。 + +12.编程序将一个字符串的前 N 个子字符送到一个字符型数组中去, 然后再加上一个'\0'(不允许使用strcpy(str1,str2,n)函数)。 + +13.将字符数组 A 中下标为双号(0,2,4,6,8...) 的元素值传给另一个字符数组 B,然后将 B 数组的元素按逆序输出。 + +14.有一行字符,统计其中的单词个数(单词之间以空格分隔),并将每一个单词的第一个字母改为大写。 + +15.有 N 个国家名,要求按字母先后顺序排列(用起泡排序法)后输出。 + +16.有17 个人围成一圈(编号为0~16),从第 0 号的人开始从 1 报数, 凡报到 3 的倍数的人离开圈子,然后再数下去,直到最后只剩下一个人为止。 问此人原来的位置是多少号? + +17.编程产生如下形式的方阵。 +1 2 2 2 2 2 1 +3 1 2 2 2 1 4 +3 3 1 2 1 4 4 +3 3 3 1 4 4 4 +3 3 1 5 1 4 4 +3 1 5 5 5 1 4 +1 5 5 5 5 5 1 +要求:不允许使用键盘输入语句和静态赋值语句,尽量少用循环。 + +18.打印所有不超过 n( n<256)的其平方具有对称性的数(也称回文数)。 + +19.求N 个数中的最大值,最大值出现的次数,然后求出次大值(次大值一定存在)。 + +20.找出 M×N 数组中所有不相邻元素,并求出它们的和(相邻的数:前一个是偶数,后一个是素数)。 + +21.已知 100 个自然数 1~100,我们取 1, 2, 3, 4 时, 我们可将其排成一圈使每两个数之和都是素数,即→1→2→3→4→,问 1~100 内连续取 n 个数,即 1~ n(≤ 100)能满足上述要求的最大的 n 是多少? + +22.打印魔方阵。所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。 +例如:三阶魔方阵为 +8 1 6 +3 5 7 +4 9 2 + +要求打印由 1到N\* N的自然数构成的魔方阵。 +提示:魔方阵中各数的排列规律如下: +⑴ 将“1”放在第一行中间一列; +⑵ 从“2”开始直到n×n为止各数依次按下列规则存放:每一个数存放的行比前一个数的行数减1,列数加1; +⑶ 如果上一个数的行数为1,则下一个数的行数为 n(指最下一行); +⑷ 当一个数的列数为 n,下一个数的列数应为1,行数减1; +⑸ 如果按上面规则确定的位置已有数,或上一个数是第 1行第 n列时, 则把下一个数放在上一个数的下面。 + +23.统计一个单位职工的年龄,要求把相同年龄最多的那个年龄找出来(可能有几个这样的年龄),并统计出现的次数。 + +24.n×n 的拉丁方阵的每行、每列均为自然数的一个全排列, 每行(列)上均无重复数。 +如 n=5 时, 5×5 的一种拉丁方阵可以为: +1 5 2 4 3 +2 3 4 5 1 +4 1 5 3 2 +5 2 3 1 4 +3 4 1 2 5 +该数组的第一行 1,5,2,4,3 用程序自动生成,但产生的第一行不一定非得是 1,5,2,4,3,第一行填写完毕后,即以第一行作为全方阵索引, 即若第一行中的第 i 列的元素值为 j ,则 j在各行中的列号即为从第一行中元素值为 i的那一列开始读出的 n个自然数(到行末则从行头接着读),例如第一行第2列的元素值为5, 则从元素值为2的那一列(第3列)开始读出2,4,3,1,5,这就是元素5在各行中的列标号。 +测试数据:① n=5 ② n=8 + +## 五、函数 + +1.编写一函数判断某数是否素数。 + +2.编写一函数求三个整数的最大值。 + +3.打印出3 到1100 之间的全部素数(判素数由函数实现)。 + +4.写一函数,使给定的一个二维数组(3×3)转置,即行列互换。 + +5.写一函数,将两个字符串连接,即编写一strcat 函数。 + +6.写一函数,求一字符串长度,即编写一strlen 函数。 + +7.写一函数将字符数组s1 中的全部字符复制到字符数组s2 中,不用strcpy 函数。 + +8.写一函数判断某数是否“水仙花数”,所谓“水仙花数”是指一个三位数, 其各位数字立方和等于该数本身。 + +9.在主函数内任意输入一个5×6 矩阵,编写一函数求出每一行的和放到一个一维数组中,输出此矩阵及其每一行的和。 + +10.写一主函数输入一数组,写一子函数实现对该数组的冒泡排序并输出。 + +11.任意输入20 个正整数,找出其中的素数,并将这些素数按由小到大排序。要求:判断一 +个数是否为素数用函数实现;排序用函数实现。 + +12.编写计算m 的n 次方的递归函数。 + +13.编一个程序,读入具有5 个元素的整型数组,然后调用一个函数,递归计算这些元素的积。 + +14.编一个程序,读入具有5 个元素的实型数组,然后调用一个函数,递归地找出其中的最大元素,并指出它位置。 + +## 六、指针 + +1、 输入三个整数,按由小到大的顺序输出。 + +```c +#include +//定义一个函数 传入两个整型指针 交换 两个指针所指向的值 +void swap(int *x, int *y){ + int temp; + temp = *x; + *x = *y; + *y = temp; +} + +int main(void){ + int a, b, c; + printf("请输入三个数字(以空格间隔):"); + scanf("%d %d %d", &a, &b, &c); + //由小到大 升序 + if(a > b){//b为 a、b两个变量中 最大值 + swap(&a, &b); + } + if(b > c){//c 为 a、b、c中最大值 + swap(&b, &c); + } + if(a > b){//b为 a、b两个变量中 最大值 + swap(&a, &b); + } + printf("%d %d %d\n", a, b, c); + return 0; +} +``` + + + +2、 输入10 个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。写三个函数:①输入10 个数;②进行处理;③输出10 个数。 + +```c +#include +void swap(int *x, int *y){ + int temp; + temp = *x; + *x = *y; + *y = temp; +} +//输入数组元素 +void input(int *arr, int n){ + int i; + for(i=0;i *max){ + max = arr+i; + } + if(*(arr+i) < *min){ + min = arr+i; + } + } + //如果最大值的地址为数组的首地址 则最小值和首地址交换后 最大值地址为最小值地址 + if(max == arr){ + max = min; + } + swap(min, arr);//最小值和数组首元素交换 + swap(max, arr+9);//最大值和数组最后一个元素交换 +} +//输出数组元素 +void output(int *arr, int n){ + int i; + for(i=0;i +#include + +void move(int *arr, int n){ + int i, temp; + temp = *(arr+n-1); + //1 2 3 4 5 + // 1 2 3 4 + for(i=n-1;i>0;i--){ + arr[i] = arr[i-1]; + } + arr[0] = temp; +} + +void output(int *arr, int n){ + int i; + for(i=0;i + +int getStrLen(char *str){ + int n=0; + while(*str != '\0'){ + str++; + n++; + } + return n; +} + +int main(void){ + + char str[100]; + gets(str); + + printf("len=%d\n", getStrLen(str)); + + return 0; +} +``` + + + +5、 写一函数,将一个3×3 的矩阵转置。 + +```c +#include + +void revse(int (*num)[3]){ + int *start, *end; + int temp; + start = *num;//第一个数组的首个元素地址 + end = *(num+2)+2;//第三个数组的最后一个元素地址 + + while(start < end){ + temp = *start; + *start = *end; + *end = temp; + start++; + end--; + } +} + + +int main(void){ + + int num[3][3]; + int i, j; + for(i=0;i<3;i++){ + for(j=0;j<3;j++){ + scanf("%d", *(num+i)+j); + } + } + printf("\n"); + + revse(num); + + + for(i=0;i<3;i++){ + for(j=0;j<3;j++){ + printf("%d ", *(*(num+i)+j)); + } + printf("\n"); + } + + return 0; +} +``` + + + +6、 在主函数中输入10 个等长的字符串。用另一函数对它们排序。然后在主函数输出这10 个已排好序的字符串。 + +```c +#include +#include + +/* +strcmp(字符串1, 字符串2); 比较两个字符串的大小 大于返回1 小于返回-1 等于返回0 +strcpy(字符串1, 字符串2); 复制两个字符串 字符串2->字符串1 +*/ +void sort(char (*strs)[100]){ + int i, j; + char temp[100]; + for(i=0;i<10-1;i++){ + for(j=0;j<10-i-1;j++){ + if(strcmp(strs[j],strs[j+1]) > 0){ + strcpy(temp ,strs[j]); + strcpy(strs[j], strs[j+1]); + strcpy(strs[j+1], temp); + } + } + } +} + +int main(void){ + char strs[10][100]; + int i; + + for(i=0;i<10;i++){ + gets(*(strs+i)); + } + sort(strs); + printf("\n"); + for(i=0;i<10;i++){ + puts(*(strs + i)); + } + + + return 0; +} +``` + + + +7、 编一程序,打入月份号,输出该月的英文月名。例如,输入"3",则输出"March",要求用指针数组处理。 +1: January, 2: February, 3: March, 4: April, 5: May, 6: June, 7: July, 8: August, 9: September, 10: October, 11: November, 12: December + +```c +#include +#include + +int main(void){ + + //存着地址的数组 存储字符串的首地址的数组 + char *month[12] = {"January", "February", "March", "April", + "May", "June", "July", "August", "September", "October", + "November", "December"}; + int num; + + printf("请输入月份数字形式:"); + scanf("%d", &num); + printf("%s\n", *(month+num-1)); + + return 0; +} +``` + +8、 写一函数完成查找串s2 在串s1 中第一次出现的位置。 + +```c +#include +#include + +int instr(char *dest, char *substr){ + int i=0, j; + while(*(dest+i) != '\0'){ + j=0;//对子串匹配从首个开始 + while(*(substr+j)!='\0' && *(dest+i) == *(substr+j)){ + i++; + j++; + }//暴力查找主串中和子串相等的字符 到子串结尾或遇到不相同元素时退出循环 + if(j==0){//当前主串中没有和子串首元素相同的元素时 主串下标后移 + i++; + } + //匹配到子串结尾标记时代表找到首个子串 + if(*(substr+j) == '\0'){ + return i-strlen(substr)+1; + } + } + return -1;//没有找到子串 +} + +int main(void){ + char str[100]; + char substr[100]; + + gets(str); + gets(substr); + printf("%d\n", instr(str, substr)); + + + return 0; +} +``` + +9、 写一函数完成将无符号十进制整数转换成十六进制字符表示并存于字符串数组中。 + +```c +#include + +void decimalToHex(int dec, char *hex){ + int i, j, temp, count=0; + //i, j, temp 用来数组倒置 + //count 用来统计元素的个数 + while(dec){ + //模除十进制数字得余数后判断是否为数字 如果为 使用'0'加上该数之后存储为字符 + if(dec%16 < 10){ + *(hex+count++) = dec%16 + 48; + }else{ + //得到A~F时,使用大写字符ASCALL值将其转换为字符 + *(hex+count++) = dec%16-10 + 65; + } + dec /= 16; + } + //数组元素的倒置 + i = 0; + j = count - 1; + while(i < j){ + temp = *(hex + i); + *(hex + i) = *(hex + j); + *(hex + j) = temp; + i++; + j--; + } + *(hex+count) = '\0';//标记结束符 +} + +int main(void){ + int dec;//用来存储需要转换的十进制数字 + char hex[1000];//用来存储转换后的数字的 + printf("请输入一个数字:"); + scanf("%d", &dec); + + decimalToHex(dec, hex); + puts(hex); + + return 0; +} +``` + +10、 用指向指针的指针的方法对N 个整数排序并输出。要求排序单独写成一个函数。N 个整数和N 在主程序中输入,最后在主函数中输出。 + +```c +#include + +void sort(int (*arr)[10]){ + int i, j, temp; + for(i=0;i<10-1;i++){ + for(j=0;j<10-1-i;j++){ + if((*arr)[j]> (*arr)[j+1]){ + temp = (*arr)[j]; + (*arr)[j] = (*arr)[j+1]; + (*arr)[j+1] = temp; + } + } + } +} + +int main(){ + + //指针->数组 int (*变量名)[数组的元素个数] + //数组指针 指向数组的指针 + int num[10]; + int i; + + printf("请输入10个整数:"); + for(i = 0;i<10;i++){ + scanf("%d", num+i); + } + + sort(&num); + for(i = 0;i<10;i++){ + printf("%d ", num[i]); + } + printf("\n"); + + return 0; +} +``` + + + +## 七、结构体与共用体 + +1.定义一个结构体其中包括: 职工号、职工名、性别、年龄、工资、地址。按结构体类型定义一个结构体数组, 从键盘输入每个结构体元素所需的数据,然后逐个输出这些元素的数据(可设数组只有三个元素)。 + +2.有一批图书,每本书有:书名(name),作者(author) , 编号(num),出版日期(date)四个数据,希望输入后按书名的字母顺序将各书的记录排列好,供以后查询。今输入一本书的书名,如果查询到库中有此书,打印出此书的书名,作者,编号和出版日期。如果查不到此书,则打印出“无此书”。 + +3.13 个人围成一圈,从第一个人开始顺序报号1、2、3。 凡报到“3”者退出圈子。找出最后留在圈子里的人原来的序号。 + +4.编写一个程序,输入n 个(少于10 个)学生的姓名、性别、 成绩、出生年月日及入学年月日,输出成绩在80 分以上的学生的姓名、性别、成绩、出生和入学的年份。 + +5.将上题改为“输出成绩在80 分以上的18 岁以下的女生的姓名、成绩、出生和入学的年份”,试编写程序实现之。 + +6.有10 个学生,每个学生的数据包括学号、姓名、三门课的成绩,从键盘输入10 个学生数据,要求打印出三门课总平均成绩,以及最高分的学生的数据(包括学号、 姓名、三门课成绩、平均分数)。 + +7.设链表中每个结点包括学号、成绩、和指针三个字段, 试编程序打印出链表中第1,3,5,7...结点。 + +8.设链表中每个结点包括学号、成绩、和指针三个字段, 试编程序将大于平均成绩的各个结点打印出来。 + +9.设链表中每个结点包括学号、成绩、和指针三个字段, 试编程序将成绩最高的结点作为链表的第一个结点,成绩最低的结点作为尾结点。 + +10.建立一个链表,每个结点包括:学号、姓名、性别、年龄。输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,则将此结点删去。 + +## 八、文件 + +1.将10 个整数写入数据文件f3.dat 中,再读出f3.dat 中的数据并求其和。 + +2.一个以%5d 格式存放20 个整数的文件f4.dat,顺序号定为0~19。输入某一顺序号之后,读出相应的数据并显示在屏幕上。 + +3.将10 名职工的数据从键盘输入, 然后送入磁盘文件worker1. rec 中保存。设职工数据包括:职工号、职工名、性别、年龄、工资,再从磁盘调入这些数据,依次打印出来(用 fread 和fwrite 函数)。 + +4.将存放在worker1.rec 中的职工数据按工资高低排序,将排好序的各记录存放在worker2.rec 中(用 fread 和fwrite 函数)。 + +5.用scanf 函数从键盘读入 5 个学生数据(包括:学生名、学号、三门课程的分数),然后求出平均分数。用 fprintf 函数输出所有信息到磁盘文件stud.rec 中,再用fscanf 函数从 stud.rec 中读入这些数据并在显示屏上显示出来。 + +6.在文件 worker2.rec 中插入一个新职工的数据,并使插入后仍保持原来的顺序(按工资高低顺序插入到原有文件中),然后写入worker3.rec 中。 + +7.删除worker2.rec 中某个序号的职工记录,再存入原文件中(用fread 和fwrite 函数)。 + +8.有两个磁盘文件,各自存放已排好序的若干个字符(如a1. dat 中放"abort", a2.dat中放 "boy")要求将两个文件合并,合并后仍保持有序,存放在a3.dat 文件中。 +提示:可先将两个文件中的字符存入一个字符型数组中,而后对数组重新排序,再将该数组写入a3.dat文件中。 +如果不引入一个中间数组进行重新排序,该如何编程? + +## 附加题 + +1.编程序求 5X+2Y+Z=50 的所有非负整数解。 + +2.有一长度不大于40 的字符串,已知其中包含两个字符“A”,求处于这两个字符“A”中间的字符个数,并把这些字符依次打印出来。 + +3.把25 个字母A、B 、C、··· 、X、Y 按如下要求打印出来:从最中间的字母M开始打印,然后一左一右依次打印出其它字母,即M,L,N,K,O,...。要求:初始化时按字母表顺序赋值。 + +4.编一个程序,把一批非零整数中的偶数、奇数的平均值分别计算出来。用零作为终止标记。 + +5.某单位排队形,开始排成3 路纵队,末尾多出了2 人。后改成5 路纵队,末尾又多出了3 人,最后改成7 路纵队,正好没有余数。编程序求出该单位至少有多少人。 + +6.将一个6×6 数组的第一行、第六行、主对角线和副对角线上的元素都存入1,其余的元素都存入-1。请编程序实现。 +要求:1)不许对数组初始化。 + 2)尽量少用循环。 + +7.个位数是6,且能被3 整除的五位数共有多少个。 + +8.求100 至200 之间能同时被6 和8 整除的数,把这些数打印出来,并且打印这些数的和。 + +9.雨淋湿了一道算术题,9 个数字现在只能认清4 个(第一个数字虽模糊不清但肯定不是1): +image-20241130010005134 +请编程序找出那些看不清的数字。 + +10.编程序计算下述函数在X=-7,-1,0,7 时的值。 + +11.判断一个给定的5×5 方阵是否以第3 列为轴线对称? + +12.编写一个函数JOIN,让它实现字符串连接运算功能。 + +13.编写函数IND,让它判断一个字符串是否为另一个字符串的子串的功能,若是则返回第一次出现的起始位置,否则返回0。 + +14.编写一个函数,由参数传来一个字符串,分别求出此字符串中字母、数字和其它字符(不包括空格)的个数,输入和输出均由主函数实现。 + +15.已知某年不是闰年,给定该年某一天的月份和日期,求这一天是该年的第几天。 + +16.找规律,编程序打印6×6 的矩阵: +1 2 3 5 8 13 +1 4 9 17 30 51 +1 6 19 45 92 173 +. . . + +17.有人说在400,401,402,...499 这些数中4 这个数字共出现112 次,请编程序判定这种说法是否正确。若正确请打印出'YES',否则打印出'NO'及4 的出现次数。 + +18.设有8×8 的二维数组a,其中每个元素取值如下: +当 i=j 时 a\[i\]\[j\]=M (M 是你的学号) +当 ij 时 a\[i\]\[j\]=i×j +编程序求所有的数组元素之和。 + +19.找3 个数字,填在下面式子中,使等式成立。 +image-20241130010139383 +① 若答案有多个,则打印一组即可; +② 若无满足条件的数字,则显示'NO DIGITALS'。 + +20.某航空公司规定:在旅游旺季7─9 月份,若订票超过20 张,优惠票价的15%,20 张以下,优惠5%;在旅游淡季1─5 月、10 月、11 月份订票超过20 张,优惠30%,20 张以下,优惠20%;其余月份不优惠。请编程序能根据月份和旅客订票张数决定优惠率。 + +21.请编程序按如下格式打印一个直角三角形的九九乘法表: +1 2 3 4 5 6 7 8 9 +4 6 8 10 12 14 16 18 +9 12 15 18 21 24 27 +16 20 24 28 32 36 +25 30 35 40 45 +36 42 48 54 +49 56 63 +64 72 +81 + +22.有一批实数,用零作终止标记。请编程序找出这批数中的最大值及最小值,并输出该最大值数是这批数中的第几个数(若最大值数多次出现,只打印出第一个的位置)。 + +23.有10 个两位整数,把这些数作以下变化,如果它是素数,则把它乘以2,若它是偶数则除以2,其余的数减1,请将变化后的10 个数按从小到大的次序打印出来。 + +24.已知有N 个无规律的正整数,请编程序求出其中的素数并打印出能被5 整除的数之积。 + +25.把一个偶数位的数从当中分开成为两个数,这两个数的和的平方等于原数。如(8+1)2=81,(20+25)2=2025。求10 至9999 之间满足这样条件的数是哪些? 共有多少个? + +26.已知有9 个数,请求出这些数中的最大值、最小值及平均值,以及有多少个数等于平均值? + +27.求二维数组中每行元素的平均值,不许引入其它的数组。 + +28.编程序计算函数 +image-20241130010348202 +的值。要求先将X 的各项系数先输入到数组B 中,然后再用循环结构求P(X)的值。 + +29.猜号码∶由随机函数产生一个1 至1000 之间的整数,让人猜之。计算机仅回答人猜的数大、小还是相等,当人猜对时,由计算机打印出人一共猜了几次。 + +30.编程序将一个正整数写成其它两个正整数的平方和,若不能成立时输出“NO”。 +例如 +![image-20241130010437816](https://yp.smallkun.cn/markdown/image-20241130010437816.png!compress) + +31.将一个一维数组中的偶数依次交换。例如有8 个元素, 若其中第1、4、5 三元素是偶数时应按下图交换。 +image-20241130010458976 + +32.编程序将一个6×6 的二维数组左下三角部分全赋值为-1,右上三角全赋值为1,主对角线(行,列下标相同)上的元素送入2。把数组中的值按列对齐方式输出。 +要求: 不允许使用scanf 函数。 + +33.用随机函数求出10 组三位正整数,每组十个数,调用一函数打印出每组数,并编一函数求出每组中的最大数。 + +34.已知有三个数组A,B,C,A 为5 行5 列的二维数组,B、C 为只有5 个元素的一维数组,键盘输入数据的顺序如下: +23,45,6,1,-3,4,5,233,456,0,3,56,78,-56,5,6,77,8,89,9,3,6,8,9,90 +请编写程序,求出A 的各行之和放至数组B 的相应元素中,求出数组A 的各列之和放至数组C 的相应元素之中。程序的输出部分要按下边形式显示: +![image-20241130010557737](https://yp.smallkun.cn/markdown/image-20241130010557737.png!compress) + +35.假设a-1 和a+1 是大于10 的素数,验证image-20241130010624492 可被120 整除。编程序输入a 的值,判a-1 和a+1 是否为素数。若不是输出“NOTPRIME!”;若都是素数,再验证image-20241130010624492是否可被120 整除。 + +36.有n 个整数,编程序将前面的各个数依次向后移动k 个位置,最后k 个数移到最前边的k 个位置(见下图,其中n=8,k=3)。 +image-20241130010716416 +思考: 程序中不许引入其它数组。 + +37.将一个数M 分解为质因数(M≠0)。 + +38.将一个整数(最多是10 位数)从低位到高位打印出来,如该数是12345 时,输出应是54321(只占一行)。 + +39.写一个函数比较两个字符串,如果s1=s2,则返回值0;如果s1>s2,则返回值1;如果s1k, n=>m; +3)若m<5,转第5 步,否则执行第4 步; +4)m/5(取整)=>m, k+m=>k, 转第3 步; +5)输出k(n!末尾零的个数)。 + +41.分别输入N 和M 个数到数组A 和数组B 中。把只在其中一个数组中出现的那些数送入到数组C 中,并指出它们在A 或B 数组中的位置。 + +42.用记录来描述一个学生的成绩情况,内容包括:姓名、学号、数学成绩和PASCAL成绩。要求对一个小组的10 个学生的成绩进行统计处理: +1)计算学生的总平均分,并按平均分高低排出名次,打印出姓名。 +2)打印出90 分以上和不及格者的名字。 +要求用子程序来完成。 + +43.已知M1 是3×5 的矩阵, M2 是5×2 的矩阵, 编程序求出M1 与M2 之积。 + +44.百马百瓦问题。有100 匹马,100 块瓦,大马驮3 块,小马驮2 块,两个马驹驮1块。问大马、小马、马驹各多少? +要求:① 不许用for 循环; ② 循环次数尽量少。 + +45.找规律填写N×N 方阵。如N=8 时, 其方阵为: +image-20241130011036567 + +46.插入排序。许多玩牌的人是以这样的方式来对他们手中的牌进行排序的:设手中原有3张牌已排好序,抓1 张新牌,若这张新牌的次序在原来的第2 张牌之后,第3 张牌之前,那么就把这张新牌放在第3 张牌的位置上,原来的第3 张改为第4 张, 然后再抓新牌。按着这个算法,编写一个排序程序。 +注:开始一张牌也没有,从第一张牌开始抓起。 + +47.求N 阶方阵(即N×N 数组)中各条反斜线上的元素之和。如4×4 数组共有7 条反斜线: +![image-20241130011108944](https://yp.smallkun.cn/markdown/image-20241130011108944.png!compress) + +48.自然数N 一般写成如下形式: +![image-20241130011124712](https://yp.smallkun.cn/markdown/image-20241130011124712.png!compress!compress) +如果image-20241130011207358>di (i=k-1,k-2,...,1),则称N 是严格降序数;如果image-20241130011207358=di (i=k-1,k-2,...,1),则称N 是等序数;此外,则称N是无序数。例如, 4321 是严格降序数,1234 是严格升序数,2222 是等序数,1243 是无序数。从键盘上输入一个大于9 的整数N,判它属于上述哪一类。 + +49.用简单迭代法解方程 image-20241130011311960它有两个根(如图),其迭代公式为: +![image-20241130011327616](https://yp.smallkun.cn/markdown/image-20241130011327616.png!compress!compress) +注:本程序中选取初值image-20241130011341115 不同时,要分别使用公式1 或公式2 迭代,得原方程<0 或>0 +的解。(公式由来略) + +50.洗扑克牌。将54 张牌分别编号为1,2,…,54 号,并放在数组M 中。洗牌方法如下:产生[1,54]区间内的一个随机数K,将M[1]与M[K]交换;然后产生[2,54]之间的随机整数K,让M[2]与M[K]交换;…,直到剩下最后一张牌为止。请编写实现上述洗牌的程序。 + +51.有N 张牌,计算机和你轮流取牌,每次只能取 1─2 张,谁最后取完谁胜利。编写完成此功能的程序。 +要求: +1)让计算机先取。 +2)你取的张数由键盘输入。 +3)计算机第一次取牌时由键盘输入来确定是取1 还是取2,以后它再取牌时由程序 +判断来决定取几张牌。 + +52.已知A 是有30 个元素的整型数组,编写一个对A[I1]到A[I2](I1≤I2)之间的元素排序的函数(从大到小排序)。请调用上述函数先将A[5]至A[20]之间的元素排序,然后将A中的所有元素值输出。再调用上述函数对A[15]至A[30]之间的元素排序,最后再将A 中30 个元素值输出。 +要求:1) 输入输出均由主函数实现。 + 2)输出时每10 个元素占1 行。 + +53.编程序求3 至39 之间满足下列条件的各组素数:每组有3 个素数,第2 个比第一个大2,第3 个比第2 个大4。例如 5,7,11 就是满足条件的一组。 +要求:1) 不许使用数组。 + 2)打印满足条件的各组素数。 + 3)求出满足条件的素数共有多少组。 + +54.已知N 是正整数, 它可拆写成三个正整数N1、N2和N3 之和的形式N=N1+N2+N3。请编程序打印出满足上式的全部组合,并当N1、N2 和N3 中至少有两个是素数时打印“YES”否则打印“NO”。 +image-20241130011603125 + +55.编写程序,按照 1,2, ... , 28 的顺序填一个7×7 数组的左上角,程序的输出结果为: +![image-20241130011618828](https://yp.smallkun.cn/markdown/image-20241130011618828.png!compress) + +56.二维数组排序。设有4×5 的数组M,通过排序使M\[1\]\[1\]≤M\[1\]\[2\]≤...≤M\[1\]\[5\]≤M\[2\]\[1\]≤M\[2\]\[2\]≤...≤M\[2\]\[5\]≤...≤M\[4\]\[1\]≤M\[4\]\[2\]≤...≤M\[4\]\[5\]。排序时不允许引入其它数组。 + +57.编写将一个十进制数M 转化成N 进制数(2≤N≤16)的程序。提示:转化成N 进制数的各位数可以分别放在数组的各个元素中。 +注意:进制N 超过10 时, 用A 表示10,B 表示11,…,F 表示15。 + +58.在主函数中输入10 个不等长的字符串,用另一函数对它们排序。然后在主函数中输出这10 个已排好序的字符串,用指针数组完成。 + +59.建立一个链表,每个结点包括:学号、姓名、性别、年龄。输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,将此结点删除,输出最后的链表。 + +60.有两个链表a和b。设结点中包含学号、姓名。从a链表中删除与b链表中有相同学号的那些结点。 diff --git a/寒假作业/MySQL寒假作业(一).md b/寒假作业/MySQL寒假作业(一).md new file mode 100644 index 0000000..d398a47 --- /dev/null +++ b/寒假作业/MySQL寒假作业(一).md @@ -0,0 +1,134 @@ +## MySQL数据库基础 + +### 创建数据库和表 + +创建数据库BookDB。为数据库创建两张表:图书类型表BookType和图书信息表Book,并添加相应约束。见表上机2.1、表上机2.2。 + +表上机2.1 BookType图书类型表 + +![image-20250112210139901](https://yp.smallkun.cn/markdown/image-20250112210139901.png!compress) + +表上机2.2 Book图书信息表 + +![image-20250112210152226](https://yp.smallkun.cn/markdown/image-20250112210152226.png!compress) + +### 表的数据操作 + +向数据库中的BookType和Book表插入数据,效果如图上机2.4和图上机2.5所示。由于录入数据出现错误,现在需要如下的修改:将《杜拉拉升职记》的发布时间改为“2010-07-2”。 + + +图上机2.4 BookType表的数据 + +![image-20250112210640058](https://yp.smallkun.cn/markdown/image-20250112210640058.png!compress) + +图上机2.5 Book表的数据 + +![image-20250112210716052](https://yp.smallkun.cn/markdown/image-20250112210716052.png!compress) + +**删除图书信息** + +由于业务的需要,发布时间在2010年以前的不再出售,需要全部清理。 + +**删除图书类型** + +由于业务变化,图书馆不再需要文学类的图书,现要求删除类型文学类产,并将对应的图书一并删除。 + +## MySQL查询 + +### 使用内连接显示图书详细信息 + +使用内连接,查询出图书编号、图书名、作者、出版时间、图书类别名称、图书备注,查询结果如图上机3.1所示。 + +图上机3.1 图书详细信息 + +![image-20250112211152271](https://yp.smallkun.cn/markdown/image-20250112211152271.png!compress) + +### 使用子查询显示计算机类的图书详细信息 + +先使用内连接,查询出图书编号、图书名、作者、出版时间、图书类别名称、图书备注等信息;然后根据计算机类的图书类别编号,筛选出计算机类的图书,查询结果如图上机3.2所示。 + +图上机3.2 计算机类的图书详细信息 + +![image-20250112211214148](https://yp.smallkun.cn/markdown/image-20250112211214148.png!compress) + +### 使用集合显示图书编号为2和3的图书信息 + +根据客户要求,现在需要查看图书编号为2和3的图书名称和作者,查询结果如图上机3.3所示。 + +图上机3.3 指定图书信息 + +![image-20250112211300007](https://yp.smallkun.cn/markdown/image-20250112211300007.png!compress) + +### 数据的高级查询 + +查询出类型为文学类的所有图书。查询出李可所有发布时间大于2010年1月1日的小说书集。查询出所有的文学书和计算机书并追加备注说明是翻新书。 + +## 存储过程 + +### 创建存储过程完成图书添加 + +创建存储过程,完成对上机2中book表的数据添加。 + +传入图书相关信息后,执行INSERT 语句将值插入的表中,并自动生成主键值 + +### 创建存储过程完成图书修改 + +创建存储过程,完成对上机2中book表的数据修改。 + +传入图书相关信息,实现对指定编号的图书进行修改 + +### 创建存储过程完成图书删除 + +创建存储过程,根据图书名称将图书信息删除。 + +传入图书编号,实现对指定编号的图书进行删除 + +## 视图 + +### 查询book表数据 + +为上机2中book表建立视图,查询book表中所有数据,视图名为v_book。 + +### 根据条件查询book表数据 + +在上一题的基础上,传入查询条件进行查询,例如查询指定指定作者、类型的图书 + +## 触发器 + +### 记录添加总字符数 + +首先建立两个单域的表格。一个表格中为姓名列表(表格名:data),另一个表格中是所插入字符的字符数(表格名:chars)。希望在data表格中定义一个触发器,每次在其中插入一个新姓名时,chars表格中运行的总数就会根据新插入记录的字符数目进行自动更新。 + +分析:要记录总共插入了的多少字符,先要得到每次插入的字符数和原字符数。 + +### 记录数据的插入和更新时间 + +记录表category中数据的插入和更新时间。category表的内容如下:编号、名称、创建时间、修改时间。 + +分析:创建两个触发器,一个管理添加,一个管理修改。 + +(1) 创建表catagory。 + +(2) 创建触发器create_time用于记录用户往catagory表插入数据的时间 + +(3) 创建触发器update_time用于记录用户更新catagory表数据的时间 + +### 修改记录时,检查是否备注,没有自动添加当前时间 + +book表修改记录时,检查在修改时是否有备注,如果没有自动添加当前时间为备注。 + +## 存储函数 + +### 使用函数根据用户传入的类型名称和类型备注获取刚插入的类型编号 + +使用函数根据用户传入的类型名称和类型备注。该函数包含类型名称和类型备注2个输入参数,类型编号为函数的返回值,函数名命名为AddType + +分析:在函数中根据用户传入的类型名称和类型备注进行插入数据。再通过系统函数得到最后插入的id值将其返回。最后调用函数,测试函数是否正确。 + +### 使用函数根据用户传入图书信息获取刚插入的图书编号 + +创建一个函数实现图书作者的显示。该函数有一个输入参数,根据用户传入的图书名字,可以返回查询到图书作者信息。 + +### 使用函数根据用户传入图书名称,查询图书的作者信息 + +图书管理员想要得到刚刚插入的图书编号。现要求系统实现一个图书添加的功能:使用函数,根据用户传入的图书名称、作者、出版日期、类型编号、图书备注,得到现在最新的图书id 下面创建函数来实现该查询功能。 \ No newline at end of file diff --git a/课件/C语言/C语言标准库函数.md b/课件/C语言/C语言标准库函数.md new file mode 100644 index 0000000..ddf328b --- /dev/null +++ b/课件/C语言/C语言标准库函数.md @@ -0,0 +1,114 @@ +### **一、标准输入输出函数**(``) + +| 函数 | 功能 | 示例 | +| --------- | -------------------- | ------------------------------------ | +| `printf` | 格式化输出 | `printf("Hello, %s!\n", "World");` | +| `scanf` | 格式化输入 | `scanf("%d", &num);` | +| `putchar` | 输出单个字符 | `putchar('A');` | +| `getchar` | 输入单个字符 | `char c = getchar();` | +| `puts` | 输出字符串并换行 | `puts("Hello World!");` | +| `gets` | 读取一行字符串 | `char str[100]; gets(str);` | +| `fopen` | 打开文件 | `FILE *fp = fopen("test.txt", "r");` | +| `fclose` | 关闭文件 | `fclose(fp);` | +| `fread` | 从文件读取数据 | `fread(buffer, 1, size, fp);` | +| `fwrite` | 向文件写入数据 | `fwrite(data, 1, size, fp);` | +| `fprintf` | 格式化写入文件 | `fprintf(fp, "Value: %d\n", value);` | +| `fscanf` | 格式化从文件读取数据 | `fscanf(fp, "%d", &value);` | + +------ + +### **二、字符串处理函数**(``) + +| 函数 | 功能 | 示例 | +| --------- | ------------------------ | --------------------------------- | +| `strlen` | 计算字符串长度 | `size_t len = strlen("Hello");` | +| `strcpy` | 复制字符串 | `strcpy(dest, src);` | +| `strncpy` | 复制指定长度字符串 | `strncpy(dest, src, 5);` | +| `strcat` | 拼接字符串 | `strcat(dest, src);` | +| `strncat` | 拼接指定长度字符串 | `strncat(dest, src, 5);` | +| `strcmp` | 比较两个字符串 | `strcmp(str1, str2);` | +| `strncmp` | 比较指定长度的字符串 | `strncmp(str1, str2, 5);` | +| `strchr` | 查找字符在字符串中的位置 | `char *p = strchr(str, 'a');` | +| `strstr` | 查找子串 | `char *p = strstr(str, "test");` | +| `strtok` | 分割字符串 | `char *token = strtok(str, ",");` | + +------ + +### **三、数学函数**(``) + +| 函数 | 功能 | 示例 | +| ------- | ---------------- | --------------------------------------- | +| `abs` | 计算整数绝对值 | `int value = abs(-10);` | +| `fabs` | 计算浮点数绝对值 | `double value = fabs(-3.14);` | +| `pow` | 计算幂 | `double result = pow(2.0, 3.0); // 2^3` | +| `sqrt` | 计算平方根 | `double result = sqrt(9.0);` | +| `ceil` | 向上取整 | `double result = ceil(3.14); // 4.0` | +| `floor` | 向下取整 | `double result = floor(3.14); // 3.0` | +| `round` | 四舍五入 | `double result = round(3.5); // 4.0` | +| `sin` | 计算正弦值 | `double result = sin(M_PI / 2); // 1.0` | +| `cos` | 计算余弦值 | `double result = cos(0); // 1.0` | +| `tan` | 计算正切值 | `double result = tan(M_PI / 4); // 1.0` | + +------ + +### **四、内存操作函数**(``) + +| 函数 | 功能 | 示例 | +| --------- | ------------ | ------------------------------------ | +| `memset` | 设置内存的值 | `memset(buffer, 0, sizeof(buffer));` | +| `memcpy` | 内存拷贝 | `memcpy(dest, src, n);` | +| `memcmp` | 比较内存区域 | `memcmp(ptr1, ptr2, n);` | +| `memmove` | 内存区域移动 | `memmove(dest, src, n);` | + +------ + +### **五、动态内存管理函数**(``) + +| 函数 | 功能 | 示例 | +| --------- | -------------------- | ------------------------------------------- | +| `malloc` | 动态分配内存 | `int *p = (int *)malloc(10 * sizeof(int));` | +| `calloc` | 动态分配并初始化内存 | `int *p = (int *)calloc(10, sizeof(int));` | +| `realloc` | 重新分配内存大小 | `p = (int *)realloc(p, 20 * sizeof(int));` | +| `free` | 释放动态分配的内存 | `free(p);` | + +------ + +### **六、时间与日期函数**(``) + +| 函数 | 功能 | 示例 | +| ----------- | ------------------ | ---------------------------------------- | +| `time` | 获取当前时间戳 | `time_t t = time(NULL);` | +| `clock` | 获取程序运行时间 | `clock_t c = clock();` | +| `difftime` | 计算时间差 | `double diff = difftime(t1, t2);` | +| `localtime` | 转换为本地时间结构 | `struct tm *lt = localtime(&t);` | +| `strftime` | 格式化时间为字符串 | `strftime(buffer, 100, "%Y-%m-%d", lt);` | + +------ + +### **七、随机数函数**(``) + +| 函数 | 功能 | 示例 | +| ------- | -------------- | ------------------------------ | +| `rand` | 生成随机数 | `int r = rand();` | +| `srand` | 设置随机数种子 | `srand((unsigned)time(NULL));` | + +------ + +### **八、进程控制函数**(``) + +| 函数 | 功能 | 示例 | +| -------- | ------------ | ---------------- | +| `exit` | 退出程序 | `exit(0);` | +| `system` | 执行系统命令 | `system("dir");` | + +------ + +### **九、其他常用函数** + +| 函数 | 功能 | 示例 | +| ---------------- | -------------- | ----------------------------------------- | +| `atoi` | 字符串转整数 | `int num = atoi("123");` | +| `atof` | 字符串转浮点数 | `double num = atof("3.14");` | +| `itoa`(非标准) | 整数转字符串 | `itoa(123, buffer, 10);` | +| `qsort` | 快速排序 | `qsort(arr, n, sizeof(int), cmp);` | +| `bsearch` | 二分查找 | `bsearch(key, arr, n, sizeof(int), cmp);` | \ No newline at end of file diff --git a/课件/C语言/C语言考点.png b/课件/C语言/C语言考点.png new file mode 100644 index 0000000..b725372 Binary files /dev/null and b/课件/C语言/C语言考点.png differ diff --git a/课件/C语言/C语言连接MySQL/VC2010连接MySQL配置.md b/课件/C语言/C语言连接MySQL/VC2010连接MySQL配置.md new file mode 100644 index 0000000..a4edac3 --- /dev/null +++ b/课件/C语言/C语言连接MySQL/VC2010连接MySQL配置.md @@ -0,0 +1,115 @@ +### 1.创建项目 + +image-20241222165137489 + +创建项目时选择空项目 + +### 2.配置输出控制台 + +image-20241222165231278 + +右键项目名称选择`属性` + +配置属性->链接器->系统->子系统设置为`控制台 (/SUBSYSTEM:CONSOLE)` + +image-20241222165309647 + +### 3.安装连接软件 + +- 64位编译器选择**Windows (x86, 64-bit), ZIP Archive**(mysql-connector-c-6.1.11-winx64.zip) +- 32位编译器选择**Windows (x86, 32-bit), ZIP Archive**(mysql-connector-c-6.1.11-win32.zip) + +https://downloads.mysql.com/archives/c-c/?version=6.1.11&os=src + +![image-20240518184737189](https://yp.smallkun.cn/markdown/image-20240518184737189.png!compress!compress) + +安装完后会在C:\Program Files (x86)\MySQL\MySQL Connector C 6.1目录下 + +### 4.配置头文件和lib文件 + +**配置头文件路径** + +C:\Program Files (x86)\MySQL\MySQL Connector C 6.1\include + +右键项目名称点击属性 找到 配置属性下的VC++目录 将上述路径加入到`包含目录`下 + + + +image-20241222170322231 + +点击最右侧下拉框后点击编辑 + +![image-20241222170447324](https://yp.smallkun.cn/markdown/image-20241222170447324.png!compress) + +**配置lib文件路径** + +C:\Program Files (x86)\MySQL\MySQL Connector C 6.1\lib + +右键项目名称点击属性 找到 配置属性->链接器->常规 将上述路径加入到`附加库目录`下 + +image-20241222170720851 + +**配置附加依赖性** + +配置属性——>链接器——>输入——>附加依赖项 + +image-20241222170820644 + +在其中加入`libmysql.lib` + +image-20241222171057161 + +### 5.编写数据库连接代码 + +```c +#include +#include +#include + + +void init_conn(MYSQL* mysql) { + mysql_init(mysql); // 初始化 MySQL 连接 + if (!mysql_real_connect(mysql, "localhost", "root", "root", "user", 3306, NULL, CLIENT_IGNORE_SIGPIPE)) { + printf("连接数据库时发生错误!\n"); + printf("%s\n", mysql_error(mysql)); + }else{ + printf("连接成功!\n"); + } +} +int main(void){ + MYSQL mysql; + int ret = 0; + + init_conn(&mysql); + + return 0; +} +``` + +### 6.配置my.ini + +运行代码后会发现 + +image-20240518190612777 + +要永久地关闭 MySQL 中的 SSL 连接功能,需要进行以下步骤: + +编辑 MySQL 配置文件 my.cnf(或 my.ini),一般位于 MySQL 安装目录的 /etc 或 /etc/mysql 子目录下。 + +并添加以下配置: + +Windows下此文件路径在C:\ProgramData\MySQL\MySQL Server 5.7\my.ini + +```ini +ssl=0 +``` + +1. 保存文件并退出编辑器。 +2. 重启 MySQL 服务。 + + + +**测试连接** + +![image-20241222171136732](https://yp.smallkun.cn/markdown/image-20241222171136732.png!compress) + diff --git a/课件/C语言/C语言连接MySQL/main.c b/课件/C语言/C语言连接MySQL/main.c new file mode 100644 index 0000000..bc8e2e9 --- /dev/null +++ b/课件/C语言/C语言连接MySQL/main.c @@ -0,0 +1,40 @@ +#include +#include +#include +#include +#include "mysql_utils.h" + +/* +DBConnection *db_init(const char *host, const char *user, const char *password, const char *database, unsigned int port) + +void db_close(DBConnection *db) + +int db_common(DBConnection *db, const char *query) + +MYSQL_RES *db_query(DBConnection *db, const char *query) + +void process_result(MYSQL_RES *result) +*/ +void clearUser(DBConnection *db){ + db_common(db, "TRUNCATE users"); + printf("ճɹ!!! \n"); +} + +int addUser(DBConnection *db, char *username, char *password){ + char sql[100]; + sprintf(sql, "INSERT INTO users() VALUES(DEFAULT, \"%s\", \"%s\")", username, password); + printf("%s\n", sql); + return db_common(db, sql); +} + +int main(void){ + DBConnection *conn; + + conn = db_init("localhost", "root", "root", "user", 3306); + + //process_result(db_query(conn, "SELECT * FROM users")); + + printf("%d\n", addUser(conn, "root", "root")); + + return 0; +} \ No newline at end of file diff --git a/课件/C语言/C语言连接MySQL/mysql-connector-c-6.1.11-src.zip b/课件/C语言/C语言连接MySQL/mysql-connector-c-6.1.11-src.zip new file mode 100644 index 0000000..143a2a7 Binary files /dev/null and b/课件/C语言/C语言连接MySQL/mysql-connector-c-6.1.11-src.zip differ diff --git a/课件/C语言/C语言连接MySQL/mysql_utils.h b/课件/C语言/C语言连接MySQL/mysql_utils.h new file mode 100644 index 0000000..012f61a --- /dev/null +++ b/课件/C语言/C语言连接MySQL/mysql_utils.h @@ -0,0 +1,108 @@ +#ifndef MYSQL_H +#include +#endif + +#ifndef STDIO_H +#include +#endif + +#ifndef STDLIB_H +#include +#endif + +#ifndef STRING_H +#include +#endif + +//MySQLָ ṹȡ +typedef struct { + MYSQL *conn; +} DBConnection; + +DBConnection *db_init(const char *host, const char *user, const char *password, const char *database, unsigned int port) { + //̬ڴӵĵַ + DBConnection *db = (DBConnection *)malloc(sizeof(DBConnection)); + if (db == NULL) { + printf("ڴ\n"); + return NULL; + } + + //ӵַж̬ڴ + db->conn = mysql_init(NULL); + if (db->conn == NULL) { + printf("ʼʧ\n"); + free(db); + return NULL; + } + + //ӵַ + if (mysql_real_connect(db->conn, host, user, password, database, port, NULL, 0) == NULL) { + printf("ʧ: %s\n", mysql_error(db->conn)); + mysql_close(db->conn); + free(db); + return NULL; + } + mysql_set_character_set(db->conn, "GBK");//ַΪGBK + return db; +} + +//رӺ +void db_close(DBConnection *db) { + if (db != NULL) { + if (db->conn != NULL) { + mysql_close(db->conn); + } + free(db); + } +} + +//¡ɾ ͨú +int db_common(DBConnection *db, const char *query) { + if (mysql_query(db->conn, query)) { + printf("common query failed: %s\n", mysql_error(db->conn)); + return 0; + } + if (strncmp(query, "INSERT", 6) == 0) { + return (int)mysql_insert_id(db->conn); + } + + return (int)mysql_affected_rows(db->conn); +} + +//ѯͨú +MYSQL_RES *db_query(DBConnection *db, const char *query) { + MYSQL_RES *result; + if (mysql_query(db->conn, query)) { + printf("ѯʧ: %s\n", mysql_error(db->conn)); + return NULL; + } + + result = mysql_store_result(db->conn); + if (result == NULL) { + printf("ȡѯʧ: %s\n", mysql_error(db->conn)); + } + + return result; +} + +//ѯ +void process_result(MYSQL_RES *result) { + MYSQL_ROW row; + unsigned int num_fields; + unsigned int i; + + if (result == NULL) { + fprintf(stderr, "Result set is NULL.\n"); + return; + } + + //ȡֶ + num_fields = mysql_num_fields(result); + + while ((row = mysql_fetch_row(result))) { + for (i = 0; i < num_fields; i++) { + printf("%s\t", row[i] ? row[i] : "NULL"); + } + printf("\n"); + } +} \ No newline at end of file diff --git a/课件/C语言/vs2010问题.md b/课件/C语言/vs2010问题.md new file mode 100644 index 0000000..4a1edb6 --- /dev/null +++ b/课件/C语言/vs2010问题.md @@ -0,0 +1,3 @@ +## 解决vs2010程序运行结束后关闭 + +右键项目名称->属性->链接器->系统->子系统->设置成控制台 \ No newline at end of file diff --git a/课件/C语言/书籍/C Primer Plus 第6版 中文版.pdf b/课件/C语言/书籍/C Primer Plus 第6版 中文版.pdf new file mode 100644 index 0000000..3e43599 Binary files /dev/null and b/课件/C语言/书籍/C Primer Plus 第6版 中文版.pdf differ diff --git a/课件/C语言/书籍/C语言其实很简单 (张宁) (Z-Library).pdf b/课件/C语言/书籍/C语言其实很简单 (张宁) (Z-Library).pdf new file mode 100644 index 0000000..e0b8f7f Binary files /dev/null and b/课件/C语言/书籍/C语言其实很简单 (张宁) (Z-Library).pdf differ diff --git a/课件/C语言/书籍/[图灵程序设计丛书]C语言程序设计:现代方法(第2版)【文字版】 ([美] K. N. King) (z-lib.org).pdf b/课件/C语言/书籍/[图灵程序设计丛书]C语言程序设计:现代方法(第2版)【文字版】 ([美] K. N. King) (z-lib.org).pdf new file mode 100644 index 0000000..3c4a047 Binary files /dev/null and b/课件/C语言/书籍/[图灵程序设计丛书]C语言程序设计:现代方法(第2版)【文字版】 ([美] K. N. King) (z-lib.org).pdf differ diff --git a/课件/C语言/函数指针、指针函数、回调函数.md b/课件/C语言/函数指针、指针函数、回调函数.md new file mode 100644 index 0000000..145e5fc --- /dev/null +++ b/课件/C语言/函数指针、指针函数、回调函数.md @@ -0,0 +1,106 @@ +1. **函数指针示例**: + +```c +#include + +int add(int a, int b) { + return a + b; +} + +int main() { + // 声明函数指针 + int (*ptr_add)(int, int); + + // 将 add 函数的地址赋值给函数指针 + ptr_add = add; + + // 通过函数指针调用函数 + int result = ptr_add(5, 3); + printf("Result: %d\n", result); // 输出: Result: 8 + + return 0; +} +``` + +2. **指针函数示例**: + +```c +#include +#include + +int* allocate_array(int size) { + // 动态分配内存并返回指针 + return (int*)malloc(size * sizeof(int)); +} + +int main() { + // 调用指针函数获取动态分配的数组 + int* arr = allocate_array(5); + + // 使用动态分配的数组 + for (int i = 0; i < 5; i++) { + arr[i] = i * 2; + printf("%d ", arr[i]); + } + printf("\n"); // 输出: 0 2 4 6 8 + + // 释放动态分配的内存 + free(arr); + + return 0; +} +``` + +3. **回调函数示例**: + +```c +#include + +// 回调函数的类型定义 +typedef int (*CompareFn)(int, int); + +// 使用回调函数的排序函数 +void sort_array(int arr[], int size, CompareFn compare_fn) { + for (int i = 0; i < size - 1; i++) { + for (int j = 0; j < size - i - 1; j++) { + if (compare_fn(arr[j], arr[j+1]) > 0) { + // 使用回调函数比较元素大小 + int temp = arr[j]; + arr[j] = arr[j+1]; + arr[j+1] = temp; + } + } + } +} + +// 升序比较函数 +int compare_ascending(int a, int b) { + return a - b; +} + +// 降序比较函数 +int compare_descending(int a, int b) { + return b - a; +} + +int main() { + int numbers[] = {5, 2, 8, 1, 9}; + int size = sizeof(numbers) / sizeof(numbers[0]); + + printf("Ascending sort:\n"); + sort_array(numbers, size, compare_ascending); + for (int i = 0; i < size; i++) { + printf("%d ", numbers[i]); // 输出: 1 2 5 8 9 + } + printf("\n"); + + printf("Descending sort:\n"); + sort_array(numbers, size, compare_descending); + for (int i = 0; i < size; i++) { + printf("%d ", numbers[i]); // 输出: 9 8 5 2 1 + } + printf("\n"); + + return 0; +} +``` diff --git a/课件/C语言/指针知识点复习.pdf b/课件/C语言/指针知识点复习.pdf new file mode 100644 index 0000000..cdf9970 Binary files /dev/null and b/课件/C语言/指针知识点复习.pdf differ diff --git a/课件/C语言/课件/《C语言其实很简单》源代码.doc b/课件/C语言/课件/《C语言其实很简单》源代码.doc new file mode 100644 index 0000000..396d95f Binary files /dev/null and b/课件/C语言/课件/《C语言其实很简单》源代码.doc differ diff --git a/课件/C语言/课件/《C语言其实很简单》索引.doc b/课件/C语言/课件/《C语言其实很简单》索引.doc new file mode 100644 index 0000000..27fe9e1 Binary files /dev/null and b/课件/C语言/课件/《C语言其实很简单》索引.doc differ diff --git a/课件/C语言/课件/第10章文件.ppt b/课件/C语言/课件/第10章文件.ppt new file mode 100644 index 0000000..22cad91 Binary files /dev/null and b/课件/C语言/课件/第10章文件.ppt differ diff --git a/课件/C语言/课件/第1章概述.ppt b/课件/C语言/课件/第1章概述.ppt new file mode 100644 index 0000000..e2cf162 Binary files /dev/null and b/课件/C语言/课件/第1章概述.ppt differ diff --git a/课件/C语言/课件/第2章数据类型运算符和表达式.ppt b/课件/C语言/课件/第2章数据类型运算符和表达式.ppt new file mode 100644 index 0000000..a0d5ef4 Binary files /dev/null and b/课件/C语言/课件/第2章数据类型运算符和表达式.ppt differ diff --git a/课件/C语言/课件/第3章顺序结构.ppt b/课件/C语言/课件/第3章顺序结构.ppt new file mode 100644 index 0000000..ddbc97c Binary files /dev/null and b/课件/C语言/课件/第3章顺序结构.ppt differ diff --git a/课件/C语言/课件/第4章选择结构.ppt b/课件/C语言/课件/第4章选择结构.ppt new file mode 100644 index 0000000..65fe22b Binary files /dev/null and b/课件/C语言/课件/第4章选择结构.ppt differ diff --git a/课件/C语言/课件/第5章循环结构.ppt b/课件/C语言/课件/第5章循环结构.ppt new file mode 100644 index 0000000..47b2378 Binary files /dev/null and b/课件/C语言/课件/第5章循环结构.ppt differ diff --git a/课件/C语言/课件/第6章数组.ppt b/课件/C语言/课件/第6章数组.ppt new file mode 100644 index 0000000..e874a85 Binary files /dev/null and b/课件/C语言/课件/第6章数组.ppt differ diff --git a/课件/C语言/课件/第7章函数.ppt b/课件/C语言/课件/第7章函数.ppt new file mode 100644 index 0000000..40801b5 Binary files /dev/null and b/课件/C语言/课件/第7章函数.ppt differ diff --git a/课件/C语言/课件/第8章指针(1).ppt b/课件/C语言/课件/第8章指针(1).ppt new file mode 100644 index 0000000..f205554 Binary files /dev/null and b/课件/C语言/课件/第8章指针(1).ppt differ diff --git a/课件/C语言/课件/第8章指针(2).ppt b/课件/C语言/课件/第8章指针(2).ppt new file mode 100644 index 0000000..a75bff9 Binary files /dev/null and b/课件/C语言/课件/第8章指针(2).ppt differ diff --git a/课件/C语言/课件/第9章结构体.ppt b/课件/C语言/课件/第9章结构体.ppt new file mode 100644 index 0000000..2a59564 Binary files /dev/null and b/课件/C语言/课件/第9章结构体.ppt differ diff --git a/课件/MySQL/1. MySQL基本操作.md b/课件/MySQL/1. MySQL基本操作.md new file mode 100644 index 0000000..21be396 --- /dev/null +++ b/课件/MySQL/1. MySQL基本操作.md @@ -0,0 +1,1091 @@ +## 1.1 今日目标 + +1. 了解数据库的发展史 +2. 了解什么是SQL语句 +3. 了解启动和停止MySQL服务器 +4. 能够连接MySQL数据库 +5. 能够关闭数据库连接 +6. 能够创建数据库 +7. 能够查看所有数据库 +8. 能够修改数据库的字符编码 +9. 能够删除数据库 +10. 能够选择数据库 +11. 能够创建表 +12. 能够查看当前数据库中的所有表 +13. 能够查看表结构 +14. 能够查看创建表的SQL语句 +15. 能够能够复制表 +16. 能够给表添加字段 +17. 能够给表删除字段 +18. 能够修改表字段 +19. 能够修改表引擎 +20. 能够修改表名 +21. 能够向表中添加数据 +22. 能够修改表中的数据 +23. 能够删除表中的数据 + +## 1.2 数据库的作用 + +数据库是存放数据的仓库 + + ![1536628113363](https://yp.smallkun.cn/markdown/1536628113363.png!compress) + + + +数据库:数据库中存放的是表,一个数据库中可以存放多个表 + +表:表是用来存放数据的。 + +## 1.3 数据库的发展史 + +### 1.3.1 萌芽阶段:文件系统 + +最初始的数据库是用磁盘来存储数据的。文件就是最早的数据库。 + +### 1.3.2 第一代数据库:层次模型、网状模型 + +#### **1.3.2.1 层次模型** + + ![1536628336467](https://yp.smallkun.cn/markdown/1536628336467.png!compress) + + 缺点: + +1、 查找不同类的数据效率低了(导航的结构的缺点) + +2、 数据不完整(不能区分到底是一个李白还是两个李白) + + **1.3.2.2 网状模型** + +网状模型解决了层次数据的数据不完整的问题,但是没有解决层次模型的导航问题。 + + ![1536628485678](https://yp.smallkun.cn/markdown/1536628485678.png!compress) + +### 1.3.3 第二代数据库:关系型数据库 + +特点: + +1. 每个表都是独立的 + +2. 表与表之间通过公共字段来建立关系 + +![1536628687644](https://yp.smallkun.cn/markdown/1536628687644.png!compress) + + +优点:解决了导航问题,并且数据完整性得到解决 + +缺点:多表查询效率低了 + +提示:我们现在用的主流的数据库都是关系模型的。 + +``` +多学一招:NoSQL(非关系型数据库)解决关系型数据库多表查询效率的问题,常见的非关系型数据库有:Redis、mongodb。数据库中存储格式是键值对。 +``` + +## 1.4 MySQL安装 + +### 1.4.1 获取安装文件 + + ![1536629260375](https://yp.smallkun.cn/markdown/1536629260375.png!compress) + +### 1.4.2 双击安装 + + ![1536629329271](https://yp.smallkun.cn/markdown/1536629329271.png!compress) + + ![1536629355783](https://yp.smallkun.cn/markdown/1536629355783.png!compress) + + ![1536629428241](https://yp.smallkun.cn/markdown/1536629428241.png!compress) + + ![1536629613825](https://yp.smallkun.cn/markdown/1536629613825.png!compress) + +![1536629634342](https://yp.smallkun.cn/markdown/1536629634342.png!compress) +![1536629705861](https://yp.smallkun.cn/markdown/1536629705861.png!compress) + ![1536629719332](https://yp.smallkun.cn/markdown/1536629719332.png!compress) + + ![1536629774124](https://yp.smallkun.cn/markdown/1536629774124.png!compress) + + ![1536629790901](https://yp.smallkun.cn/markdown/1536629790901.png!compress) + + ![1536629803448](https://yp.smallkun.cn/markdown/1536629803448.png!compress) + + ![1536629813638](https://yp.smallkun.cn/markdown/1536629813638.png!compress) + + ![1536629824430](https://yp.smallkun.cn/markdown/1536629824430.png!compress) + + ![1536629839409](https://yp.smallkun.cn/markdown/1536629839409.png!compress) + + + + ![1536629900552](https://yp.smallkun.cn/markdown/1536629900552.png!compress) + + ![1536629997349](https://yp.smallkun.cn/markdown/1536629997349.png!compress) + + ![1536630150575](https://yp.smallkun.cn/markdown/1536630150575.png!compress) + + ![1536630150575](https://yp.smallkun.cn/markdown/1536630241363.png!compress) + + ![1536630241363](https://yp.smallkun.cn/markdown/1536630387833.png!compress) + + ![1536630440697](https://yp.smallkun.cn/markdown/1536630440697.png!compress) + +### 1.4.3 MySQL目录 + + ![1536630746684](https://yp.smallkun.cn/markdown/1536630746684.png!compress) + + + +## 1.5 启动/关闭MySQL服务 + +### 1.5.1 方法一:在服务面板中启动或关闭 + +控制面板项——管理工具——服务,选择相应服务,右键执行操作。 + + ![1536631118948](https://yp.smallkun.cn/markdown/1536631118948.png!compress) + +### 1.5.2 方法二:通过命令行启动\关闭 + +net start 服务名: 启动MySQL服务 + +net stop 服务器: 关闭MySQL服务 + + ![1536631301616](https://yp.smallkun.cn/markdown/1536631301616.png!compress) + +``` + 注意:必须通过管理员身份启动命令行 +``` + +## 1.6 SQL介绍 + +### 1.6.1 SQL是什么 + +Structured Query Language(结构化查询语言),是用来操作关系型数据库的一门语言。这是一个关系型数据库的通用操作语言,也成为标准SQL,也叫SQL-92。 + +``` +多学一招:数据库的生产厂商为了占有市场份额,都会在标准SQL的基础上扩展一些自己的东西以吸引用户。 +``` + +### 1.6.2 常见的关系型数据库 + +| 关系型数据库 | 开发公司 | 使用语言 | +| ------------ | --------------------------------- | -------- | +| SQL Server | 微软公司 | T-SQL | +| Oracle | 甲骨文公司 | PL/SQL | +| MySQL | MySQL AB 公司开发——甲骨文公司收购 | MySQL | + +**思考:**已知标准SQL可以在所有的关系型数据库上运行,在Oracle上编写的PL/SQL能否在MySQL上运行? + +答:不能,只能运行标准SQL + +## 1.7 连接服务器 + +通过命令行面板连接 + +``` +host:主机 -h +username:用户名 -u +password:密码 -p +port:端口 -P +``` + +![1536633424017](https://yp.smallkun.cn/markdown/1536633424017.png!compress) + +*** + + ![1536633591923](https://yp.smallkun.cn/markdown/1536633591923.png!compress) + +``` +多学一招:如果MySQL服务器在本地,IP地址可以省略;如果MySQL服务器用的是3306端口,-P也是可以省略 +``` + + ![1536633758241](https://yp.smallkun.cn/markdown/1536633758241.png!compress) + + + +## 1.8 关闭连接 + +```sql +方法一:exit + +方法二:quit + +方法三:\q +``` + +``` +脚下留心:MySQL中的命令后面要加分号,windows命令行的命令后面不用加分号。 +``` + + + +## 1.9 数据库的操作 + +### 1.9.1 显示数据库 + +```sql + 语法:show databases + + mysql> show databases; ++--------------------+ +| Database | ++--------------------+ +| information_schema | +| mysql | +| performance_schema | +| test | ++--------------------+ +4 rows in set (0.11 sec) +``` + +安装MySQL后,MySQL自带了4个数据库 + +1. information_schema:存储了MySQL服务器管理数据库的信息。 +2. performance_schema:MySQL5.5新增的表,用来保存数据库服务器性能的参数 +3. mysql:MySQL系统数据库,保存的登录用户名,密码,以及每个用户的权限等等 +4. test:给用户学习和测试的数据库。 + +### 1.9.2 创建数据库 + +```sql +语法:create database [if not exists] `数据名` [字符编码] +``` + +创建数据库: + +```sql +mysql> create database stu; +Query OK, 1 row affected (0.09 sec) +``` + +如果创建的数据库已存在,就会报错 + +```sql +mysql> create database stu; +ERROR 1007 (HY000): Can't create database 'stu'; database exists +``` + +解决:创建数据库的时候判断一下数据库是否存在,如果不存在再创建 + + ```sql +mysql> create database if not exists stu; +Query OK, 1 row affected, 1 warning (0.00 sec) + ``` + +如果数据库名是关键字和特殊字符要报错 + + 解决:在特殊字符、关键字行加上反引号 + + ```sql +mysql> create database `create`; +Query OK, 1 row affected (0.05 sec) + ``` + +```php +多学一招:为了创建数据库时万无一失,我们可以在所有的数据库名上加上反引号 +``` + +创建数据库的时候可以指定字符编码 + + ```sql +mysql> create database teacher charset=gbk; +Query OK, 1 row affected (0.01 sec) +gbk 简体中文 +gb2312: 简体中文 +utf8: 通用字符编码 + ``` + +```php +脚下留心:创建数据库如果不指定字符编码,默认和MySQL服务器的字符编码是一致的。 +``` + +### 1.9.3 删除数据库 + +```sql +语法:drop database [if exists] 数据库名 +``` + +删除数据库 + +```sql +mysql> drop database teacher; +Query OK, 0 rows affected (0.00 sec) +``` + +如果删除的数据库不存在,会报错 + +```sql +mysql> drop database teacher; +ERROR 1008 (HY000): Can't drop database 'teacher'; database doesn't exist +mysql> +``` + + 解决:删除之前判断一下,如果存在就删除 + + ```sql +mysql> drop database if exists teacher; +Query OK, 0 rows affected, 1 warning (0.00 sec) + ``` + +### 1.9.4 显示创建数据库的SQL语句 + +```sql +语法:show create database 数据库名 +``` + +```sql +mysql> show create database stu; ++----------+--------------------------------------------------------------+ +| Database | Create Database | ++----------+--------------------------------------------------------------+ +| stu | CREATE DATABASE `stu` /*!40100 DEFAULT CHARACTER SET utf8 */ | ++----------+--------------------------------------------------------------+ +1 row in set (0.01 sec) + +mysql> show create database teacher; ++----------+-----------------------------------------------------------------+ +| Database | Create Database | ++----------+-----------------------------------------------------------------+ +| teacher | CREATE DATABASE `teacher` /*!40100 DEFAULT CHARACTER SET gbk */ | ++----------+-----------------------------------------------------------------+ +1 row in set (0.00 sec) +``` + +### 1.9.5 修改数据库 + +修改数据库的字符编码 + +语法: + +```sql +alter database 数据库名 charset=字符编码 +``` + +例题 + +```sql +mysql> alter database teacher charset=utf8; +Query OK, 1 row affected (0.00 sec) + +mysql> show create database teacher; ++----------+------------------------------------------------------------------+ +| Database | Create Database | ++----------+------------------------------------------------------------------+ +| teacher | CREATE DATABASE `teacher` /*!40100 DEFAULT CHARACTER SET utf8 */ | ++----------+------------------------------------------------------------------+ +1 row in set (0.00 sec) +``` + +### 1.9.6 选择数据库 + +语法: + +```sql +use 数据库名 +``` + +选择数据库 + +```sql +mysql> use stu; +Database changed +``` + +## 1.10 表的操作 + +### 1.10.1 显示所有表 + +语法: + +```sql +show tables +``` + + + + + + + + + + + + + +### 1.10.2 创建表 + +语法: + +```sql +create table [if not exists] 表名( + 字段名 数据类型 [null|not null] [auto_increment] [primary key] [comment], + 字段名 数据类型 [default]… +)engine=存储引擎 +``` + +单词 + +```sql +null | not null 空|非空 +default 默认值 +auto_increment 自动增长 +primary key 主键 +comment 备注 +engine 引擎 innodb myisam memory 引擎是决定数据存储的方式 +``` + +创建简单的表 + + ```sql +mysql> create database itcast; +Query OK, 1 row affected (0.00 sec) + +mysql> use itcast; +Database changed +mysql> show tables; +Empty set (0.05 sec) + +# 创建表 +mysql> create table stu( + -> id int, + -> name varchar(30) + -> ); +Query OK, 0 rows affected (0.13 sec) +# 查看创建的表 +mysql> show tables; ++------------------+ +| Tables_in_itcast | ++------------------+ +| stu | ++------------------+ + ``` + + 创建复杂的表 + + ```sql +mysql> set names gbk; # 设置字符编码 +Query OK, 0 rows affected (0.05 sec) + +mysql> create table if not exists teacher( + -> id int auto_increment primary key comment '主键', + -> name varchar(20) not null comment '姓名', + -> phone varchar(20) comment '电话号码', + -> `add` varchar(100) default '地址不详' comment '地址' + -> )engine=innodb; +Query OK, 0 rows affected (0.09 sec) + + ``` + +多学一招:create table 数据库名.表名,用于给指定的数据库创建表 + + ```sql +mysql> create table data.stu( #给data数据库中创建stu表 + -> id int, + -> name varchar(10)); +Query OK, 0 rows affected (0.00 sec) + ``` + +### 1.10.3 显示创建表的语句 + +语法: + +```sql +show create table 表名 +``` + +显示创建teacher表的语句 + +```sql +mysql> show create table teacher; ++---------+-------------------------------------------------------------------------- +------------------------------------------------------------------------------------- +------------------------------------------------------------------------------------- +-------+ +| Table | Create Table + + + | ++---------+-------------------------------------------------------------------------- +------------------------------------------------------------------------------------- +------------------------------------------------------------------------------------- +-------+ +| teacher | CREATE TABLE `teacher` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键', + `name` varchar(20) NOT NULL COMMENT '姓名', + `phone` varchar(20) DEFAULT NULL COMMENT '电话号码', + `add` varchar(100) DEFAULT '地址不详' COMMENT '地址', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 | +``` + +将两个字段竖着排列 show create table `表名`\G + + ```sql +mysql> show create table teacher\G; +*************************** 1. row *************************** + Table: teacher +Create Table: CREATE TABLE `teacher` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键', + `name` varchar(20) NOT NULL COMMENT '姓名', + `phone` varchar(20) DEFAULT NULL COMMENT '电话号码', + `add` varchar(100) DEFAULT '地址不详' COMMENT '地址', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 +1 row in set (0.00 sec) + + ``` + +### 1.10.4 查看表结构 + +语法: + +```sql +desc[ribe] 表名 +``` + +查看teacher表的结构 + +```sql +mysql> describe teacher; ++-------+--------------+------+-----+----------+----------------+ +| Field | Type | Null | Key | Default | Extra | ++-------+--------------+------+-----+----------+----------------+ +| id | int(11) | NO | PRI | NULL | auto_increment | +| name | varchar(20) | NO | | NULL | | +| phone | varchar(20) | YES | | NULL | | +| add | varchar(100) | YES | | 地址不详 | | ++-------+--------------+------+-----+----------+----------------+ +4 rows in set (0.08 sec) + +mysql> desc teacher; ++-------+--------------+------+-----+----------+----------------+ +| Field | Type | Null | Key | Default | Extra | ++-------+--------------+------+-----+----------+----------------+ +| id | int(11) | NO | PRI | NULL | auto_increment | +| name | varchar(20) | NO | | NULL | | +| phone | varchar(20) | YES | | NULL | | +| add | varchar(100) | YES | | 地址不详 | | ++-------+--------------+------+-----+----------+----------------+ +4 rows in set (0.01 sec) +``` + +### 1.10.5 删除表 + +语法: + +```sql +drop table [if exists] 表1,表2,… +``` + +删除表 + +```sql +mysql> drop table stu; +Query OK, 0 rows affected (0.08 sec) +``` + +如果删除一个不存在的表就会报错,删除的时候可以判断一下,存在就删除。 + +```sql +mysql> drop table stu; +ERROR 1051 (42S02): Unknown table 'stu' + +mysql> drop table if exists stu; +Query OK, 0 rows affected, 1 warning (0.00 sec) +``` + +可以一次删除多个表 + + ```sql +mysql> drop table a1,a2; +Query OK, 0 rows affected (0.00 sec) + ``` + +### 1.10.6 修改表 + +```sql +语法:alter table 表名 +``` + +1、添加字段:alter table 表名add [column] 字段名 数据类型 [位置] + +例题一:添加字段 + + ```sql +mysql> alter table teacher add age int; +Query OK, 0 rows affected (0.09 sec) +Records: 0 Duplicates: 0 Warnings: 0 + +mysql> desc teacher; ++-------+--------------+------+-----+----------+----------------+ +| Field | Type | Null | Key | Default | Extra | ++-------+--------------+------+-----+----------+----------------+ +| id | int(11) | NO | PRI | NULL | auto_increment | +| name | varchar(20) | NO | | NULL | | +| phone | varchar(20) | YES | | NULL | | +| add | varchar(100) | YES | | 地址不详 | | +| age | int(11) | YES | | NULL | | ++-------+--------------+------+-----+----------+----------------+ +5 rows in set (0.00 sec) + ``` + +例题二:在第一个位置上添加字段 + +```sql +mysql> alter table teacher add email varchar(30) first; +Query OK, 0 rows affected (0.00 sec) +Records: 0 Duplicates: 0 Warnings: 0 + +mysql> desc teacher; ++-------+--------------+------+-----+----------+----------------+ +| Field | Type | Null | Key | Default | Extra | ++-------+--------------+------+-----+----------+----------------+ +| email | varchar(30) | YES | | NULL | | +| id | int(11) | NO | PRI | NULL | auto_increment | +| name | varchar(20) | NO | | NULL | | +| phone | varchar(20) | YES | | NULL | | +| add | varchar(100) | YES | | 地址不详 | | +| age | int(11) | YES | | NULL | | ++-------+--------------+------+-----+----------+----------------+ +``` + +例题三:在指定的字段后添加字段 + +```sql +mysql> alter table teacher add sex varchar(2) after name; +Query OK, 0 rows affected (0.00 sec) +Records: 0 Duplicates: 0 Warnings: 0 + +mysql> desc teacher; ++-------+--------------+------+-----+----------+----------------+ +| Field | Type | Null | Key | Default | Extra | ++-------+--------------+------+-----+----------+----------------+ +| email | varchar(30) | YES | | NULL | | +| id | int(11) | NO | PRI | NULL | auto_increment | +| name | varchar(20) | NO | | NULL | | +| sex | varchar(2) | YES | | NULL | | +| phone | varchar(20) | YES | | NULL | | +| add | varchar(100) | YES | | 地址不详 | | +| age | int(11) | YES | | NULL | | ++-------+--------------+------+-----+----------+----------------+ +7 rows in set (0.00 sec) +``` + +2、删除字段:alter table 表 drop [column] 字段名 + + ```sql +mysql> alter table teacher drop email; +Query OK, 0 rows affected (0.06 sec) +Records: 0 Duplicates: 0 Warnings: 0 + ``` + +3、修改字段(改名改类型):alter table 表 change [column] 原字段名 新字段名 数据类型 … + + 将字段sex改为xingbie,数据类型为int + +```sql +mysql> alter table teacher change sex xingbie int; +Query OK, 0 rows affected (0.00 sec) +Records: 0 Duplicates: 0 Warnings: 0 +``` + +4、修改字段(不改名):alter table 表 modify 字段名 字段属性… + +将性别的数据类型改为varchar(2) + + ```sql +mysql> alter table teacher modify xingbie varchar(2); +Query OK, 0 rows affected (0.00 sec) +Records: 0 Duplicates: 0 Warnings: 0 + ``` + +5、修改引擎:alter table 表名 engine=引擎名 + + ```sql +mysql> alter table teacher engine=myisam; +Query OK, 0 rows affected (0.05 sec) +Records: 0 Duplicates: 0 Warnings: 0 + ``` + +6、修改表名:alter table 表名 rename to 新表名 + + ```sql +mysql> alter table teacher rename to stu; +Query OK, 0 rows affected (0.00 sec) + +mysql> show tables; ++------------------+ +| Tables_in_itcast | ++------------------+ +| stu | ++------------------+ +1 row in set (0.00 sec) + ``` + +### 1.10.5 复制表 + +```sql +语法一:create table 新表 select 字段 from 旧表 +``` + + 特点:不能复制父表的主键,能够复制父表的数据 + +```sql +mysql> create table stu1 select * from stu; +Query OK, 1 row affected (0.06 sec) +Records: 1 Duplicates: 0 Warnings: 0 + +mysql> select * from stu1; # 查看数据复制到新表中 ++----+------+------+-------+ +| id | name | addr | score | ++----+------+------+-------+ +| 1 | rose | 上海 | 88 | ++----+------+------+-------+ +1 row in set (0.00 sec) + +mysql> desc stu1; # 主键没有复制 ++-------+-------------+------+-----+----------+-------+ +| Field | Type | Null | Key | Default | Extra | ++-------+-------------+------+-----+----------+-------+ +| id | int(11) | NO | | 0 | | +| name | varchar(20) | NO | | NULL | | +| addr | varchar(50) | YES | | 地址不详 | | +| score | int(11) | YES | | NULL | | ++-------+-------------+------+-----+----------+-------+ +4 rows in set (0.00 sec) +``` + +```sql +语法二:create table 新表 like 旧表 +``` + +特点:只能复制表结构,不能复制表数据 + +```sql +Query OK, 0 rows affected (0.00 sec) + +mysql> select * from stu2; # 数据没有复制 +Empty set (0.01 sec) + +mysql> desc stu2; # 主键复制了 ++-------+-------------+------+-----+----------+----------------+ +| Field | Type | Null | Key | Default | Extra | ++-------+-------------+------+-----+----------+----------------+ +| id | int(11) | NO | PRI | NULL | auto_increment | +| name | varchar(20) | NO | | NULL | | +| addr | varchar(50) | YES | | 地址不详 | | +| score | int(11) | YES | | NULL | | ++-------+-------------+------+-----+----------+----------------+ +4 rows in set (0.00 sec) +``` + +## 1.11 数据操作 + +创建测试表 + +```sql +mysql> create table stu( + -> id int auto_increment primary key comment '主键', + -> name varchar(20) not null, + -> addr varchar(50) default '地址不详', + -> score int comment '成绩' + -> ); +Query OK, 0 rows affected (0.01 sec) +``` + +### 1.11.1 插入数据 + +#### 插入一条数据 + +```sql +语法:insert into 表名 (字段名, 字段名,…) values (值1, 值1,…) +``` + +例题一:插入数据 + +```sql +mysql> insert into stu (id,name,addr,score) values (1,'tom','上海',88); +Query OK, 1 row affected (0.11 sec) +``` + +例题二:插入的字段可以和表的字段顺序不一致。值的顺序必须和插入字段的顺序一致。 + +```sql +mysql> insert into stu (name,score,addr,id) values ('berry',77,'北京',2); +Query OK, 1 row affected (0.00 sec) +``` + +例题三:可以插入部分字段,但是,非空字段必须插入 + +```sql +mysql> insert into stu (id,name,addr) values (3,'ketty','上海'); +``` + +例题四:自动增长字段不用插入,数据库会自动插入增长的数字 + +```sql +mysql> insert into stu (name,addr) values ('rose','北京'); +Query OK, 1 row affected (0.00 sec) +``` + +例题五:自动增长列的值插入null即可 + +```sql +mysql> insert into stu (id,name,addr,score) values (null,'李白','上海',66); +Query OK, 1 row affected (0.00 sec) +``` + +例题六:插入值的顺序和个数与表字段的顺序和个数一致,插入的字段可以省略 + +```sql +mysql> insert into stu values (null,'杜甫','北京',null); +Query OK, 1 row affected (0.00 sec) +``` + +例题七:通过default关键字插入默认值 + +```sql +mysql> insert into stu values (null,'李清照',default,66); +``` + +```sql +脚下留心: +1、插入字段的顺序与值的顺序必须一致 +``` + +#### 插入多条数据 + + ```sql +mysql> insert into stu values (null,'辛弃疾',default,66),(null,'岳飞','河南',77); +Query OK, 2 rows affected (0.00 sec) +Records: 2 Duplicates: 0 Warnings: 0 + ``` + +### 1.11.2 更新数据 + +语法: + +```sql +update 表名 set 字段=值 [where 条件] +``` + +例题一:将1号学生的地址改成山东 + + ```sql +mysql> update stu set addr='山东' where id=1 + ``` + +例题二:将ketty的成绩改为99 + +```sql +mysql> update stu set score=99 where name='ketty'; +``` + +例题三:将berry地址改成上海,成绩改成66 + +```sql +mysql> update stu set addr='上海',score=66 where name='berry'; +``` + +例题四:将上海的学生成绩改为60 + +```sql +mysql> update stu set score=60 where addr='上海'; +``` + +例题五:条件可以省略,如果省略,更改所有数据(将所有数据的地址改为湖南,成绩改为70) + +```sql +mysql> update stu set addr='湖南',score=70; +``` + +例题六:将2、3的学生成绩改为65 + +```sql +mysql> update stu set score=65 where id=2 or id=3; +``` + +### 1.11.3 删除数据 + +语法 + +```sql +delete from 表名 [where 条件] +``` + +例题一:删除学号是1号的学生 + + ```sql +mysql> delete from stu where id=1; + ``` + +例题二:删除成绩小于等于65分的 + + ```sql +mysql> delete from stu where score<=65; + ``` + +例题三:删除表中所有记录 + + ```sql +mysql> delete from stu; + ``` + +### 1.11.4 清空表 + +语法: + + ```sql +truncate table 表名 + ``` + +例题 + +```sql +mysql> truncate table stu; +Query OK, 0 rows affected (0.00 sec) +``` + +``` +脚下留心:delete from 表和truncate table 表区别? +delete from 表:遍历表记录,一条一条的删除 +truncate table:将原表销毁,再创建一个同结构的新表。就清空表而言,这种方法效率高。 +``` + +### 1.11.5查询表 + +语法: + +```sql +select 列名 from 表 +``` + +例题: + +```sql +mysql> select name,score from stu; ++------+-------+ +| name | score | ++------+-------+ +| rose | 88 | ++------+-------+ +1 row in set (0.00 sec) + +mysql> select id,name,addr,score from stu; ++----+------+------+-------+ +| id | name | addr | score | ++----+------+------+-------+ +| 1 | rose | 上海 | 88 | ++----+------+------+-------+ +1 row in set (0.00 sec) + +mysql> select * from stu; # *表示所有字段 ++----+------+------+-------+ +| id | name | addr | score | ++----+------+------+-------+ +| 1 | rose | 上海 | 88 | ++----+------+------+-------+ +1 row in set (0.00 sec) +``` + +## 1.12 SQL分类 + +DDL(data definition language)数据库定义语言CREATE、ALTER、DROP、SHOW + +DML(data manipulation language)数据操纵语言SELECT、UPDATE、INSERT、DELETE + +DCL(Data Control Language)数据库控制语言,是用来设置或更改数据库用户或角色权限的语句 + + + +## 1.13 数据表的文件介绍 + +一个数据库对应一个文件夹 + +一个表对应一个或多个文件 + +引擎是myisam,一个表对应三个文件 + + ![1536654269605](https://yp.smallkun.cn/markdown/1536654269605.png!compress) + +引擎是innodb,一个表对应一个表结构文件 + + ![1536654519700](https://yp.smallkun.cn/markdown/1536654519700.png!compress) + +所有的innodb引擎的数据统一的存放在data\ibdata1文件中。如果数据量很大,MySQL会自动的创建ibdata2,ibdata3,…,目的就是为了便于管理。 + + 引擎是memory,数据存储在内存中,重启服务数据丢失,但是读取速度非常快。 + +## 1.14 字符集 + +字符集:字符在保存和传输时对应的二进制编码集合。 + +创建测试数据库 + +```sql +mysql> create table stu( + -> id int primary key, + -> name varchar(20) + -> ); +Query OK, 0 rows affected (0.00 sec) +``` + +插入中文报错 + +![1536656529642](https://yp.smallkun.cn/markdown/1536656529642.png!compress) + +*** + +分析原因: + +客户端通过GBK发送的命令 + + ![1536656722512](https://yp.smallkun.cn/markdown/1536656722512.png!compress) + +但是,服务用utf8解释命令 + + ![1536656805867](https://yp.smallkun.cn/markdown/1536656805867.png!compress) + +设置服务器,用gbk字符编码接受客户端发来的命令 + + ![1536656911674](https://yp.smallkun.cn/markdown/1536656911674.png!compress) + +测试:插入中文,成功 + + ![1536656946064](https://yp.smallkun.cn/markdown/1536656946064.png!compress) + +查询数据,发现数据乱码 + + ![1536657018441](https://yp.smallkun.cn/markdown/1536657018441.png!compress) + +原因:以utf返回的结果,客户端用gbk来接受 + +解决:服务器用gbk返回数据 + + ![1536657091653](https://yp.smallkun.cn/markdown/1536657091653.png!compress) + +再次测试,查询数据 + + ![1536657126082](https://yp.smallkun.cn/markdown/1536657126082.png!compress) + + + +总结:客户端编码、character_set_client、character_set_results三个编码的值一致即可操作中文。 + +多学一招:我们只要设置“set names 字符编码”,就可以更改character_set_client、character_set_results的值。 + + ![1536657249850](https://yp.smallkun.cn/markdown/1536657249850.png!compress) + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/课件/MySQL/2. 列类型和数据完整性.md b/课件/MySQL/2. 列类型和数据完整性.md new file mode 100644 index 0000000..1d40fbd --- /dev/null +++ b/课件/MySQL/2. 列类型和数据完整性.md @@ -0,0 +1,1062 @@ +## 1.1 今日目标 + +1. 了解MySQL常用的客户端软件 +2. 理解整型的使用 +3. 理解浮点型的使用 +4. 理解字符型的使用 +5. 理解枚举型的使用 +6. 理解集合型的使用 +7. 理解日期型的使用 +8. 理解非空约束 +9. 理解默认值约束 +10. 理解自动增长 +11. 理解主键约束 +12. 理解唯一键约束 +13. 知道备注 +14. 知道SQL注释 +15. 理解外键约束 + +## 1.2 数据类型——值类型 + +#### 1.2.1 整型 + +| 类型 | 字节 | 范围 | +| :-------: | :--: | :--------------: | +| tinyint | 1 | -128~127 | +| smallint | 2 | -32768~32767 | +| mediumint | 3 | -8388608~8388607 | +| int | 4 | -2^31^~2^31^-1 | +| bigint | 8 | -2^63^~2^63^-1 | + +1、无符号整数(unsigned):无符号数没有负数,正数部分是有符号的两倍。 + + 例题 + +```sql +mysql> create table stu( + -> id smallint unsigned auto_increment primary key comment '主键', + -> age tinyint unsigned not null comment '年龄', + -> money bigint unsigned comment '存款' + -> ); +Query OK, 0 rows affected (0.06 sec) + +mysql> desc stu; ++-------+----------------------+------+-----+---------+----------------+ +| Field | Type | Null | Key | Default | Extra | ++-------+----------------------+------+-----+---------+----------------+ +| id | smallint(5) unsigned | NO | PRI | NULL | auto_increment | +| age | tinyint(3) unsigned | NO | | NULL | | +| money | bigint(20) unsigned | YES | | NULL | | ++-------+----------------------+------+-----+---------+----------------+ +3 rows in set, 3 warnings (0.00 sec) +``` + +2、整型支持显示宽度(最小的显示位数) 比如int(5),如果数值的位数小于5位,前面加上前导0。比如输入12,显示00012;大于5位就不添加前导0。 + +``` +脚下留心:必须结合zerofill才起作用 +``` + +```sql +mysql> create table stu( + -> id int(5), + -> age int(5) zerofill # 填充前导0 + -> ); +Query OK, 0 rows affected (0.02 sec) + +mysql> desc stu; ++-------+--------------------------+------+-----+---------+-------+ +| Field | Type | Null | Key | Default | Extra | ++-------+--------------------------+------+-----+---------+-------+ +| id | int(5) | YES | | NULL | | +| age | int(5) unsigned zerofill | YES | | NULL | | ++-------+--------------------------+------+-----+---------+-------+ +2 rows in set (0.02 sec) + +mysql> insert into stu values (1,11); +mysql> insert into stu values (1111111,2222222); +Query OK, 1 row affected (0.00 sec) + +mysql> select * from stu; ++---------+---------+ +| id | age | ++---------+---------+ +| 1 | 00011 | +| 1111111 | 2222222 | # 注意:age填充了前导0 ++---------+---------+ +2 rows in set (0.00 sec) +``` + +#### 1.2.2 浮点型(保存近似值小数) + +| 浮点型 | 占用字节 | 范围 | +| :--------------: | :------: | :----------------: | +| float(单精度) | 4 | -3.4E+38~3.4E+38 | +| double(双精度) | 8 | -1.8E+308~1.8E+308 | + + 1、浮点数声明: float(M,D) double(M,D) + +M:总位数 + +D:小数位数 + + 例题; + +```sql +mysql> create table t1( + -> num1 float(5,2), #总位数是5,小数位数是2,那么整数位数是3, + -> num2 double(4,1) + -> ); +Query OK, 0 rows affected (0.08 sec) + +mysql> insert into t1 values (1.23,1.23); #如果精度超出了允许的范围,会四舍五入 +Query OK, 1 row affected (0.00 sec) + +mysql> select * from t1; ++------+------+ +| num1 | num2 | ++------+------+ +| 1.23 | 1.2 | #如果精度超出了允许的范围,会四舍五入 ++------+------+ +1 row in set (0.00 sec) +``` + +2、浮点的精度可能会丢失【精度指的是小数】 + + ![1536718268668](https://yp.smallkun.cn/markdown/1536718268668.png!compress) + +#### 1.2.3 定点数 + +语法:decimal(M,D) + + ```sql +mysql> create table t4( + -> num decimal(20,19) + -> ); +Query OK, 0 rows affected (0.00 sec) + +mysql> insert into t4 values (1.1234567890123456789); +Query OK, 1 row affected (0.01 sec) + +mysql> select * from t4; ++-----------------------+ +| num | ++-----------------------+ +| 1.1234567890123456789 | ++-----------------------+ +1 row in set (0.00 sec) + ``` + +```sql +多学一招: +1、定点数是变长的,大致每9个数字用4个字节来存储。定点数之所以能保存精确的小数,因为整数和小数是分开存储的。占用的资源比浮点数要多。 +2、定点数和浮点数都支持显示宽度和无符号数。 +``` + +## 1.3 数据类型——字符型 + +| 数据类型 | 描述 | 长度 | +| :-----------: | :------: | :-----------: | +| char(长度) | 定长 | 最大255 | +| varchar(长度) | 变长 | 最大65535 | +| tinytext | 大段文本 | 2^8^-1=255 | +| text | 大段文本 | 2^16^-1=65535 | +| mediumtext | 大段文本 | 2^24^-1 | +| longtext | 大段文本 | 2^32^-1 | + +1、char(10)和varchar(10)的区别? + +答:相同点:它们最多只能保存10个字符; + + 不同点:char不回收多余的字符,varchar会回收多余的字符。 + + char效率高,浪费空间,varchar节省空间,效率比char低。 + +2、char的最大长度是255。 ![1536719919287](https://yp.smallkun.cn/markdown/1536719919287.png!compress) + +3、varchar理论长度是65535字节,实际根本达不到。具体长度与字符编码有关。 ![1536720096028](https://yp.smallkun.cn/markdown/1536720096028.png!compress) + + ![1536720113031](https://yp.smallkun.cn/markdown/1536720113031.png!compress) + + 4、一个记录的总长度不能超过65535个字节。 + + 5、大块文本(text)不计算在总长度中,一个大块文本只占用10个字节来保存文本的地址。 ![1536720763914](https://yp.smallkun.cn/markdown/1536720763914.png!compress) + + + +## 1.4 数据类型——枚举(enum) + +1、从集合中选择一个数据(单选) + + ```sql +mysql> create table t8( + -> name varchar(20), + -> sex enum('男','女','保密') # 枚举 + -> )charset=utf8; +Query OK, 0 rows affected (0.06 sec) + +mysql> insert into t8 values ('tom','男'); +Query OK, 1 row affected (0.00 sec) + +mysql> insert into t8 values ('berry','女'); +Query OK, 1 row affected (0.05 sec) + +mysql> insert into t8 values ('rose','未知'); # 报错,只能插入枚举值 +ERROR 1265 (01000): Data truncated for column 'sex' at row 1 +mysql> select * from t8; ++-------+------+ +| name | sex | ++-------+------+ +| tom | 男 | +| berry | 女 | ++-------+------+ + ``` + +2、MySQL的枚举类型是通过整数来管理的,第一个值是1,第二个值是2,以此类推。 + + ![1536721403493](https://yp.smallkun.cn/markdown/1536721403493.png!compress) + +```sql +mysql> select sex+0 from t8; ++-------+ +| sex+0 | ++-------+ +| 1 | +| 2 | ++-------+ +``` + +3、既然枚举在数据库内部存储的是整数,那么可以直接插入数字 + + ```sql +mysql> insert into t8 values ('rose',3); # 可以直接插入数字 +Query OK, 1 row affected (0.00 sec) + +mysql> select * from t8; ++-------+------+ +| name | sex | ++-------+------+ +| tom | 男 | +| berry | 女 | +| rose | 保密 | ++-------+------+ +3 rows in set (0.00 sec) + ``` + +枚举的优点: + +1、 运行速度快(数字比字符串运算速度快) + +2、 限制数据,保证数据完整性 + +3、 节省空间 + +``` +思考:已知枚举占用2个字节,请问最多有多少个枚举值? + +答:2个字节=16位,可以保存数字(0-65535),枚举是从1开始,所以枚举最多可以有65535个枚举值。 +``` + +## 1.5 数据类型——集合(set) + +从集合中选择一些数据(多选) + + ```sql +mysql> create table t9( + -> hobby set('爬山','读书','游泳','敲代码') + -> ); +Query OK, 0 rows affected (0.08 sec) + +mysql> insert into t9 values ('爬山'); +Query OK, 1 row affected (0.00 sec) + +mysql> insert into t9 values ('爬山,游泳'); +Query OK, 1 row affected (0.00 sec) + +mysql> insert into t9 values ('游泳,爬山'); # 插入顺序不一样,但是显示的顺序是一样的 +Query OK, 1 row affected (0.02 sec) + +mysql> insert into t9 values ('爬山,游泳,开车'); # 报错,插入集合中没有的选项会报错 +ERROR 1265 (01000): Data truncated for column 'hobby' at row 1 + ``` + + 每个集合的元素都分配一个固定的数字,分配的方式从左往右按2的0、1、2、…次方 + + ![1536723512843](https://yp.smallkun.cn/markdown/1536723512843.png!compress) + +*** + +```sql +思考:已知集合占用8个字节,最多可以表示几个选项? + +答:8个字节=64位,一个位表示1个选项,最多可以表示64个选项。 +``` + + + +## 1.6 数据类型——日期类型 + +| 数据类型 | 描述 | +| :-------: | :-------------------: | +| datetime | 日期时间,占用8个字节 | +| date | 日期 占用3个字节 | +| time | 时间 占用3个字节 | +| timestamp | 时间戳,占用4个字节 | +| year | 年份 占用1个字节 | + +1、datetime 格式:年-月-日 小时:分钟:秒 + + ```sql +mysql> create table t10( + -> field datetime + -> ); +Query OK, 0 rows affected (0.02 sec) + +mysql> insert into t10 values ('2025-10-12 10:12:36'); +Query OK, 1 row affected (0.00 sec) + +mysql> insert into t10 values ('100-10-12 10:12:36'); +Query OK, 1 row affected (0.00 sec) + +mysql> insert into t10 values ('10000-10-12 10:12:36'); #datetime保存范围是:1~9999年 +ERROR 1292 (22007): Incorrect datetime value: '10000-10-12 10:12:36' for column 'field' at row 1 + +mysql> select * from t10; ++---------------------+ +| field | ++---------------------+ +| 2025-10-12 10:12:36 | +| 0100-10-12 10:12:36 | ++---------------------+ +2 rows in set (0.00 sec) + ``` + +2、date 日期格式 + +```sql +mysql> create table t11( + -> field date + -> ); +Query OK, 0 rows affected (0.00 sec) + +mysql> insert into t11 values ('2025-10-12'); +Query OK, 1 row affected (0.00 sec) + +mysql> select * from t11; ++------------+ +| field | ++------------+ +| 2025-10-12 | ++------------+ +``` + +3、timestamp:时间戳 + +timestamp类型和 datetime类型在表现上是一样的。他们的区别: +datetime是从1到9999,而timestamp从1970年~2038年,2038年01月19日11:14:07秒以后就超出timestamp范围了。 + +```sql +mysql> create table t12( + -> field timestamp + -> ); +Query OK, 0 rows affected (0.00 sec) + +mysql> insert into t12 values ('1975-5-5 12:12:12'); +Query OK, 1 row affected (0.00 sec) + +mysql> insert into t12 values ('1969-5-5 12:12:12'); # 超出范围 +ERROR 1292 (22007): Incorrect datetime value: '1969-5-5 12:12:12' for column 'field' at row 1 +mysql> insert into t12 values ('2038-1-19 11:14:07'); +Query OK, 1 row affected (0.00 sec) + +mysql> insert into t12 values ('2038-1-19 11:14:08'); # 超出范围 +ERROR 1292 (22007): Incorrect datetime value: '2038-1-19 11:14:08' for column 'field' at row 1 + +mysql> select * from t12; ++---------------------+ +| field | ++---------------------+ +| 1975-05-05 12:12:12 | +| 2038-01-19 11:14:07 | ++---------------------+ +``` + +4、year + +因为只占用1个字节,最多只能表示255个年份,范围是1901-2155之间的年份 + +```sql +mysql> create table t13( + -> field year + -> ); +Query OK, 0 rows affected (0.06 sec) + +mysql> insert into t13 values (2025); +Query OK, 1 row affected (0.00 sec) + +mysql> insert into t13 values (1900); # 超出范围 +ERROR 1264 (22003): Out of range value for column 'field' at row 1 +mysql> insert into t13 values (2155); +Query OK, 1 row affected (0.00 sec) + +mysql> insert into t13 values (2156); # 超出范围 +ERROR 1264 (22003): Out of range value for column 'field' at row 1 +``` + +5、time 表示时间或时间间隔,范围是-838:59:59~838:59:59 + + ```sql +mysql> create table t14( + -> field time + -> ); +Query OK, 0 rows affected (0.00 sec) + +mysql> insert into t14 values ('12:12:12'); +Query OK, 1 row affected (0.00 sec) + +mysql> insert into t14 values ('212:12:12'); +Query OK, 1 row affected (0.00 sec) + +mysql> insert into t14 values ('838:59:59'); +Query OK, 1 row affected (0.00 sec) + +mysql> insert into t14 values ('839:00:00'); # 操作范围 +ERROR 1292 (22007): Incorrect time value: '839:00:00' for column 'field' at row 1 +mysql> + ``` + +多学一招:time支持以天的方式插入 + +```sql +mysql> insert into t14 values ('10 10:10:10'); +Query OK, 1 row affected (0.02 sec) + +mysql> select * from t14; ++-----------+ +| field | ++-----------+ +| 12:12:12 | +| 212:12:12 | +| 838:59:59 | +| 250:10:10 | ++-----------+ +``` + +## 1.7 数据类型——boolean + +MySQL不支持boolean类型,true和false在数据库中对应1和0。 + + ```sql +mysql> create table t15( + -> field boolean + -> ); +Query OK, 0 rows affected (0.00 sec) + +mysql> insert into t15 values (true),(false); # true和false在数据库中对应1和0 +Query OK, 2 rows affected (0.00 sec) +Records: 2 Duplicates: 0 Warnings: 0 + +mysql> select * from t15; ++-------+ +| field | ++-------+ +| 1 | +| 0 | ++-------+ +2 rows in set (0.00 sec) + ``` + +## 1.8 关于数据类型的思考题 + +1. 手机号码一般使用什么数据类型存储? char +2. 电话号码使用什么数据类型 varchar +3. 性别一般使用什么数据类型存储? char enum + +4. 学生年龄信息一般使用什么数据类型存储? tinyint + +5. 照片信息一般使用什么数据类型存储? binary + +6. 薪水一般使用什么数据类型存储? decimal + + +多学一招:一个字段到底选数字还是字符,取决于有没有计算的可能,如果没有计算的可能即使是数字也要用字符类型,比如手机号、QQ号,… + +## 1.9 列属性——是否为空(null | not null) + +null:可以为空 + +not null:不可以为空 + + 思考题 + +1. 学员姓名允许为空吗? 非空 + +2. 家庭地址允许为空吗? 非空 + +3. 电子邮件信息允许为空吗? 可以为空 + +4. 考试成绩允许为空吗? 可以为空 + + +## 1.10 列属性——默认值(default) + +1、如果一个字段没有插入值,可以默认插入一个指定的值。 + + 2、default关键字用来插入默认值 + + ```sql +mysql> create table t16( + -> id int unsigned, + -> addr varchar(20) not null default '地址不详' + -> ); +Query OK, 0 rows affected (0.06 sec) + +mysql> insert into t16 values (1,'北京'),(2,default); +Query OK, 2 rows affected (0.00 sec) +Records: 2 Duplicates: 0 Warnings: 0 + +mysql> select * from t16; ++------+----------+ +| id | addr | ++------+----------+ +| 1 | 北京 | +| 2 | 地址不详 | ++------+----------+ +2 rows in set (0.00 sec) + ``` + +## 1.11 列属性——自动增长(auto_increment) + +1、字段的值从1开始,每次递增1,特点就在字段中的数据不可能重复,适合为记录生成唯一的id + +2、自动增长都是无符号整数。 + +3、在MySQL中,auto_increment必须是主键。但是主键不一定是自动增长的。 + +4、如果要给自动增长列插入数据,使用null关键字。 + +5、自动增长列上的数据被删除,默认情况下此记录的编号不再使用。 + + ![1536737314504](https://yp.smallkun.cn/markdown/1536737314504.png!compress) + +## 1.12 列属性——主键(primary key) + +主键:唯一标识表中记录的一个或一组列 + +主键的特点:不能重复,不能为空 + +一个表只能有一个主键,主键可以有多个字段组成。 + +主键的作用: + +1、 保证数据完整性 + +2、 加快查询速度 + +#### 1.12.1 添加主键 + +方法一:创建表的时候添加主键 + +```sql +mysql> create table t17( + -> id varchar(5) primary key, # 创建主键 + -> name varchar(10) not null + -> ); +Query OK, 0 rows affected (0.00 sec) + +mysql> insert into t17 values ('s2531','tom'),('s2532','berry'); +Query OK, 2 rows affected (0.00 sec) +Records: 2 Duplicates: 0 Warnings: 0 + +mysql> select * from t17; ++-------+-------+ +| id | name | ++-------+-------+ +| s2531 | tom | +| s2532 | berry | ++-------+-------+ +2 rows in set (0.00 sec) + +# 如果插入主键相同数据会报错 +mysql> insert into t17 values ('s2531','tom'); +ERROR 1062 (23000): Duplicate entry 's2531' for key 'PRIMARY' + +# 主键不能插入null值 +mysql> insert into t17 values (null,'tom'); +ERROR 1048 (23000): Column 'id' cannot be null +``` + +方法二:创建表的时候添加主键 + +```sql +mysql> create table t18( + -> id int, + -> name varchar(10), + -> primary key(id) + -> ); +Query OK, 0 rows affected (0.00 sec) + +mysql> desc t18; ++-------+-------------+------+-----+---------+-------+ +| Field | Type | Null | Key | Default | Extra | ++-------+-------------+------+-----+---------+-------+ +| id | int(11) | NO | PRI | 0 | | +| name | varchar(10) | YES | | NULL | | ++-------+-------------+------+-----+---------+-------+ +2 rows in set (0.00 sec) +``` + +方法三:更改表的时候添加主键 + +```sql +mysql> create table t20( + -> id int, + -> name varchar(10) + -> ); +Query OK, 0 rows affected (0.00 sec) + +mysql> alter table t20 add primary key (id); # 更改表添加主键 +Query OK, 0 rows affected (0.08 sec) +Records: 0 Duplicates: 0 Warnings: 0 + +mysql> desc t20; ++-------+-------------+------+-----+---------+-------+ +| Field | Type | Null | Key | Default | Extra | ++-------+-------------+------+-----+---------+-------+ +| id | int(11) | NO | PRI | 0 | | +| name | varchar(10) | YES | | NULL | | ++-------+-------------+------+-----+---------+-------+ +2 rows in set (0.00 sec) +``` + +#### 1.12.2 创建组合键 + + ![1536736467251](https://yp.smallkun.cn/markdown/1536736467251.png!compress) + +#### 1.12.3 查看主键 + + ![1536736627655](https://yp.smallkun.cn/markdown/1536736627655.png!compress) + +#### 1.12.3 删除主键 + + ![1536736700169](https://yp.smallkun.cn/markdown/1536736700169.png!compress) + +#### 1.12.4 选择主键的原则 + +1、 最少性:尽量选择一个字段做主键 + +2、 稳定性:尽量选择更新少的列做主键 + +3、 尽量选择数字型的列做主键 + +#### 1.12.5 主键思考题 + +1、在主键列输入的数值,允许为空吗? 不可以 + +2、 一个表可以有多个主键吗? 不可以 + +3、 在一个学校数据库中,如果一个学校内允许重名的学员,但是一个班级内不允许学员重名,可以组合班级和姓名两个字段一起来作为主键吗? 可以 + +4、 标识列(自动增长列)允许为字符数据类型吗? 不可以 + +5、 表中没有合适的列作为主键怎么办? 添加自动增加列 + +6、 如果标识列A的初始值为1,增长量为1,则输入三行数据以后,再删除两行,下次再输入数据行的时候,标识值从多少开始? 从4开始 + +## 1.13 列属性——唯一键 + +特点: + +1、不能重复,可以为空 + +2、一个表可以有多个唯一键 + +作用: + +1、 保证数据不能重复。保证数据完整性 + +2、 加快数据访问 + +#### 1.13.1 添加唯一键 + +方法一:创建表的时候添加唯一键 + + ```sql +mysql> create table t22( + -> id int primary key, + -> name varchar(20) unique, #通过unique添加唯一键 + -> addr varchar(100) unique + -> ); +Query OK, 0 rows affected (0.00 sec) + +mysql> insert into t22 values (1,'tom','上海'); +Query OK, 1 row affected (0.05 sec) + +mysql> insert into t22 values (2,'tom','北京'); # name重复了,报错 +ERROR 1062 (23000): Duplicate entry 'tom' for key 'name' +mysql> insert into t22 values (2,'berry','上海'); # addr重复了 +ERROR 1062 (23000): Duplicate entry '上海' for key 'addr' + ``` + +还有一种方法 + +```sql +mysql> create table t26( + -> id int, + -> name varchar(20), + -> addr varchar(20), + -> primary key(id), + -> unique (name), # 添加唯一键 + -> unique (addr) + -> ); +Query OK, 0 rows affected (0.06 sec) +``` + + + +方法二:修改表的时候添加唯一键 + +```sql +mysql> create table t23( + -> id int primary key, + -> name varchar(20) + -> ); +Query OK, 0 rows affected (0.02 sec) + +mysql> alter table t23 add unique (name); # 添加一个唯一键 +Query OK, 0 rows affected (0.02 sec) +Records: 0 Duplicates: 0 Warnings: 0 +``` + +一次添加多个唯一键 + +```sql +mysql> create table t24( + -> id int primary key, + -> name varchar(20), + -> addr varchar(20) + -> ); +Query OK, 0 rows affected (0.06 sec) + +mysql> alter table t24 add unique(name),add unique(addr); +Query OK, 0 rows affected (0.09 sec) +Records: 0 Duplicates: 0 Warnings: 0 +``` + +添加组合唯一键 + +```sql +mysql> create table t25( + -> id int primary key, + -> name varchar(20), + -> addr varchar(20) + -> ); +Query OK, 0 rows affected (0.09 sec) + +mysql> alter table t25 add unique(name,addr); +Query OK, 0 rows affected (0.01 sec) +Records: 0 Duplicates: 0 Warnings: 0 +``` + +#### 1.13.2查看唯一键 + + ```sql +mysql> show create table t26\G +*************************** 1. row *************************** + Table: t26 +Create Table: CREATE TABLE `t26` ( + `id` int(11) NOT NULL DEFAULT '0', + `name` varchar(20) DEFAULT NULL, + `addr` varchar(20) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`), # 唯一键 + UNIQUE KEY `addr` (`addr`) # 唯一键 +) ENGINE=InnoDB DEFAULT CHARSET=utf8 +1 row in set (0.00 sec) + +mysql> show create table t25\G +*************************** 1. row *************************** + Table: t25 +Create Table: CREATE TABLE `t25` ( + `id` int(11) NOT NULL, + `name` varchar(20) DEFAULT NULL, + `addr` varchar(20) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`,`addr`) # 组合唯一键 +) ENGINE=InnoDB DEFAULT CHARSET=utf8 +1 row in set (0.00 sec) + ``` + +添加唯一键,给唯一键取名 + +```sql +mysql> create table t27( + -> name varchar(20) + -> ); +Query OK, 0 rows affected (0.03 sec) + +mysql> alter table t27 add unique UQ_name(name); +Query OK, 0 rows affected (0.00 sec) +Records: 0 Duplicates: 0 Warnings: 0 + +mysql> show create table t27\G +*************************** 1. row *************************** + Table: t27 +Create Table: CREATE TABLE `t27` ( + `name` varchar(20) DEFAULT NULL, + UNIQUE KEY `UQ_name` (`name`) # 唯一键的名字是UQ_name +) ENGINE=InnoDB DEFAULT CHARSET=utf8 +1 row in set (0.00 sec) +``` + +#### 1.13.3 删除唯一键 + +通过唯一键的名字来删除唯一键 + +```sql +语法:alter table 表名 drop index 唯一键名称 +``` + + ![1536739081697](https://yp.smallkun.cn/markdown/1536739081697.png!compress) + + + +问题:主键和唯一键的区别? + +1、主键不能重复,不能为空,唯一键不能重复,可以为空 + +2、主键只有一个,唯一键可以有多个。 + +## 1.14列属性——备注(comment) + +为了程序员之间的相互交流 ![1536739540981](https://yp.smallkun.cn/markdown/1536739540981.png!compress) + +## 1.15 SQL注释 + +单行注释:--或# + +多行注释:/* */ + + ![1536739661909](https://yp.smallkun.cn/markdown/1536739661909.png!compress) + + + +## 1.16 数据完整性介绍 + + ![1536739894901](https://yp.smallkun.cn/markdown/1536739894901.png!compress) + +#### 1.16.1 保证实体完整性 + +1、 主键约束 + +2、 唯一约束 + +3、 自动增长列 + +#### 1.16.2 保证域完整性 + +1、 数据类型约束 + +2、 非空约束 + +3、 默认值约束 + +#### 1.16.3 保证引用完整性 + +1、外键约束:从表中的公共字段是主表的外键 + +## 1.17 引用完整性 + +#### 1.17.1 主表和从表 + +两个表建立关系(两个表只要有公共字段就有关系),一个表称为主表,一个表称为从表。 + +外键约束可以实现: + +1、 主表中没有的从表中不允许插入 + +2、 从表中有的主表中不允许删除 + +3、 不能更改主表中的值而导致从表中的记录孤立存在。 + +4、 先删除从表,再删除主表 + +#### 1.17.2 外键(foreign key) + +1、 外键:从表中的公共字段,公共字段的名字可以不一样,但是数据类型必须一样。 + +2、 外键约束用来保证引用完整性 + +#### 1.17.3 添加外键 + +方法一:创建表的时候添加外键 + + ```sql +create table stuinfo( + stuno char(4) primary key, + name varchar(10) not null +); + +create table stumarks( + stuid char(4) primary key, + score tinyint unsigned, + foreign key (stuid) references stuinfo(stuno) +); + ``` + + 方法二:修改表的时候添加外键 + +```sql +mysql> create table stuinfo( + -> stuno char(4) primary key, + -> name varchar(10) not null + -> ); +Query OK, 0 rows affected (0.00 sec) + +mysql> create table stumarks( + -> stuid char(4) primary key, + -> score tinyint unsigned + -> ); +Query OK, 0 rows affected (0.06 sec) + +语法: alter table 从表 add foreign key (从表的公共字段) references 主表(公共字段) + +mysql> alter table stumarks add foreign key (stuid) references stuinfo(stuno); +Query OK, 0 rows affected (0.06 sec) +Records: 0 Duplicates: 0 Warnings: 0 +``` + +脚下留心:要创建外键必须是innodb引擎,myisam不支持外键约束 + +#### 1.17.4 查看外键 + + ![1536742477588](https://yp.smallkun.cn/markdown/1536742477588.png!compress) + + + +#### 1.17.5 删除外键 + +通过外键的名字删除外键 + +```sql +语法:alter table 表名 drop foreign key 外键名 +``` + +例题 + +```sql +mysql> alter table stumarks drop foreign key stumarks_ibfk_1; +Query OK, 0 rows affected (0.02 sec) +Records: 0 Duplicates: 0 Warnings: 0 +``` + +。 + +## 1.18 外键操作 + +1、 严格操作(前面讲的是严格操作) + +2、 置空操作(set null):如果主表记录删除或更新,从表置空 + +3、 级联操作(cascade):如果主表记录删除或更新,从表级联 + +一般来说:主表删除的时候,从表置空操作,主表更新的时候,从表级联操作。 + +```sql +语法:foreign key(外键) references 主表(关键字段)[主表删除是的动作][主表更新时候的动作] +``` + +例题 + +```sql +mysql> create table stuinfo( + -> stuno char(4) primary key, + -> name varchar(10) not null + -> ); +Query OK, 0 rows affected (0.02 sec) + +mysql> create table stumarks( + -> stuid int auto_increment primary key, + -> stuno char(4) , + -> score tinyint unsigned, + -> foreign key (stuno) references stuinfo(stuno) on delete set null on update cascade + -> ); +Query OK, 0 rows affected (0.00 sec) + +mysql> insert into stuinfo values ('s101','tom'); +Query OK, 1 row affected (0.00 sec) + +mysql> insert into stumarks values (null,'s101',88); +Query OK, 1 row affected (0.00 sec) + +mysql> select * from stuinfo; ++-------+------+ +| stuno | name | ++-------+------+ +| s101 | tom | ++-------+------+ +1 row in set (0.00 sec) + +mysql> update stuinfo set stuno='s102' where stuno='s101'; # 更新时级联 +Query OK, 1 row affected (0.00 sec) +Rows matched: 1 Changed: 1 Warnings: 0 + +mysql> select * from stumarks; ++-------+-------+-------+ +| stuid | stuno | score | ++-------+-------+-------+ +| 1 | s102 | 88 | ++-------+-------+-------+ +1 row in set (0.00 sec) + +mysql> delete from stuinfo where stuno='s102'; # 删除时置空 +Query OK, 1 row affected (0.02 sec) + +mysql> select * from stumarks; ++-------+-------+-------+ +| stuid | stuno | score | ++-------+-------+-------+ +| 1 | NULL | 88 | ++-------+-------+-------+ +1 row in set (0.00 sec) + +``` + +## 1.19客户端介绍 + +第一:命令行 + +第二:MySQL-Front和Navicat + +#### MySQL-Front + + ![1536744583450](https://yp.smallkun.cn/markdown/1536744583450.png!compress) + + ![1536744649329](https://yp.smallkun.cn/markdown/1536744649329.png!compress) + + ![1536744676337](https://yp.smallkun.cn/markdown/1536744676337.png!compress) + + ![1536744701721](https://yp.smallkun.cn/markdown/1536744701721.png!compress) + + + + + + + + + + + + + + + + + + + + + + + diff --git a/课件/MySQL/3. 数据库设计与查询语句.md b/课件/MySQL/3. 数据库设计与查询语句.md new file mode 100644 index 0000000..b43adb5 --- /dev/null +++ b/课件/MySQL/3. 数据库设计与查询语句.md @@ -0,0 +1,990 @@ +## 测试数据 + +```sql +/*stu测试数据*/ +create table stu +( + stuNo char(6) primary key, + stuName varchar(10) not null, + stuSex char(2) not null, + stuAge tinyint not null , + stuSeat tinyint not null, + stuAddress varchar(10) not null, + ch tinyint, + math tinyint +); + + +insert into stu values ('s25301','张秋丽','男',18,1,'北京',80,null); +insert into stu values ('s25302','李文才','男',31,3,'上海',77,76); +insert into stu values ('s25303','李斯文','女',22,2,'北京',55,82); +insert into stu values ('s25304','欧阳俊雄','男',28,4,'天津',null,74); +insert into stu values ('s25305','诸葛丽丽','女',23,7,'河南',72,56); +insert into stu values ('s25318','争青小子','男',26,6,'天津',86,92); +insert into stu values ('s25319','梅超风','女',23,5,'河北',74,67); + +insert into stu values ('s25320','Tom','男',24,8,'北京',65,67); +insert into stu values ('s25321','Tabm','女',23,9,'河北',88,77); + +/*stuinfo测试数据*/ +create table stuinfo +( + stuNo char(6) primary key, + stuName varchar(10) not null, + stuSex char(2) not null, + stuAge tinyint not null , + stuSeat tinyint not null, + stuAddress varchar(10) not null +); + + +insert into stuinfo values ('s25301','张秋丽','男',18,1,'北京'); +insert into stuinfo values ('s25302','李文才','男',31,3,'上海'); +insert into stuinfo values ('s25303','李斯文','女',22,2,'北京'); +insert into stuinfo values ('s25304','欧阳俊雄','男',28,4,'天津'); +insert into stuinfo values ('s25305','诸葛丽丽','女',23,7,'河南'); +insert into stuinfo values ('s25318','争青小子','男',26,6,'天津'); +insert into stuinfo values ('s25319','梅超风','女',23,5,'河北'); + +/*stuMarks测试数据*/ + +create table stuMarks +( +examNo char(7) primary key, +stuNo char(6) not null , +writtenExam int, +labExam int +); + +insert into stumarks values ('s271811','s25303',80,58); +insert into stumarks values ('s271813','s25302',50,90); +insert into stumarks values ('s271815','s25304',65,50); +insert into stumarks values ('s271816','s25301',77,82); +insert into stumarks values ('s271819','s25318',56,48); +insert into stumarks values ('s271820','s25320',66,77); +``` + +## 1.1 今日目标 + +1. 理解实体之间的关系 +2. 理解绘制E-R图 +3. 理解三范式 +4. 理解范式和性能的关系 +5. 能够查询表中的数据 +6. 理解聚合函数 +7. 理解模糊查询 +8. 理解分组查询 + +## 1.2 数据库基本概念 + +1、关系:两个表的公共字段 + +2、行:也称记录,也称实体 + +3、列:也称字段,也称属性 + +``` +就表结构而言,表分为行和列; +就表数据而言,分为记录和字段; +就面向对象而言,一个记录就是一个实体,一个字段就是一个属性。 +``` + +4、数据冗余:相同的数据存储在不同的地方 + +``` +脚下留心: +1、冗余只能减少,不能杜绝。 +2、减少冗余的方法是分表 +3、为减少数据查找的麻烦,允许数据有一定的冗余 +``` + +5、数据完整性:正确性+准确性=数据完整性 + +``` +正确性:数据类型正确 +准确性:数据范围要准确 +``` + +思考:学生的年龄是整型,输入1000岁,正确性和准确性如何? + +答:正确的,但不准确 + +思考:年龄是整形的,收入了字符串,正确性和准确性如何? + +答:不正确 + + + +## 1.3 实体和实体之间的关系 + +1、一对一 + +2、一对多 (多对一) + +3、多对多 ![1536975724695](https://yp.smallkun.cn/markdown/1536975724695.png!compress!compress) + + + +#### 1.3.1 一对多 1:N + +1、主表中的一条记录对应从表中的多条记录。 + +2、一对多和多对一是一样的 + + ![1536976096582](https://yp.smallkun.cn/markdown/1536976096582.png!compress!compress) + +如何实现一对多? + +答:主键和非主键建关系 + +问题:说出几个一对多的关系? + +答:班级表和学生表、 班主表和学生表 + + + +#### 1.3.2 一对一(1:1) + +1、主表中的一条记录对应从表中的一条记录 + + ![1536976513236](https://yp.smallkun.cn/markdown/1536976513236.png!compress!compress) + +如何实现一对一? + +主键和主键建关系就能实现一对一。 + +``` +思考:一对一两个表完全可以用一个表实现,为什么还要分成两个表? + +答:在字段数量很多情况下,数据量也就很大,每次查询都需要检索大量数据,这样效率低下。我们可以将所有字段分成两个部分,“常用字段”和“不常用字段”,这样对大部分查询者来说效率提高了。【表的垂直分割】 +``` + + + +#### 1.3.3 多对多(N:M) + +主表中的一条记录对应从表中的多条记录,从表中的一条记录对应主表中的多条记录 + +班级和讲师的关系 + + ![1536977577667](https://yp.smallkun.cn/markdown/1536977577667.png!compress!compress) + + + +如何实现多对多? + +答:建立第三张表来保存关系。 + +问题:说出几个多对多的关系? + +1、科目表和学生表的关系 2、商品表和订单表 3、游戏目录表和玩家表 + + + +## 1.4 数据库设计的步骤 + + ![1536977906540](https://yp.smallkun.cn/markdown/1536977906540.png!compress!compress) + + + +#### 1.4.1 数据库设计具体步骤 + +1、 收集信息:与该系统有关人员进行交流、坐谈,充分理解数据库需要完成的任务 + +2、 标识对象(实体-Entity)标识数据库要管理的关键对象或实体 + +3、 标识每个实体的属性(Attribute) + +4、 标识对象之间的关系(Relationship) + +5、 将模型转换成数据库 + +6、 规范化 + +#### 1.4.2 绘制E-R图 + + E-R(Entity-Relationship)实体关系图 + +E-R图的语法 + + ![1536978470142](https://yp.smallkun.cn/markdown/1536978470142.png!compress!compress) + +绘制E-R图 + + ![1536978565499](https://yp.smallkun.cn/markdown/1536978565499.png!compress!compress) + + + +#### 1.4.3 将E-R图转成表 + +1、 实体转成表,属性转成字段 + +2、 如果没有合适的字段做主键,给表添加一个自动增长列做主键。 + + + +#### 1.4.4 例题 + +1、项目需求 + +``` +BBS论坛的基本功能: +用户注册和登录,后台数据库需要存放用户的注册信息和在线状态信息; +用户发贴,后台数据库需要存放贴子相关信息,如贴子内容、标题等; +用户可以对发帖进行回复; +论坛版块管理:后台数据库需要存放各个版块信息,如版主、版块名称、贴子数等; +``` + +2、标识对象 + +``` +参与的对象有:用户、发的帖子、跟帖、板块 +``` + +3、标识对象的属性 + + ![1536978271446](https://yp.smallkun.cn/markdown/1536978271446.png!compress!compress) + +4、建立关系,绘制E-R图 + + ![1536978734804](https://yp.smallkun.cn/markdown/1536978734804.png!compress!compress) + +5、将E-R图转出表结构 + + + +## 1.5 数据规范化 + +Codd博士定义了6个范式来规范化数据库,范式由小到大来约束,范式越高冗余越小,但表的个数也越多。实验证明,三范式是性价比最高的。 + +#### 1.5.1 第一范式:确保每列原子性 + +第一范式确保每个字段不可再分 + + ![1536979522448](https://yp.smallkun.cn/markdown/1536979522448.png!compress!compress) + +思考:如下表设计是否合理? + + ![1536979672041](https://yp.smallkun.cn/markdown/1536979672041.png!compress!compress) + +不合理。不满足第一范式,上课时间可以再分 + + ![1536979718323](https://yp.smallkun.cn/markdown/1536979718323.png!compress!compress) + + + +思考:地址包含省、市、县、地区是否需要拆分? + +答:如果仅仅起地址的作用,不需要统计,可以不拆分;如果有按地区统计的功能需要拆分。 + +在实际项目中,建议拆分。 + + + +#### 1.5.2 第二范式:非键字段必须依赖于键字段 + +一个表只能描述一件事 + + ![1536980482113](https://yp.smallkun.cn/markdown/1536980482113.png!compress!compress) + +思考:如下表设计是否合理? + + ![1536980574792](https://yp.smallkun.cn/markdown/1536980574792.png!compress) + + + +#### 1.5.3 第三范式:消除传递依赖 + +在所有的非键字段中,不能有传递依赖 + + ![1536981861980](https://yp.smallkun.cn/markdown/1536981861980.png!compress!compress) + +下列设计是否满足第三范式? + + ![1536982061259](https://yp.smallkun.cn/markdown/1536982061259.png!compress!compress) + +不满足,因为语文和数学确定了,总分就确定了。 + +``` +多学一招:上面的设计不满足第三范式,但是高考分数表就是这样设计的,为什么? + +答:高考分数峰值访问量非常大,这时候就是性能更重要。当性能和规范化冲突的时候,我们首选性能。这就是“反三范式”。 +``` + +#### 1.5.4 数据库设计的例题 + +1、需求 + +``` +公司承担多个工程项目,每一项工程有:工程号、工程名称、施工人员等 +公司有多名职工,每一名职工有:职工号、姓名、性别、职务(工程师、技术员)等 +公司按照工时和小时工资率支付工资,小时工资率由职工的职务决定(例如,技术员的小时工资率与工程师不同) +``` + +2、工资表 + + ![1536982976983](https://yp.smallkun.cn/markdown/1536982976983.png!compress!compress) + +3、将工资表转成数据库表 + + ![1536983011535](https://yp.smallkun.cn/markdown/1536983011535.png!compress!compress) + +4、这个表存在的问题 + +``` +A:新人入职需要虚拟一个项目 + +B:职务更改,小时工资率可能会忘记更改,造成数据不完整 + +C:有人离职,删除记录后,工程也没有了 +``` + +5、规范化表 + +``` +第一步:这个表满足第一范式 + +第二步:这个表不是描述了一件事情 +``` + + ![1536983332419](https://yp.smallkun.cn/markdown/1536983332419.png!compress!compress) + + + +``` +第三步:是否满足第三范式 +``` + + ![1536983422611](https://yp.smallkun.cn/markdown/1536983422611.png!compress!compress) + +更改如下: + + ![1536983406042](https://yp.smallkun.cn/markdown/1536983406042.png!compress!compress) + + + +## 1.6 查询语句 + +```sql +语法:select [选项] 列名 [from 表名] [where 条件] [group by 分组] [order by 排序][having 条件] [limit 限制] +``` + +#### 1.6.1 字段表达式 + +```sql +mysql> select '锄禾日当午'; ++------------+ +| 锄禾日当午 | ++------------+ +| 锄禾日当午 | ++------------+ + +mysql> select 10*10; ++-------+ +| 10*10 | ++-------+ +| 100 | ++-------+ +``` + +通过as给字段取别名 + +```sql +mysql> select '锄禾日当午' as content; ++------------+ +| content | ++------------+ +| 锄禾日当午 | ++------------+ +1 row in set (0.00 sec) + +mysql> select 10*10 as result; ++--------+ +| result | ++--------+ +| 100 | ++--------+ +1 row in set (0.00 sec) +``` + +多学一招:as可以省略 + +```sql +mysql> select 10*10 result; ++--------+ +| result | ++--------+ +| 100 | ++--------+ +1 row in set (0.00 sec) +``` + +#### 1.6.2 from子句 + +from:来自,from后面跟的是数据源。数据源可以有多个。返回笛卡尔积。 + +插入测试表 + +```sql +mysql> create table t1( + -> id int, + -> name varchar(10) + -> ); +Query OK, 0 rows affected (0.05 sec) + +mysql> create table t2( + -> field1 varchar(10), + -> field2 varchar(10) + -> ); +Query OK, 0 rows affected (0.00 sec) + +mysql> insert into t1 values (1,'tom'),(2,'berry'); +Query OK, 2 rows affected (0.00 sec) +Records: 2 Duplicates: 0 Warnings: 0 + +mysql> insert into t2 values ('333','333'),('444','444'); +Query OK, 2 rows affected (0.02 sec) +Records: 2 Duplicates: 0 Warnings: 0 +``` + +测试多个数据源 + +```sql +mysql> select * from t1,t2; # 返回笛卡尔积 ++------+-------+--------+--------+ +| id | name | field1 | field2 | ++------+-------+--------+--------+ +| 1 | tom | 333 | 333 | +| 2 | berry | 333 | 333 | +| 1 | tom | 444 | 444 | +| 2 | berry | 444 | 444 | ++------+-------+--------+--------+ +4 rows in set (0.00 sec) +``` + +#### 1.6.3 dual表 + +dual表是一个伪表。在有些特定情况下,没有具体的表的参与,但是为了保证select语句的完整又必须要一个表名,这时候就使用伪表。 + +```sql +mysql> select 10*10 as result from dual; #dual表是用来保证select语句的完整性。 ++--------+ +| result | ++--------+ +| 100 | ++--------+ +``` + +#### 1.6.4 where子句 + +where后面跟的是条件,在数据源中进行筛选。返回条件为真记录 + +MySQL支持的运算符 + +1. `>` 大于 +2. `<`小于 +3. `>=` +4. `<=` +5. `=` +6. `!=` +7. and 与 +8. or 或 +9. not 非 + +```sql +mysql> select * from stu where stusex='男'; # 查找性别是男的记录 +mysql> select * from stu where stuage>=20; # 查找年龄不低于20的记录 +``` + +思考:如下代码输出什么 + +```sql +select * from stu where 1 # 返回所有数据库 +select * from stu where 0 #返回空记录 +``` + +思考:如何查找北京和上海的学生 + +```sql +mysql> select * from stu where stuaddress='上海' or stuaddress='北京'; ++--------+---------+--------+--------+---------+------------+------+------+ +| stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ch | math | ++--------+---------+--------+--------+---------+------------+------+------+ +| s25301 | 张秋丽 | 男 | 18 | 1 | 北京 | 80 | NULL | +| s25302 | 李文才 | 男 | 31 | 3 | 上海 | 77 | 76 | +| s25303 | 李斯文 | 女 | 22 | 2 | 北京 | 55 | 82 | +| s25320 | Tom | 男 | 24 | 8 | 北京 | 65 | 67 | ++--------+---------+--------+--------+---------+------------+------+------+ +``` + +#### 1.6.5 in | not in + + 上面的查询上海和北京的学生的SQL可以通过in语句来实现 + +```sql +mysql> select * from stu where stuaddress in ('北京','上海'); +``` + +练习: + +1、查找学号是s25301,s25302,s25303的学生 + +```sql +mysql> select * from stu where stuno in ('s25301','s25302','s25303'); +``` + +2、查找年龄是18,19,20的学生 + +```sql +mysql> select * from stu where stuage in(18,19,20); +``` + +3、查找不是北京和上海的学生 + +```sql +mysql> select * from stu where stuaddress not in ('北京','上海'); +``` + +#### 1.6.6 between…and|not between…and + +查找某个范围的记录 + +1、查找年龄在18~20之间的学生 + +```sql +mysql> select * from stu where stuage>=18 and stuage<=20; # 方法一 + +mysql> select * from stu where stuage between 18 and 20; # 方法二 +``` + +2、查找年龄不在18~20之间的学生 + +```sql +mysql> select * from stu where stuage<18 or stuage>20; #方法一 + +mysql> select * from stu where not (stuage>=18 and stuage<=20); + +mysql> select * from stu where stuage not between 18 and 20; +``` + +#### 1.6.7 is null | is not null + + 脚下留心:查询一个为空的字段不能用等于,必须用is null + +查找缺考的学生 + +```sql +mysql> select * from stu where ch is null or math is null; # 查找缺考的人 ++--------+----------+--------+--------+---------+------------+------+------+ +| stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ch | math | ++--------+----------+--------+--------+---------+------------+------+------+ +| s25301 | 张秋丽 | 男 | 18 | 1 | 北京 | 80 | NULL | +| s25304 | 欧阳俊雄 | 男 | 28 | 4 | 天津 | NULL | 74 | ++--------+----------+--------+--------+---------+------------+------+------+ +``` + +查找参加考试的学生 + +```sql +mysql> select * from stu where ch is not null and math is not null; +``` + +#### 1.6.8 聚合函数 + +1. sum() 求和 +2. avg() 求平均值 +3. max() 求最大值 +4. min() 求最小值 +5. count() 求记录数 + +```sql +#求语文总分、语文平均分、语文最高分、语文最低分、总人数 + +mysql> select sum(ch) '语文总分',avg(ch) '语文平均分', max(ch) '语文最高分',min(ch) '语文最低分',count(*) '总人数' from stu; ++----------+------------+------------+------------+--------+ +| 语文总分 | 语文平均分 | 语文最高分 | 语文最低分 | 总人数 | + ++----------+------------+------------+------------+--------+ +| 597 | 74.6250 | 88 | 55 | 9 | ++----------+------------+------------+------------+--------+ +1 row in set (0.00 sec) +``` + +#### 1.6.9 通配符 + +1. _ [下划线] 表示任意一个字符 +2. % 表示任意字符 + +练习 + +1、满足“T_m”的有(A、C) + +A:Tom B:Toom C:Tam D:Tm E:Tmo + +2、满足“T_m_”的有(B、C ) + +A:Tmom B:Tmmm C:T1m2 D:Tmm E:Tm + +3、满足“张%”的是(A、B、C、D) + +A:张三 B:张三丰 C:张牙舞爪 D:张 E:小张 + +4、满足“%诺基亚%”的是(A、B、C、D) + +A:诺基亚2100 B:2100诺基亚 C:把我的诺基亚拿过来 D:诺基亚 + +#### 16.10 模糊查询(like) + +```sql +# 查找姓张的同学 +mysql> select * from stu where stuname like '张%'; ++--------+---------+--------+--------+---------+------------+------+------+ +| stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ch | math | ++--------+---------+--------+--------+---------+------------+------+------+ +| s25301 | 张秋丽 | 男 | 18 | 1 | 北京 | 80 | NULL | ++--------+---------+--------+--------+---------+------------+------+------+ +1 row in set (0.00 sec) +#例题 +mysql> select * from stu where stuname like 'T_m'; ++--------+---------+--------+--------+---------+------------+------+------+ +| stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ch | math | ++--------+---------+--------+--------+---------+------------+------+------+ +| s25320 | Tom | 男 | 24 | 8 | 北京 | 65 | 67 | ++--------+---------+--------+--------+---------+------------+------+------+ +1 row in set (0.00 sec) +``` + +#### 1.6.11 order by排序 + +asc:升序【默认】 + +desc:降序 + +```sql +mysql> select * from stu order by ch desc; # 语文成绩降序排列 + +mysql> select * from stu order by math asc; # 数学成绩升序排列 + +mysql> select * from stu order by math; # 默认升序排列 +``` + +多列排序 + +```sql +#年龄升序,成绩降序 +mysql> select *,(ch+math) as '总分' from stu order by stuage asc,(ch+math) desc; +``` + +思考如下代码表示什么含义 + +```sql +select * from stu order by stuage desc,ch desc; #年龄降序,语文降序 +select * from stu order by stuage desc,ch asc; #年龄降序,语文升序 +select * from stu order by stuage,ch desc; #年龄升序、语文降序 +select * from stu order by stuage,ch; #年龄升序、语文升序 +``` + +#### 1.6.12 group by 【分组查询】 + +将查询的结果分组,分组查询目的在于统计数据。 + +```sql +# 按性别分组,显示每组的平均年龄 +mysql> select avg(stuage) as '年龄',stusex from stu group by stusex; ++---------+--------+ +| 年龄 | stusex | ++---------+--------+ +| 22.7500 | 女 | +| 25.4000 | 男 | ++---------+--------+ +2 rows in set (0.00 sec) +# 按地区分组,每个地区的平均年龄 +mysql> select avg(stuage) as '年龄',stuaddress from stu group by stuaddress; ++---------+------------+ +| 年龄 | stuaddress | ++---------+------------+ +| 31.0000 | 上海 | +| 21.3333 | 北京 | +| 27.0000 | 天津 | +| 23.0000 | 河北 | +| 23.0000 | 河南 | ++---------+------------+ +5 rows in set (0.00 sec) +脚下留心: +1、如果是分组查询,查询字段必须是分组字段和聚合函数。 +2、查询字段是普通字段,只取第一个值 +``` + + ![1536999666442](https://yp.smallkun.cn/markdown/1536999666442.png!compress!compress) + +通过group_concat()函数将同一组的值连接起来显示 + +```sql +mysql> select group_concat(stuname),stusex from stu group by stusex; ++-------------------------------------+--------+ +| group_concat(stuname) | stusex | ++-------------------------------------+--------+ +| 李斯文,诸葛丽丽,梅超风,Tabm | 女 | +| 张秋丽,李文才,欧阳俊雄,争青小子,Tom | 男 | ++-------------------------------------+--------+ +2 rows in set (0.00 sec) +多学一招:【了解】 +1、分组后的结果默认会按升序排列显示 +2、也是可以使用desc实现分组后的降序 +``` + + ![1536999889281](https://yp.smallkun.cn/markdown/1536999889281.png!compress!compress) + + ![1536999987356](https://yp.smallkun.cn/markdown/1536999987356.png!compress!compress) + +多列分组 + +```sql +mysql> select stuaddress,stusex,avg(stuage) from stu group by stuaddress,stusex; ++------------+--------+-------------+ +| stuaddress | stusex | avg(stuage) | ++------------+--------+-------------+ +| 上海 | 男 | 31.0000 | +| 北京 | 女 | 22.0000 | +| 北京 | 男 | 21.0000 | +| 天津 | 男 | 27.0000 | +| 河北 | 女 | 23.0000 | +| 河南 | 女 | 23.0000 | ++------------+--------+-------------+ +6 rows in set (0.00 sec) +``` + +#### 1.6.13 having条件 + +``` +思考:数据库中的表是一个二维表,返回的结果是一张二维表,既然能在数据库的二维表中进行查询,能否在结果集的二维表上继续进行查询? + +答:可以,having条件就是在结果集上继续进行筛选。 +``` + +例题 + +```sql +mysql> select * from stu where stusex='男'; # 从数据库中查找 ++--------+----------+--------+--------+---------+------------+------+------+ +| stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ch | math | ++--------+----------+--------+--------+---------+------------+------+------+ +| s25301 | 张秋丽 | 男 | 18 | 1 | 北京 | 80 | NULL | +| s25302 | 李文才 | 男 | 31 | 3 | 上海 | 77 | 76 | +| s25304 | 欧阳俊雄 | 男 | 28 | 4 | 天津 | NULL | 74 | +| s25318 | 争青小子 | 男 | 26 | 6 | 天津 | 86 | 92 | +| s25320 | Tom | 男 | 24 | 8 | 北京 | 65 | 67 | ++--------+----------+--------+--------+---------+------------+------+------+ +5 rows in set (0.00 sec) + +mysql> select * from stu having stusex='男'; # 从结果集中查找 ++--------+----------+--------+--------+---------+------------+------+------+ +| stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ch | math | ++--------+----------+--------+--------+---------+------------+------+------+ +| s25301 | 张秋丽 | 男 | 18 | 1 | 北京 | 80 | NULL | +| s25302 | 李文才 | 男 | 31 | 3 | 上海 | 77 | 76 | +| s25304 | 欧阳俊雄 | 男 | 28 | 4 | 天津 | NULL | 74 | +| s25318 | 争青小子 | 男 | 26 | 6 | 天津 | 86 | 92 | +| s25320 | Tom | 男 | 24 | 8 | 北京 | 65 | 67 | ++--------+----------+--------+--------+---------+------------+------+------+ +5 rows in set (0.00 sec) +``` + +思考如下语句是否正确 ![1537001246956](https://yp.smallkun.cn/markdown/1537001246956.png!compress!compress) + + ![1537001432304](https://yp.smallkun.cn/markdown/1537001432304.png!compress!compress) + +having和where的区别: + +where是对原始数据进行筛选,having是对记录集进行筛选。 + +#### 1.6.14 limit + +语法:limit 起始位置,显示长度 + +```sql +mysql> select * from stu limit 0,2; # 从0的位置开始,取两条数据 ++--------+---------+--------+--------+---------+------------+------+------+ +| stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ch | math | ++--------+---------+--------+--------+---------+------------+------+------+ +| s25301 | 张秋丽 | 男 | 18 | 1 | 北京 | 80 | NULL | +| s25302 | 李文才 | 男 | 31 | 3 | 上海 | 77 | 76 | ++--------+---------+--------+--------+---------+------------+------+------+ +2 rows in set (0.00 sec) + +mysql> select * from stu limit 2,2; # 从2的位置开始,取两条数据 ++--------+----------+--------+--------+---------+------------+------+------+ +| stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ch | math | ++--------+----------+--------+--------+---------+------------+------+------+ +| s25303 | 李斯文 | 女 | 22 | 2 | 北京 | 55 | 82 | +| s25304 | 欧阳俊雄 | 男 | 28 | 4 | 天津 | NULL | 74 | ++--------+----------+--------+--------+---------+------------+------+------+ +``` + +起始位置可以省略,默认是从0开始 + +```sql +mysql> select * from stu limit 2; ++--------+---------+--------+--------+---------+------------+------+------+ +| stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ch | math | ++--------+---------+--------+--------+---------+------------+------+------+ +| s25301 | 张秋丽 | 男 | 18 | 1 | 北京 | 80 | NULL | +| s25302 | 李文才 | 男 | 31 | 3 | 上海 | 77 | 76 | ++--------+---------+--------+--------+---------+------------+------+------+ +2 rows in set (0.00 sec) +``` + +例题:找出班级总分前三名 + +```sql +mysql> select *,(ch+math) total from stu order by total desc limit 0,3; ++--------+----------+--------+--------+---------+------------+------+------+-------+ +| stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ch | math | total | ++--------+----------+--------+--------+---------+------------+------+------+-------+ +| s25318 | 争青小子 | 男 | 26 | 6 | 天津 | 86 | 92 | 178 | +| s25321 | Tabm | 女 | 23 | 9 | 河北 | 88 | 77 | 165 | +| s25302 | 李文才 | 男 | 31 | 3 | 上海 | 77 | 76 | 153 | ++--------+----------+--------+--------+---------+------------+------+------+-------+ +``` + +多学一招:limit在update和delete语句中也是可以使用的。 + +#### 1.6.15 查询语句中的选项 + +查询语句中的选项有两个: + +1、 all:显示所有数据 【默认】 + +2、 distinct:去除结果集中重复的数据 + +```sql +mysql> select distinct stuaddress from stu; ++------------+ +| stuaddress | ++------------+ +| 上海 | +| 天津 | +| 河南 | +| 河北 | +| 北京 | ++------------+ +5 rows in set (0.00 sec) +``` + +## 1.7 union(联合) + +插入测试数据 + +```sql +mysql> create table GO1( + -> id int primary key, + -> name varchar(20)); +Query OK, 0 rows affected (0.06 sec) + +mysql> insert into Go1 values (1,'李白'),(2,'张秋丽'); +Query OK, 2 rows affected (0.02 sec) +Records: 2 Duplicates: 0 Warnings: 0 +``` + +#### 1.7.1 union的使用 + +作用:将多个select语句结果集纵向联合起来 + +```sql +语法:select 语句 union [选项] select 语句 union [选项] select 语句 +mysql> select stuno,stuname from stu union select id,name from Go1; ++--------+----------+ +| stuno | stuname | ++--------+----------+ +| s25301 | 张秋丽 | +| s25302 | 李文才 | +| s25303 | 李斯文 | +| s25304 | 欧阳俊雄 | +| s25305 | 诸葛丽丽 | +| s25318 | 争青小子 | +| s25319 | 梅超风 | +| s25320 | Tom | +| s25321 | Tabm | +| 1 | 李白 | +| 2 | 张秋丽 | ++--------+----------+ +``` + +例题:查询上海的男生和北京的女生 + +```sql +mysql> select stuname,stuaddress,stusex from stu where (stuaddress='上海' and stusex='男') or (stuaddress='北京' and stusex='女'); ++---------+------------+--------+ +| stuname | stuaddress | stusex | ++---------+------------+--------+ +| 张秋丽 | 上海 | 男 | +| 梅超风 | 北京 | 女 | ++---------+------------+--------+ +2 rows in set (0.00 sec) + +mysql> select stuname,stuaddress,stusex from stu where stuaddress='上海' and stusex='男' union select stuname,stuaddress,stusex from stu where stuaddress='北京' and stusex='女'; ++---------+------------+--------+ +| stuname | stuaddress | stusex | ++---------+------------+--------+ +| 张秋丽 | 上海 | 男 | +| 梅超风 | 北京 | 女 | ++---------+------------+--------+ +2 rows in set (0.02 sec) +``` + +#### 1.7.2 union的选项 + +union的选项有两个 + +1、 all:显示所有数据 + +2、 distinct:去除重复的数据【默认】 + +```sql +mysql> select name from go1 union select stuname from stu; ++----------+ +| name | ++----------+ +| 李白 | +| 张秋丽 | +| 李文才 | +| 李斯文 | +| 欧阳俊雄 | +| 诸葛丽丽 | +| 争青小子 | +| 梅超风 | +| Tom | +| Tabm | ++----------+ +``` + +默认是去重复的 + +```sql +mysql> select name from go1 union all select stuname from stu; # all不去重复记录 ++----------+ +| name | ++----------+ +| 李白 | +| 张秋丽 | +| 张秋丽 | +| 李文才 | +| 李斯文 | +| 欧阳俊雄 | +| 诸葛丽丽 | +| 争青小子 | +| 梅超风 | +| Tom | +| Tabm | ++----------+ +``` + +#### 1.7.3 union的注意事项 + +1、 union两边的select语句的字段个数必须一致 + +2、 union两边的select语句的字段名可以不一致,最终按第一个select语句的字段名。 + + 3、 union两边的select语句中的数据类型可以不一致。 + + diff --git a/课件/MySQL/4. 视图、事务、索引、函数.md b/课件/MySQL/4. 视图、事务、索引、函数.md new file mode 100644 index 0000000..f93d7b0 --- /dev/null +++ b/课件/MySQL/4. 视图、事务、索引、函数.md @@ -0,0 +1,1480 @@ +## 1.1 今日目标 + +1. 理解多表查询 +2. 理解子查询 +3. 能够创建视图 +4. 能够删除视图 +5. 能够查看创建视图的SQL语句 +6. 能够理解事务的作用 +7. 能够操作事务 +8. 理解索引的作用 +9. 能够创建索引 +10. 能够删除索引 +11. 知道常用的函数 +12. 了解预处理语句的作用 +13. 能够使用预处理语句 +14. 了解存储过程的作用 +15. 能够创建存储过程 +16. 能够调用存储过程 + +## 1.2 多表查询分类 + +将多个表的数据横向的联合起来。 +1、 内连接 +2、 外连接 + a) 左外连接 + b) 右外连接 +3、 交叉连接 +4、 自然连接 + +#### 1.2.1 内连接【inner join】 + +``` +语法一:select 列名 from 表1 inner join 表2 on 表1.公共字段=表2.公共字段 + +语法二:select 列名 from 表1,表2 where 表1.公共字段=表2.公共字段 +``` + +例题 + +```sql +方法一: +mysql> select stuname,stusex,writtenexam,labexam from stuinfo inner join stumarks on stuinfo.stuno=stumarks.stuno; ++----------+--------+-------------+---------+ +| stuname | stusex | writtenexam | labexam | ++----------+--------+-------------+---------+ +| 李斯文 | 女 | 80 | 58 | +| 李文才 | 男 | 50 | 90 | +| 欧阳俊雄 | 男 | 65 | 50 | +| 张秋丽 | 男 | 77 | 82 | +| 争青小子 | 男 | 56 | 48 | ++----------+--------+-------------+---------+ + +方法二: +mysql> select stuinfo.stuno,stuname,stusex,writtenexam,labexam from stuinfo,stumarks where stuinfo.stuno=stumarks.stuno; ++--------+----------+--------+-------------+---------+ +| stuno | stuname | stusex | writtenexam | labexam | ++--------+----------+--------+-------------+---------+ +| s25303 | 李斯文 | 女 | 80 | 58 | +| s25302 | 李文才 | 男 | 50 | 90 | +| s25304 | 欧阳俊雄 | 男 | 65 | 50 | +| s25301 | 张秋丽 | 男 | 77 | 82 | +| s25318 | 争青小子 | 男 | 56 | 48 | ++--------+----------+--------+-------------+---------+ + +可以给表取别名 +mysql> select i.stuno,stuname,stusex,writtenexam,labexam from stuinfo i,stumarks s where i.stuno=s.stuno; ++--------+----------+--------+-------------+---------+ +| stuno | stuname | stusex | writtenexam | labexam | ++--------+----------+--------+-------------+---------+ +| s25303 | 李斯文 | 女 | 80 | 58 | +| s25302 | 李文才 | 男 | 50 | 90 | +| s25304 | 欧阳俊雄 | 男 | 65 | 50 | +| s25301 | 张秋丽 | 男 | 77 | 82 | +| s25318 | 争青小子 | 男 | 56 | 48 | ++--------+----------+--------+-------------+---------+ +5 rows in set (0.00 sec) +``` + + + +脚下留心:显示公共字段需要指定表名 ![1537061664763](https://yp.smallkun.cn/markdown/1537061664763.png!compress) + + ![1537061715978](https://yp.smallkun.cn/markdown/1537061715978.png!compress) + +``` +思考: +select * from 表1 inner join 表2 on 表1.公共字段=表2.公共字段 和 +select * from 表2 inner join 表1 on 表1.公共字段=表2.公共字段 结果是否一样? +答:一样的,因为内连接获取的是两个表的公共部分 +``` + +``` +多学一招:三个表的内连接如何实现? +select * from 表1 inner join 表2 on 表1.公共字段=表2.公共字段 +inner join 表3 on 表2.公共字段=表3.公共字段 +``` + +#### 1.2.2 左外连接【left join】 + +以左边的表为标准,如果右边的表没有对应的记录,用NULL填充。 + +``` +语法:select 列名 from 表1 left join 表2 on 表1.公共字段=表2.公共字段 +``` + +例题 + +```sql +mysql> select stuname,writtenexam,labexam from stuinfo left join stumarks on stuinfo.stuno=stumarks.stuno; ++----------+-------------+---------+ +| stuname | writtenexam | labexam | ++----------+-------------+---------+ +| 张秋丽 | 77 | 82 | +| 李文才 | 50 | 90 | +| 李斯文 | 80 | 58 | +| 欧阳俊雄 | 65 | 50 | +| 诸葛丽丽 | NULL | NULL | +| 争青小子 | 56 | 48 | +| 梅超风 | NULL | NULL | ++----------+-------------+---------+ +``` + +``` +思考: +select * from 表1 left join 表2 on 表1.公共字段=表2.公共字段 +和 +select * from 表2 left join 表1 on 表1.公共字段=表2.公共字段 是否一样? +答:不一样,左连接一左边的表为准。 +``` + +#### 1.2.3 右外连接【right join】 + +以右边的表为标准,如果左边的表没有对应的记录,用NULL填充。 + +``` +语法:select 列名 from 表1 right join 表2 on 表1.公共字段=表2.公共字段 +``` + +例题 + +```sql +mysql> select stuname,writtenexam,labexam from stuinfo right join stumarks on stuinfo.stuno=stumarks.stuno; ++----------+-------------+---------+ +| stuname | writtenexam | labexam | ++----------+-------------+---------+ +| 李斯文 | 80 | 58 | +| 李文才 | 50 | 90 | +| 欧阳俊雄 | 65 | 50 | +| 张秋丽 | 77 | 82 | +| 争青小子 | 56 | 48 | +| NULL | 66 | 77 | ++----------+-------------+---------+ +6 rows in set (0.00 sec) +``` + +``` +思考: +select * from 表1 left join 表2 on 表1.公共字段=表2.公共字段 +和 +select * from 表2 right join 表1 on 表1.公共字段=表2.公共字段 是否一样? + +答:一样的 +``` + +#### 1.2.4 交叉连接【cross join】 + +插入测试数据 + +```sql +mysql> create table t1( + -> id int, + -> name varchar(10) + -> ); +Query OK, 0 rows affected (0.06 sec) + +mysql> insert into t1 values (1,'tom'),(2,'berry'); +Query OK, 2 rows affected (0.00 sec) + +mysql> create table t2( + -> id int, + -> score int); +Query OK, 0 rows affected (0.02 sec) + +mysql> insert into t2 values (1,88),(2,99); +``` + +1、如果没有连接表达式返回的是笛卡尔积 + +```sql +mysql> select * from t1 cross join t2; # 返回笛卡尔积 ++------+-------+------+-------+ +| id | name | id | score | ++------+-------+------+-------+ +| 1 | tom | 1 | 88 | +| 2 | berry | 1 | 88 | +| 1 | tom | 2 | 99 | +| 2 | berry | 2 | 99 | ++------+-------+------+-------+ +``` + +2、如果有连接表达式等价于内连接 + +```sql +mysql> select * from t1 cross join t2 where t1.id=t2.id; ++------+-------+------+-------+ +| id | name | id | score | ++------+-------+------+-------+ +| 1 | tom | 1 | 88 | +| 2 | berry | 2 | 99 | ++------+-------+------+-------+ +``` + +#### 1.2.5 自然连接【natural】 + +``` +自动的判断连接条件,它是过同名字段来判断的 +``` + +自然连接又分为: + +1. 自然内连接 natural join +2. 自然左外连接 natural left join +3. 自然右外连接 natural right join + +例题: + +```sql +# 自然内连接 +mysql> select * from stuinfo natural join stumarks; ++--------+----------+--------+--------+---------+------------+---------+-------------+---------+ +| stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | examNo | writtenExam | labExam | ++--------+----------+--------+--------+---------+------------+---------+-------------+---------+ +| s25303 | 李斯文 | 女 | 22 | 2 | 北京 | s271811 | 80 | + 58 | +| s25302 | 李文才 | 男 | 31 | 3 | 上海 | s271813 | 50 | + 90 | +| s25304 | 欧阳俊雄 | 男 | 28 | 4 | 天津 | s271815 | 65 | + 50 | +| s25301 | 张秋丽 | 男 | 18 | 1 | 北京 | s271816 | 77 | + 82 | +| s25318 | 争青小子 | 男 | 26 | 6 | 天津 | s271819 | 56 | + 48 | ++--------+----------+--------+--------+---------+------------+---------+-------------+---------+ +5 rows in set (0.00 sec) + +# 自然左外连接 + +mysql> select * from stuinfo natural left join stumarks; ++--------+----------+--------+--------+---------+------------+---------+-------------+---------+ +| stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | examNo | writtenExam | labExam | ++--------+----------+--------+--------+---------+------------+---------+-------------+---------+ +| s25301 | 张秋丽 | 男 | 18 | 1 | 北京 | s271816 | 77 + 82 | +| s25302 | 李文才 | 男 | 31 | 3 | 上海 | s271813 | 50 | + 90 | +| s25303 | 李斯文 | 女 | 22 | 2 | 北京 | s271811 | 80 | + 58 | +| s25304 | 欧阳俊雄 | 男 | 28 | 4 | 天津 | s271815 | 65 + 50 | +| s25305 | 诸葛丽丽 | 女 | 23 | 7 | 河南 | NULL | NULL + NULL | +| s25318 | 争青小子 | 男 | 26 | 6 | 天津 | s271819 | 56 + 48 | +| s25319 | 梅超风 | 女 | 23 | 5 | 河北 | NULL | NULL | +ULL | ++--------+----------+--------+--------+---------+------------+---------+-------------+---------+ +7 rows in set (0.00 sec) + +# 自然右外连接 +mysql> select * from stuinfo natural right join stumarks; ++--------+---------+-------------+---------+----------+--------+--------+---------+------------+ +| stuNo | examNo | writtenExam | labExam | stuName | stuSex | stuAge | stuSeat | stuAddress | ++--------+---------+-------------+---------+----------+--------+--------+---------+------------+ +| s25303 | s271811 | 80 | 58 | 李斯文 | 女 | 22 | 2 | 北京 + | +| s25302 | s271813 | 50 | 90 | 李文才 | 男 | 31 | 3 | 上海 + | +| s25304 | s271815 | 65 | 50 | 欧阳俊雄 | 男 | 28 | 4 | 天津 + | +| s25301 | s271816 | 77 | 82 | 张秋丽 | 男 | 18 | 1 | 北京 + | +| s25318 | s271819 | 56 | 48 | 争青小子 | 男 | 26 | 6 | 天津 + | +| s25320 | s271820 | 66 | 77 | NULL | NULL | NULL | NULL | NULL | ++--------+---------+-------------+---------+----------+--------+--------+---------+------------+ +6 rows in set (0.00 sec) + +``` + +自然连接结论: + +1. 表连接通过同名的字段来连接的 + +2. 如果没有同名的字段返回笛卡尔积 + +3. 会对结果进行整理,整理的规则如下 + + a) 连接字段保留一个 + + b) 连接字段放在最前面 + + c) 左外连接左边在前,右外连接右表在前 + +#### 1.2.6 using() + +1. 用来指定连接字段。 + +2. using()也会对连接字段进行整理,整理方式和自然连接是一样的。 + +```sql +mysql> select * from stuinfo inner join stumarks using(stuno); # using指定字段 ++--------+----------+--------+--------+---------+------------+---------+-------------+---------+ +| stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | examNo | writtenExam | labExam | ++--------+----------+--------+--------+---------+------------+---------+-------------+---------+ +| s25303 | 李斯文 | 女 | 22 | 2 | 北京 | s271811 | 80 | + 58 | +| s25302 | 李文才 | 男 | 31 | 3 | 上海 | s271813 | 50 | + 90 | +| s25304 | 欧阳俊雄 | 男 | 28 | 4 | 天津 | s271815 | 65 | + 50 | +| s25301 | 张秋丽 | 男 | 18 | 1 | 北京 | s271816 | 77 | + 82 | +| s25318 | 争青小子 | 男 | 26 | 6 | 天津 | s271819 | 56 | + 48 | ++--------+----------+--------+--------+---------+------------+---------+-------------+---------+ +5 rows in set (0.00 sec) +``` + +## 1.3 子查询 + +语法 + +```sql +语法:select 语句 where 条件 (select … from 表) +``` + +1. 外面的查询称为父查询,括号中的查询称为子查询 +2. 子查询为父查询提供查询条件 + +#### 1.3.1 例题 + +1、查找笔试80分的学生 + +```sql +mysql> select * from stuinfo where stuno=(select stuno from stumarks where writtenexam=80); ++--------+---------+--------+--------+---------+------------+ +| stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ++--------+---------+--------+--------+---------+------------+ +| s25303 | 李斯文 | 女 | 22 | 2 | 北京 | ++--------+---------+--------+--------+---------+------------+ +``` + +2、查找笔试最高分的学生 + +```sql +# 方法一: +mysql> select * from stuinfo where stuno=(select stuno from stumarks order by writtenexam desc limit + 1); ++--------+---------+--------+--------+---------+------------+ +| stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ++--------+---------+--------+--------+---------+------------+ +| s25303 | 李斯文 | 女 | 22 | 2 | 北京 | ++--------+---------+--------+--------+---------+------------+ +1 row in set (0.00 sec) + +# 方法二: +mysql> select * from stuinfo where stuno=(select stuno from stumarks where writtenexam=(select max(writtenexam) from stumarks)); ++--------+---------+--------+--------+---------+------------+ +| stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ++--------+---------+--------+--------+---------+------------+ +| s25303 | 李斯文 | 女 | 22 | 2 | 北京 | ++--------+---------+--------+--------+---------+------------+ +1 row in set (0.00 sec) +``` + +``` +脚下留心:上面的例题,子查询只能返回一个值。如果子查询返回多个值就不能用“=”了,需要用 in +``` + +#### 1.3.2 in|not in子查询 + +用于子查询的返回结果多个值。 + +1、查找笔试成绩及格的同学 + +```sql +mysql> select * from stuinfo where stuno in (select stuno from stumarks where writtenexam>=60); ++--------+----------+--------+--------+---------+------------+ +| stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ++--------+----------+--------+--------+---------+------------+ +| s25301 | 张秋丽 | 男 | 18 | 1 | 北京 | +| s25303 | 李斯文 | 女 | 22 | 2 | 北京 | +| s25304 | 欧阳俊雄 | 男 | 28 | 4 | 天津 | ++--------+----------+--------+--------+---------+------------+ +3 rows in set (0.00 sec) +``` + +2、查询不及格的同学 + +```sql +mysql> select * from stuinfo where stuno in (select stuno from stumarks where writtenexam<=60); ++--------+----------+--------+--------+---------+------------+ +| stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ++--------+----------+--------+--------+---------+------------+ +| s25302 | 李文才 | 男 | 31 | 3 | 上海 | +| s25318 | 争青小子 | 男 | 26 | 6 | 天津 | ++--------+----------+--------+--------+---------+------------+ +``` + +3、查询没有通过的同学(不及格,缺考) + +```sql +mysql> select * from stuinfo where stuno not in (select stuno from stumarks where writtenexam>=60); ++--------+----------+--------+--------+---------+------------+ +| stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ++--------+----------+--------+--------+---------+------------+ +| s25302 | 李文才 | 男 | 31 | 3 | 上海 | +| s25305 | 诸葛丽丽 | 女 | 23 | 7 | 河南 | +| s25318 | 争青小子 | 男 | 26 | 6 | 天津 | +| s25319 | 梅超风 | 女 | 23 | 5 | 河北 | ++--------+----------+--------+--------+---------+------------+ +4 rows in set (0.00 sec) +``` + +#### 1.3.3 exists和not exists + +1、 如果有人笔试超过80分就显示所有的学生 + +```sql +mysql> select * from stuinfo where exists (select * from stumarks where writtenexam>=80); ++--------+----------+--------+--------+---------+------------+ +| stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ++--------+----------+--------+--------+---------+------------+ +| s25301 | 张秋丽 | 男 | 18 | 1 | 北京 | +| s25302 | 李文才 | 男 | 31 | 3 | 上海 | +| s25303 | 李斯文 | 女 | 22 | 2 | 北京 | +| s25304 | 欧阳俊雄 | 男 | 28 | 4 | 天津 | +| s25305 | 诸葛丽丽 | 女 | 23 | 7 | 河南 | +| s25318 | 争青小子 | 男 | 26 | 6 | 天津 | +| s25319 | 梅超风 | 女 | 23 | 5 | 河北 | ++--------+----------+--------+--------+---------+------------+ +``` + +2、 如果没有人超过80分就显示所有的学生 + +```sql +mysql> select * from stuinfo where not exists (select * from stumarks where writtenexam>=80); +Empty set (0.02 sec) +``` + +#### 1.3.4 子查询分类 + +1、标量子查询:子查询返回的结果就一个 + +2、列子查询:子查询返回的结果是一个列表 + +3、行子查询:子查询返回的结果是一行 + +例题:查询成绩最高的男生和女生 + +```sql +mysql> select stuname,stusex,ch from stu where (stusex,ch) in (select stusex,max(ch) from stu group by stusex); ++----------+--------+------+ +| stuname | stusex | ch | ++----------+--------+------+ +| 争青小子 | 男 | 86 | +| Tabm | 女 | 88 | ++----------+--------+------+ +``` + +4、表子查询:子查询返回的结果当成一个表 + +例题:查询成绩最高的男生和女生 + +```sql +mysql> select stuname,stusex,ch from (select * from stu order by ch desc) as t group by stusex; ++----------+--------+------+ +| stuname | stusex | ch | ++----------+--------+------+ +| Tabm | 女 | 88 | +| 争青小子 | 男 | 86 | ++----------+--------+------+ +``` + +``` +脚下留心:from后面是一个表,如果子查询的结果当成表来看,必须将子查询的结果取别名。 +``` + +## 1.4 视图【view】 + +1、 视图是一张虚拟表,它表示一张表的部分或多张表的综合的结构。 + +2、 视图仅仅是表结构,没有表数据。视图的结构和数据建立在表的基础上。 + +#### 1.4.1 创建视图 + +语法 + +```sql +create [or replace] view 视图的名称 +as + select语句 +``` + +例题: + +```sql +mysql> create view vw_stu + -> as + -> select stuname,stusex,writtenexam,labexam from stuinfo inner join stumarks using(stuno); +Query OK, 0 rows affected (0.00 sec) +``` + +``` +多学一招:因为视图是一个表结构,所以创建视图后,会在数据库文件夹中多一个与视图名同名的.frm文件 +``` + +#### 1.4.2 使用视图 + +视图是一张虚拟表,视图的用法和表的用法一样 + +```sql +mysql> select * from vw_stu; ++----------+--------+-------------+---------+ +| stuname | stusex | writtenexam | labexam | ++----------+--------+-------------+---------+ +| 李斯文 | 女 | 80 | 58 | +| 李文才 | 男 | 50 | 90 | +| 欧阳俊雄 | 男 | 65 | 50 | +| 张秋丽 | 男 | 77 | 82 | +| 争青小子 | 男 | 56 | 48 | ++----------+--------+-------------+---------+ + +mysql> update vw_stu set writtenexam=88 where stuname='李斯文'; +Query OK, 1 row affected (0.05 sec) +Rows matched: 1 Changed: 1 Warnings: 0 +``` + +#### 1.4.3 查看视图的结构 + +语法: + +```sql +desc 视图名 +``` + +例题 + +```sql +mysql> desc vw_stu; ++-------------+-------------+------+-----+---------+-------+ +| Field | Type | Null | Key | Default | Extra | ++-------------+-------------+------+-----+---------+-------+ +| stuname | varchar(10) | NO | | NULL | | +| stusex | char(2) | NO | | NULL | | +| writtenexam | int(11) | YES | | NULL | | +| labexam | int(11) | YES | | NULL | | ++-------------+-------------+------+-----+---------+-------+ +``` + +#### 1.4.4 查看创建视图的语法 + +语法: + +```sql +show create view 视图名 +``` + +例题 + + ![1537067071676](https://yp.smallkun.cn/markdown/1537067071676.png!compress) + +#### 1.4.5 显示所有视图 + +```sql + #方法一: +mysql> show tables; ++------------------+ +| Tables_in_itcast | ++------------------+ +| stu | +| stuinfo | +| stumarks | +| t1 | +| t2 | +| vw_stu | + +# 方法二 +mysql> select table_name from information_schema.views; ++------------+ +| table_name | ++------------+ +| vw_stu | ++------------+ +1 row in set (0.05 sec) ++------------------+ + +#方法三 +mysql> show table status where comment='view' \G +*************************** 1. row *************************** + Name: vw_stu + Engine: NULL + Version: NULL + Row_format: NULL + Rows: NULL + Avg_row_length: NULL + Data_length: NULL +Max_data_length: NULL + Index_length: NULL + Data_free: NULL + Auto_increment: NULL + Create_time: NULL + Update_time: NULL + Check_time: NULL + Collation: NULL + Checksum: NULL + Create_options: NULL + Comment: VIEW +1 row in set (0.00 sec) + +``` + +#### 1.4.6 更改视图 + +语法: + +```sql +alter view 视图名 +as + select 语句 +``` + +例题: + +```sql +mysql> alter view vw_stu + -> as + -> select * from stuinfo; +Query OK, 0 rows affected (0.00 sec) +``` + +#### 1.4.7 删除视图 + +语法: + +```sql +drop view [if exists] 视图1,视图2,… +``` + +例题 + +```sql +mysql> drop view vw_stu; +Query OK, 0 rows affected (0.00 sec) +``` + +#### 1.4.8 视图的作用 + +1. 筛选数据,防止未经许可访问敏感数据 +2. 隐藏表结构 +3. 降低SQL语句的复杂度 + +#### 1.4.9 视图的算法 + +场景:找出语文成绩最高的男生和女生 + +```sql +mysql> select * from (select * from stu order by ch desc) as t group by stusex; ++--------+----------+--------+--------+---------+------------+------+------+ +| stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ch | math | ++--------+----------+--------+--------+---------+------------+------+------+ +| s25321 | Tabm | 女 | 23 | 9 | 河北 | 88 | 77 | +| s25318 | 争青小子 | 男 | 26 | 6 | 天津 | 86 | 92 | ++--------+----------+--------+--------+---------+------------+------+------+ +``` + +我们可以将子查询封装到视图中 + +```sql +mysql> create view vw_stu + -> as + -> select * from stu order by ch desc; +Query OK, 0 rows affected (0.00 sec) +``` + +可以将上面的子查询更改成视图,但是,结果和上面不一样 + +```sql +mysql> select * from vw_stu group by stusex; ++--------+---------+--------+--------+---------+------------+------+------+ +| stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ch | math | ++--------+---------+--------+--------+---------+------------+------+------+ +| s25301 | 张秋丽 | 男 | 18 | 1 | 北京 | 80 | NULL | +| s25303 | 李斯文 | 女 | 22 | 2 | 北京 | 55 | 82 | ++--------+---------+--------+--------+---------+------------+------+------+ +``` + +原因:这是因为视图的算法造成的 + +``` +1. merge:合并算法,将视图的语句和外层的语句合并后在执行。 +2. temptable:临时表算法,将视图生成一个临时表,再执行外层语句 +3. undefined:未定义,MySQL到底用merge还是用temptable由MySQL决定,这是一个默认的算法,一般视图都会选择merge算法,因为merge效率高。 +``` + +解决:在创建视图的时候指定视图的算法 + +```sql +create algorithm=temptable view 视图名 +as + select 语句 +``` + +指定算法创建视图 + +```sql +mysql> create algorithm=temptable view vw_stu + -> as + -> select * from stu order by ch desc; +Query OK, 0 rows affected (0.00 sec) + +mysql> select * from vw_stu group by stusex; # 结果是一致的 ++--------+----------+--------+--------+---------+------------+------+------+ +| stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ch | math | ++--------+----------+--------+--------+---------+------------+------+------+ +| s25321 | Tabm | 女 | 23 | 9 | 河北 | 88 | 77 | +| s25318 | 争青小子 | 男 | 26 | 6 | 天津 | 86 | 92 | ++--------+----------+--------+--------+---------+------------+------+------+ +``` + +## 1.5 事务【transaction】 + +1. 事务是一个不可分割的执行单元 +2. 事务作为一个整体要么一起执行,要么一起回滚 + +插入测试数据 + +```sql +mysql> create table bank( + -> cardid char(4) primary key, + -> money int + -> ); +Query OK, 0 rows affected (0.00 sec) + +mysql> insert into bank values ('1001',1000),('1002',100); +Query OK, 2 rows affected (0.00 sec) +Records: 2 Duplicates: 0 Warnings: 0 +``` + +#### 1.5.1 事务操作 + +```sql +开启事务:start transaction或begin [work] +提交事务:commit +回滚事务:rollback +``` + +例题: + +```sql +mysql> delimiter // # 更改定界符 + +mysql> start transaction; # 开启事务 + -> update bank set money=money-100 where cardid='1001'; + -> update bank set money=money+100 where cardid='1002' // +Query OK, 0 rows affected (0.00 sec) + +mysql> commit // # 提交事务 + +mysql> rollback // # 回滚事务 +``` + +``` +思考:事务什么时候产生?什么时候结束? +答:开启的时候产生,提交事务或回滚事务都结束 + +脚下留心:只有innodb和BDB才支持事务,myisam不支持事务。 +``` + +#### 1.5.2 设置事务的回滚点 + +语法: + +```sql +设置回滚点: savepoint 回滚点名 +回滚到回滚点: rollback to 回滚点 +``` + +例题: + +```sql +mysql> start transaction; +Query OK, 0 rows affected (0.00 sec) + +mysql> insert into bank values ('1003',1000); +Query OK, 1 row affected (0.00 sec) + +mysql> savepoint aa; # 设置回滚点 aa +Query OK, 0 rows affected (0.00 sec) + +mysql> insert into bank values ('1004',500); +Query OK, 1 row affected (0.00 sec) + +mysql> savepoint bb; # 设置回滚点bb +Query OK, 0 rows affected (0.00 sec) + +mysql> rollback to aa; # 回滚到aa点 +Query OK, 0 rows affected (0.00 sec) + +mysql> commit; # 提交事务 + +mysql> select * from bank ; ++--------+-------+ +| cardid | money | ++--------+-------+ +| 1001 | 800 | +| 1002 | 200 | +| 1003 | 1000 | ++--------+-------+ +``` + +#### 1.5.3 事务的特性(ACID) + +1. 原子性(Atomicity):事务是一个整体,不可以再分,要么一起执行,要么一起不执行。 +2. 一致性(Consistency):事务完成时,数据必须处于一致的状态。 +3. 隔离性(Isolation):每个事务都是相互隔离的 +4. 永久性(Durability):事务完成后,对数据的修改是永久性的。 + +## 1.6 索引【index】 + +索引的优点:查询速度快 + +索引的缺点: + +1. 增、删、改(数据操作语句)效率低了 +2. 索引占用空间 + +#### 1.6.1 索引的类型 + +1. 普通索引 + +2. 唯一索引(唯一键) +3. 主键索引:只要主键就自动创建主键索引,不需要手动创建。 +4. 全文索引,搜索引擎使用,MySQL不支持中文的全文索引,我们通过sphinx去解决中文的全文索引。 + +#### 1.6.2 创建普通索引【create index】 + +语法: + +```sql +create index [索引名] on 表名 (字段名) +alter table 表名 add index [索引的名称] (列名) +``` + +例题: + +```sql +# 创建索引方法一 +mysql> create index ix_stuname on stuinfo(stuname); +Query OK, 0 rows affected (0.08 sec) +Records: 0 Duplicates: 0 Warnings: 0 + +# 创建索引方法二 +mysql> alter table stuinfo add index ix_address (stuaddress); +Query OK, 0 rows affected (0.08 sec) +Records: 0 Duplicates: 0 Warnings: 0 + +# 创建表的时候就添加索引 +mysql> create table emp( + -> id int, + -> name varchar(10), + -> index ix_name (name) # 创建索引 + -> ); +Query OK, 0 rows affected (0.00 sec) +``` + +#### 1.6.3 创建唯一索引 + +```sql +语法一:create unique index 索引名 on 表名 (字段名) +语法二:alter table 表名 add unqiue [index] [索引的名称] (列名) +语法三:创建表的时候添加唯一索引,和创建唯一键是一样的。 +``` + +例题 + +```sql +# 方法一: +mysql> create unique index UQ_stuname on stu(stuname); +Query OK, 0 rows affected (0.06 sec) +Records: 0 Duplicates: 0 Warnings: 0 + +# 方法二: +mysql> alter table stu add unique UQ_address (stuaddress); +Query OK, 0 rows affected (0.02 sec) +Records: 0 Duplicates: 0 Warnings: 0 + +# 方法三 +mysql> create table stu2( + -> id int, + -> name varchar(20), + -> unique UQ_name(name) + -> ); +Query OK, 0 rows affected (0.01 sec) +``` + +#### 1.6.4 删除索引 + +语法 + +```sql +drop index 索引名 on 表名 +``` + +例题 + +```sql +mysql> drop index ix_stuname on stuinfo; +Query OK, 0 rows affected (0.03 sec) +Records: 0 Duplicates: 0 Warnings: 0 +``` + +#### 1.6.5 创建索引的指导原则 + +1. 该列用于频繁搜索 + +2. 改列用于排序 +3. 公共字段要创建索引 +4. 如果表中的数据很少,不需要创建索引。MySQL搜索索引的时间比逐条搜索数据的时间要长。 +5. 如果一个字段上的数据只有几个不同的值,改字段不适合做索引,比如性别。 + +## 1.7 函数 + +#### 1.7.1 数字类 + +```sql +mysql> select rand(); # 生成随机数 ++---------------------+ +| rand() | ++---------------------+ +| 0.18474003969201822 | ++---------------------+ +1 row in set (0.00 sec) + +mysql> select * from stuinfo order by rand(); # 随机排序 + +mysql> select * from stuinfo order by rand() limit 2; # 随机抽两个学生 ++--------+----------+--------+--------+---------+------------+ +| stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ++--------+----------+--------+--------+---------+------------+ +| s25305 | 诸葛丽丽 | 女 | 23 | 7 | 河南 | +| s25304 | 欧阳俊雄 | 男 | 28 | 4 | 天津 | ++--------+----------+--------+--------+---------+------------+ +2 rows in set (0.00 sec) + +mysql> select round(3.5); #四舍五入 ++------------+ +| round(3.5) | ++------------+ +| 4 | ++------------+ +1 row in set (0.00 sec) + +mysql> select ceil(3.1); # 向上取整 ++-----------+ +| ceil(3.1) | ++-----------+ +| 4 | ++-----------+ +1 row in set (0.00 sec) + +mysql> select floor(3.9); # 向下取整 ++------------+ +| floor(3.9) | ++------------+ +| 3 | ++------------+ +1 row in set (0.00 sec) + +mysql> select truncate(3.1415926,3); # 截取数字 ++-----------------------+ +| truncate(3.1415926,3) | ++-----------------------+ +| 3.141 | ++-----------------------+ +1 row in set (0.00 sec) +``` + +#### 1.7.2 字符串类 + +```sql +mysql> select ucase('i am a boy!'); # 转成大写 ++----------------------+ +| ucase('i am a boy!') | ++----------------------+ +| I AM A BOY! | ++----------------------+ +1 row in set (0.00 sec) + +mysql> select lcase('I Am A Boy!'); #转成小写 ++----------------------+ +| lcase('I Am A Boy!') | ++----------------------+ +| i am a boy! | ++----------------------+ +1 row in set (0.00 sec) + +mysql> select left('abcde',3); # 从左边开始截取,截取3个 ++-----------------+ +| left('abcde',3) | ++-----------------+ +| abc | ++-----------------+ +1 row in set (0.00 sec) + +mysql> select right('abcde',3); # 从右边开始截取,截取3个 ++------------------+ +| right('abcde',3) | ++------------------+ +| cde | ++------------------+ +1 row in set (0.00 sec) + +mysql> select substring('abcde',2,3); #从第2个位置开始截取,截取3个【位置从1开始】 ++------------------------+ +| substring('abcde',2,3) | ++------------------------+ +| bcd | ++------------------------+ +1 row in set (0.00 sec) + +mysql> select concat('中国','上海'); # 字符串相连 ++-----------------------+ +| concat('中国','上海') | ++-----------------------+ +| 中国上海 | ++-----------------------+ +1 row in set (0.00 sec) + +mysql> select concat(stuname,'-',stusex) from stuinfo; # 将表中的姓名和性别连接起来 ++----------------------------+ +| concat(stuname,'-',stusex) | ++----------------------------+ +| 张秋丽-男 | +| 李文才-男 | +| 李斯文-女 | +| 欧阳俊雄-男 | +| 诸葛丽丽-女 | +| 争青小子-男 | +| 梅超风-女 | ++----------------------------+ +7 rows in set (0.00 sec) + +# coalesce(字段1,字段2) 如果字段1不为空就显示字段1,否则,显示字段2 +mysql> select stuname,coalesce(writtenexam,'缺考'),coalesce(labexam,'缺考') from stuinfo natural left join stumarks; # 将考试成绩为空的显示为缺考 ++----------+------------------------------+--------------------------+ +| stuname | coalesce(writtenexam,'缺考') | coalesce(labexam,'缺考') | ++----------+------------------------------+--------------------------+ +| 张秋丽 | 77 | 82 | +| 李文才 | 50 | 90 | +| 李斯文 | 88 | 58 | +| 欧阳俊雄 | 65 | 50 | +| 诸葛丽丽 | 缺考 | 缺考 | +| 争青小子 | 56 | 48 | +| 梅超风 | 缺考 | 缺考 | ++----------+------------------------------+--------------------------+ + +mysql> select length('锄禾日当午'); # 字节长度 ++----------------------+ +| length('锄禾日当午') | ++----------------------+ +| 10 | ++----------------------+ +1 row in set (0.00 sec) + +mysql> select char_length('锄禾日当午'); # 字符个数 ++---------------------------+ +| char_length('锄禾日当午') | ++---------------------------+ +| 5 | ++---------------------------+ +1 row in set (0.00 sec) +``` + +#### 1.7.3 时间类 + +```sql +mysql> select unix_timestamp(); #获取时间戳 ++------------------+ +| unix_timestamp() | ++------------------+ +| 1537084508 | ++------------------+ +1 row in set (0.00 sec) + +mysql> select from_unixtime(unix_timestamp()); # 将时间戳转成年-月-日 小时:分钟:秒的格式 ++---------------------------------+ +| from_unixtime(unix_timestamp()) | ++---------------------------------+ +| 2018-09-16 15:55:56 | ++---------------------------------+ +1 row in set (0.00 sec) + +mysql> select now(); # 获取当前日期时间 ++---------------------+ +| now() | ++---------------------+ +| 2018-09-16 15:57:04 | ++---------------------+ +1 row in set (0.00 sec) + +mysql> select year(now()) 年,month(now()) 月, day(now()) 日,hour(now()) 小,minute(now()) 分钟,second(now()) 秒; ++------+------+------+------+------+------+ +| 年 | 月 | 日 | 小时 | 分钟 | 秒 | ++------+------+------+------+------+------+ +| 2018 | 9 | 16 | 15 | 59 | 14 | ++------+------+------+------+------+------+ +1 row in set (0.00 sec) + +mysql> select dayname(now()) 星期,monthname(now()),dayofyear(now()) 本年的第几天; ++--------+------------------+--------------+ +| 星期 | monthname(now()) | 本年的第几天 | ++--------+------------------+--------------+ +| Sunday | September | 259 | ++--------+------------------+--------------+ +1 row in set (0.00 sec) + +mysql> select datediff(now(),'2008-8-8'); # 日期相减 ++----------------------------+ +| datediff(now(),'2008-8-8') | ++----------------------------+ +| 3691 | ++----------------------------+ +1 row in set (0.00 sec) + +mysql> select convert(now(),date),convert(now(),time); # 将now()转成日期和时间 ++---------------------+---------------------+ +| convert(now(),date) | convert(now(),time) | ++---------------------+---------------------+ +| 2018-09-16 | 16:07:24 | ++---------------------+---------------------+ + +mysql> select cast(now() as date),cast(now() as time); # 将now()转成日期和时间 ++---------------------+---------------------+ +| cast(now() as date) | cast(now() as time) | ++---------------------+---------------------+ +| 2018-09-16 | 16:08:03 | ++---------------------+---------------------+ +1 row in set (0.00 sec) +``` + +#### 1.7.4 加密函数 + +```sql ++----------------------------------+------------------------------------------+ +| md5('root') | sha('root') | ++----------------------------------+------------------------------------------+ +| 63a9f0ea7bb98050796b649e85481845 | dc76e9f0c0006e8f919e0c515c66dbba3982f785 | ++----------------------------------+------------------------------------------+ +1 row in set (0.00 sec) +``` + +#### 1.7.5 判断函数 + +语法 + +```sql +if(表达式,值1,值2) +``` + +例题: + +```sql +mysql> select if(10%2=0,'偶数','奇数'); ++--------------------------+ +| if(10%2=0,'偶数','奇数') | ++--------------------------+ +| 偶数 | ++--------------------------+ +1 row in set (0.00 sec) + +# 语文和数学都超过60分才通过 +mysql> select stuname,ch,math,if(ch>=60 && math>=60,'通过','不通过') '是否通过' from stu; ++----------+------+------+----------+ +| stuname | ch | math | 是否通过 | ++----------+------+------+----------+ +| 张秋丽 | 80 | NULL | 不通过 | +| 李文才 | 77 | 76 | 通过 | +| 李斯文 | 55 | 82 | 不通过 | +| 欧阳俊雄 | NULL | 74 | 不通过 | +| 诸葛丽丽 | 72 | 56 | 不通过 | +| 争青小子 | 86 | 92 | 通过 | +| 梅超风 | 74 | 67 | 通过 | +| Tom | 65 | 67 | 通过 | +| Tabm | 88 | 77 | 通过 | ++----------+------+------+----------+ +9 rows in set (0.00 sec) +``` + +## 1.8 预处理 + +预编译一次,可以多次执行。用来解决一条SQL语句频繁执行的问题。 + +``` +预处理语句:prepare 预处理名字 from ‘sql语句’ +执行预处理:execute 预处理名字 [using 变量] +``` + +例题一: + +```sql +mysql> prepare stmt from 'select * from stuinfo'; # 创建预处理 +Query OK, 0 rows affected (0.00 sec) +Statement prepared + +mysql> execute stmt; # 执行预处理 ++--------+----------+--------+--------+---------+------------+ +| stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ++--------+----------+--------+--------+---------+------------+ +| s25301 | 张秋丽 | 男 | 18 | 1 | 北京 | +| s25302 | 李文才 | 男 | 31 | 3 | 上海 | +| s25303 | 李斯文 | 女 | 22 | 2 | 北京 | +| s25304 | 欧阳俊雄 | 男 | 28 | 4 | 天津 | +| s25305 | 诸葛丽丽 | 女 | 23 | 7 | 河南 | +| s25318 | 争青小子 | 男 | 26 | 6 | 天津 | +| s25319 | 梅超风 | 女 | 23 | 5 | 河北 | ++--------+----------+--------+--------+---------+------------+ +7 rows in set (0.00 sec) +``` + +例题二:传递参数 + +```sql +mysql> delimiter // +mysql> prepare stmt from 'select * from stuinfo where stuno=?' // -- ?是位置占位符 +Query OK, 0 rows affected (0.00 sec) +Statement prepared + +mysql> set @id='s25301'; -- 变量以@开头,通过set给变量赋值 + -> execute stmt using @id // -- 执行预处理,传递参数 +Query OK, 0 rows affected (0.00 sec) + ++--------+---------+--------+--------+---------+------------+ +| stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ++--------+---------+--------+--------+---------+------------+ +| s25301 | 张秋丽 | 男 | 18 | 1 | 北京 | ++--------+---------+--------+--------+---------+------------+ +1 row in set (0.00 sec) +``` + +``` +脚下留心: +1、?是位置占位符 +2、变量以@开头 +3、通过set给变量赋值 +``` + +例题三:传递多个参数 + +```sql +mysql> prepare stmt from 'select * from stuinfo where stusex=? and stuaddress=?' // +Query OK, 0 rows affected (0.00 sec) +Statement prepared + +mysql> set @sex='男'; + -> set @addr='北京'; + -> execute stmt using @sex,@addr // +Query OK, 0 rows affected (0.00 sec) + +Query OK, 0 rows affected (0.00 sec) + ++--------+---------+--------+--------+---------+------------+ +| stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ++--------+---------+--------+--------+---------+------------+ +| s25301 | 张秋丽 | 男 | 18 | 1 | 北京 | ++--------+---------+--------+--------+---------+------------+ +1 row in set (0.00 sec) +``` + +## 1.9 存储过程【procedure】 + +#### 1.7.1 存储过程的优点 + +1. 存储过程可以减少网络流量 +2. 允许模块化设计 +3. 支持事务 + +#### 1.7.2 创建存储过程 + +语法: + +```sql +create procedure 存储过程名(参数) +begin + //sql语句 +end; + +脚下留心:由于过程中有很多SQL语句,每个语句的结束都要用(;)结束。默认情况下,分号既表示语句结束,又表示向服务器发送SQL语句。我们希望分号仅表示语句的结束,不要将SQL语句发送到服务器执行,通过delimiter来更改结束符。 +``` + +例题 + +```sql +mysql> delimiter // +mysql> create procedure proc() -- 创建存储过程 + -> begin + -> select * from stuinfo; + -> end // +Query OK, 0 rows affected (0.00 sec) +``` + +#### 1.7.3 调用存储过程 + +语法: + +```sql +call 存储过程名() +``` + +例题: + +```sql +mysql> call proc() // -- 调用存储过程 ++--------+----------+--------+--------+---------+------------+ +| stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ++--------+----------+--------+--------+---------+------------+ +| s25301 | 张秋丽 | 男 | 18 | 1 | 北京 | +| s25302 | 李文才 | 男 | 31 | 3 | 上海 | +| s25303 | 李斯文 | 女 | 22 | 2 | 北京 | +| s25304 | 欧阳俊雄 | 男 | 28 | 4 | 天津 | +| s25305 | 诸葛丽丽 | 女 | 23 | 7 | 河南 | +| s25318 | 争青小子 | 男 | 26 | 6 | 天津 | +| s25319 | 梅超风 | 女 | 23 | 5 | 河北 | ++--------+----------+--------+--------+---------+------------+ +7 rows in set (0.00 sec) +``` + +#### 1.7.4 删除存储过程 + +语法 + +```sql +drop procedure [if exists] 存储过程名 +``` + +例题: + +```sql +mysql> drop procedure proc // -- 删除存储过程 +Query OK, 0 rows affected (0.00 sec) +``` + +#### 1.7.5 查看存储过程的信息 + +```sql +show create procedure 存储过程名\G +``` + +例题 + +```sql +mysql> show create procedure proc \G +*************************** 1. row *************************** + Procedure: proc + sql_mode: STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION + Create Procedure: CREATE DEFINER=`root`@`localhost` PROCEDURE `proc`() +begin +select * from stuinfo; +end +character_set_client: gbk +collation_connection: gbk_chinese_ci + Database Collation: utf8_general_ci +1 row in set (0.00 sec) +``` + +#### 1.7.6 显示所有的存储过程 + +```sql +mysql> show procedure status \G +``` + +#### 1.7.7 存储过程的参数 + +存储过程的参数分为:输入参数(in)【默认】,输出参数(out),输入输出参数(inout) + +存储过程不能使用return返回值,要返回值只能通过“输出参数”来向外传递值。 + +例题一:传递学号,获取对应的信息 + +```sql +mysql> create procedure proc(in param varchar(10)) -- 输入参数 + -> select * from stuinfo where stuno=param // +Query OK, 0 rows affected (0.00 sec) + +mysql> call proc('s25301') // ++--------+---------+--------+--------+---------+------------+ +| stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ++--------+---------+--------+--------+---------+------------+ +| s25301 | 张秋丽 | 男 | 18 | 1 | 北京 | ++--------+---------+--------+--------+---------+------------+ +1 row in set (0.00 sec) +``` + +例题二:查找同桌 + +```sql +mysql> create procedure proc(name varchar(10)) + -> begin + -> declare seat tinyint; -- 声明局部变量 + -> select stuseat into seat from stuinfo where stuname=name; -- 将座位号保存到变量中 + -> select * from stuinfo where stuseat=seat+1 or stuseat=seat-1; -- 查找同桌 + -> end // +Query OK, 0 rows affected (0.00 sec) + +mysql> call proc('李文才') // ++--------+----------+--------+--------+---------+------------+ +| stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ++--------+----------+--------+--------+---------+------------+ +| s25303 | 李斯文 | 女 | 22 | 2 | 北京 | +| s25304 | 欧阳俊雄 | 男 | 28 | 4 | 天津 | ++--------+----------+--------+--------+---------+------------+ +2 rows in set (0.00 sec) +``` + +强调 + +``` +1、通过declare关键字声明局部变量;全局变量@开头就可以了 +2、给变量赋值有两种方法 + 方法一:set 变量名=值 + 方法二:select 字段 into 变量 from 表 where 条件 +3、声明的变量不能与列名同名 +``` + +例题三:输出参数 + +```sql +mysql> create procedure proc(num int, out result int) //out 表示输出参数 + -> begin + -> set result=num*num; + -> end // +Query OK, 0 rows affected (0.00 sec) + +mysql> call proc(10,@result) // +Query OK, 0 rows affected (0.00 sec) + +mysql> select @result // ++---------+ +| @result | ++---------+ +| 100 | ++---------+ +1 row in set (0.00 sec) +``` + + + +例题四:输入输出参数 + +```sql +mysql> create procedure proc(inout num int) # inout 表示是输入输出参数 + -> begin + -> set num=num*num; + -> end // +Query OK, 0 rows affected (0.00 sec) + +mysql> set @num=10; + -> call proc(@num); + -> select @num // +Query OK, 0 rows affected (0.00 sec) + +Query OK, 0 rows affected (0.00 sec) + ++------+ +| @num | ++------+ +| 100 | ++------+ +1 row in set (0.00 sec) +``` diff --git a/课件/MySQL/MySQL基础.md b/课件/MySQL/MySQL基础.md new file mode 100644 index 0000000..b05a597 --- /dev/null +++ b/课件/MySQL/MySQL基础.md @@ -0,0 +1,1054 @@ +##本单元目标 + 一、为什么要学习数据库 + 二、数据库的相关概念 + DBMS、DB、SQL + 三、数据库存储数据的特点 + 四、初始MySQL + MySQL产品的介绍 + MySQL产品的安装 ★ + MySQL服务的启动和停止 ★ + MySQL服务的登录和退出 ★ + MySQL的常见命令和语法规范 + 五、DQL语言的学习 ★ + 基础查询 ★ + 条件查询 ★ + 排序查询 ★ + 常见函数 ★ + 分组函数 ★ + 分组查询 ★ + 连接查询 ★ + 子查询 √ + 分页查询 ★ + union联合查询 √ + 六、DML语言的学习 ★ + 插入语句 + 修改语句 + 删除语句 + 七、DDL语言的学习 + 库和表的管理 √ + 常见数据类型介绍 √ + 常见约束 √ + 八、TCL语言的学习 + 事务和事务处理 + 九、视图的讲解 √ + 十、变量 + 十一、存储过程和函数 + 十二、流程控制结构 + +## 数据库的好处 +​ 1.持久化数据到本地 +​ 2.可以实现结构化查询,方便管理 +​ + +## 数据库相关概念 +​ 1、DB:数据库,保存一组有组织的数据的容器 +​ 2、DBMS:数据库管理系统,又称为数据库软件(产品),用于管理DB中的数据 +​ 3、SQL:结构化查询语言,用于和DBMS通信的语言 + +## 数据库存储数据的特点 +​ 1、将数据放到表中,表再放到库中 +​ 2、一个数据库中可以有多个表,每个表都有一个的名字,用来标识自己。表名具有唯一性。 +​ 3、表具有一些特性,这些特性定义了数据在表中如何存储,类似java中 “类”的设计。 +​ 4、表由列组成,我们也称为字段。所有表都是由一个或多个列组成的,每一列类似java 中的”属性” +​ 5、表中的数据是按行存储的,每一行类似于java中的“对象”。 + + + +## MySQL产品的介绍和安装 + +### MySQL服务的启动和停止 +​ 方式一:计算机——右击管理——服务 +​ 方式二:通过管理员身份运行 +​ net start 服务名(启动服务) +​ net stop 服务名(停止服务) + +### MySQL服务的登录和退出 +​ 方式一:通过mysql自带的客户端 +​ 只限于root用户 + + 方式二:通过windows自带的客户端 + 登录: + mysql 【-h主机名 -P端口号 】-u用户名 -p密码 + + 退出: + exit或ctrl+C + + +​ +​ + +### MySQL的常见命令 + +```sql +1.查看当前所有的数据库 +show databases; +2.打开指定的库 +use 库名 +3.查看当前库的所有表 +show tables; +4.查看其它库的所有表 +show tables from 库名; +5.创建表 +create table 表名( + + 列名 列类型, + 列名 列类型, + 。。。 +); +6.查看表结构 +desc 表名; +``` + + +```sql +7.查看服务器的版本 +方式一:登录到mysql服务端 +select version(); +方式二:没有登录到mysql服务端 +mysql --version +或 +mysql --V +``` + + + +### MySQL的语法规范 +​ 1.不区分大小写,但建议关键字大写,表名、列名小写 +​ 2.每条命令最好用分号结尾 +​ 3.每条命令根据需要,可以进行缩进 或换行 +​ 4.注释 +​ 单行注释:#注释文字 +​ 单行注释:-- 注释文字 +​ 多行注释:/* 注释文字 */ +​ +​ +​ + +### SQL的语言分类 +​ DQL(Data Query Language):数据查询语言 +​ select +​ DML(Data Manipulate Language):数据操作语言 +​ insert 、update、delete +​ DDL(Data Define Languge):数据定义语言 +​ create、drop、alter +​ TCL(Transaction Control Language):事务控制语言 +​ commit、rollback +​ + + + +### SQL的常见命令 + +```sql +show databases; 查看所有的数据库 +use 库名; 打开指定 的库 +show tables ; 显示库中的所有表 +show tables from 库名;显示指定库中的所有表 +create table 表名( + 字段名 字段类型, + 字段名 字段类型 +); 创建表 + +desc 表名; 查看指定表的结构 +select * from 表名;显示表中的所有数据 +``` + + + +## DQL语言的学习 +### 进阶1:基础查询 +​ 语法: +​ SELECT 要查询的东西 +​ 【FROM 表名】; + + 类似于Java中 :System.out.println(要打印的东西); + 特点: + ①通过select查询完的结果 ,是一个虚拟的表格,不是真实存在 + ② 要查询的东西 可以是常量值、可以是表达式、可以是字段、可以是函数 + +### 进阶2:条件查询 +​ 条件查询:根据条件过滤原始表的数据,查询到想要的数据 +​ 语法: +​ select +​ 要查询的字段|表达式|常量值|函数 +​ from +​ 表 +​ where +​ 条件 ; + +```sql +分类: +一、条件表达式 + 示例:salary>10000 + 条件运算符: + > < >= <= = != <> + +二、逻辑表达式 +示例:salary>10000 && salary<20000 + +逻辑运算符: + + and(&&):两个条件如果同时成立,结果为true,否则为false + or(||):两个条件只要有一个成立,结果为true,否则为false + not(!):如果条件成立,则not后为false,否则为true + +三、模糊查询 +示例:last_name like 'a%' +``` + +### 进阶3:排序查询 + +```sql +语法: +select + 要查询的东西 +from + 表 +where + 条件 + +order by 排序的字段|表达式|函数|别名 【asc|desc】 +``` + + +### 进阶4:常见函数 +​ 一、单行函数 + +```sql +1、字符函数 + concat拼接 + substr截取子串 + upper转换成大写 + lower转换成小写 + trim去前后指定的空格和字符 + ltrim去左边空格 + rtrim去右边空格 + replace替换 + lpad左填充 + rpad右填充 + instr返回子串第一次出现的索引 + length 获取字节个数 +2、数学函数 + round 四舍五入 + rand 随机数 + floor向下取整 + ceil向上取整 + mod取余 + truncate截断 +3、日期函数 + now当前系统日期+时间 + curdate当前系统日期 + curtime当前系统时间 + str_to_date 将字符转换成日期 + date_format将日期转换成字符 +4、流程控制函数 + if 处理双分支 + case语句 处理多分支 + 情况1:处理等值判断 + 情况2:处理条件判断 + +5、其他函数 + version版本 + database当前库 + user当前连接用户 +``` + + +​ + + +二、分组函数 + + +```sql + sum 求和 + max 最大值 + min 最小值 + avg 平均值 + count 计数 + + 特点: + 1、以上五个分组函数都忽略null值,除了count(*) + 2、sum和avg一般用于处理数值型 + max、min、count可以处理任何数据类型 + 3、都可以搭配distinct使用,用于统计去重后的结果 + 4、count的参数可以支持: + 字段、*、常量值,一般放1 + + 建议使用 count(*) +``` + +进阶5:分组查询 + +```sql + 语法: + select 查询的字段,分组函数 + from 表 + group by 分组的字段 + +``` + + + +```sql +特点: +1、可以按单个字段分组 +2、和分组函数一同查询的字段最好是分组后的字段 +3、分组筛选 + 针对的表 位置 关键字 +分组前筛选: 原始表 group by的前面 where +分组后筛选: 分组后的结果集 group by的后面 having + +4、可以按多个字段分组,字段之间用逗号隔开 +5、可以支持排序 +6、having后可以支持别名 +``` + +### 进阶6:多表连接查询 + + 笛卡尔乘积:如果连接条件省略或无效则会出现 + 解决办法:添加上连接条件 + +一、传统模式下的连接 :等值连接——非等值连接 + + + 1.等值连接的结果 = 多个表的交集 + 2.n表连接,至少需要n-1个连接条件 + 3.多个表不分主次,没有顺序要求 + 4.一般为表起别名,提高阅读性和性能 + +二、sql99语法:通过join关键字实现连接 + +```sql +含义:1999年推出的sql语法 +支持: +等值连接、非等值连接 (内连接) +外连接 +交叉连接 + +语法: + +select 字段,... +from 表1 +【inner|left outer|right outer|cross】join 表2 on 连接条件 +【inner|left outer|right outer|cross】join 表3 on 连接条件 +【where 筛选条件】 +【group by 分组字段】 +【having 分组后的筛选条件】 +【order by 排序的字段或表达式】 + +好处:语句上,连接条件和筛选条件实现了分离,简洁明了! +``` + + +​ +三、自连接 + +案例:查询员工名和直接上级的名称 + +sql99 + +```sql +SELECT e.last_name,m.last_name +FROM employees e +JOIN employees m ON e.`manager_id`=m.`employee_id`; +``` + +sql92 + + +```sql +SELECT e.last_name,m.last_name +FROM employees e,employees m +WHERE e.`manager_id`=m.`employee_id`; +``` + +### 进阶7:子查询 + +含义: + + 一条查询语句中又嵌套了另一条完整的select语句,其中被嵌套的select语句,称为子查询或内查询 + 在外面的查询语句,称为主查询或外查询 + +特点: + +```sql +1、子查询都放在小括号内 +2、子查询可以放在from后面、select后面、where后面、having后面,但一般放在条件的右侧 +3、子查询优先于主查询执行,主查询使用了子查询的执行结果 +4、子查询根据查询结果的行数不同分为以下两类: +① 单行子查询 + 结果集只有一行 + 一般搭配单行操作符使用:> < = <> >= <= + 非法使用子查询的情况: + a、子查询的结果为一组值 + b、子查询的结果为空 + +② 多行子查询 + 结果集有多行 + 一般搭配多行操作符使用:any、all、in、not in + in: 属于子查询结果中的任意一个就行 + any和all往往可以用其他查询代替 +``` + +### 进阶8:分页查询 + +应用场景: + + 实际的web项目中需要根据用户的需求提交对应的分页查询的sql语句 + +语法: + +```sql +select 字段|表达式,... +from 表 +【where 条件】 +【group by 分组字段】 +【having 条件】 +【order by 排序的字段】 +limit 【起始的条目索引,】条目数; +``` + +特点: + +```sql +1.起始条目索引从0开始 + +2.limit子句放在查询语句的最后 + +3.公式:select * from 表 limit (page-1)*sizePerPage,sizePerPage +假如: +每页显示条目数sizePerPage +要显示的页数 page +``` + +### 进阶9:联合查询 + +引入: + union 联合、合并 + +语法: + +```sql +select 字段|常量|表达式|函数 【from 表】 【where 条件】 union 【all】 +select 字段|常量|表达式|函数 【from 表】 【where 条件】 union 【all】 +select 字段|常量|表达式|函数 【from 表】 【where 条件】 union 【all】 +..... +select 字段|常量|表达式|函数 【from 表】 【where 条件】 +``` + +特点: + +```sql +1、多条查询语句的查询的列数必须是一致的 +2、多条查询语句的查询的列的类型几乎相同 +3、union代表去重,union all代表不去重 +``` + +## DML语言 + +### 插入 + +语法: + insert into 表名(字段名,...) + values(值1,...); + +特点: + + 1、字段类型和值类型一致或兼容,而且一一对应 + 2、可以为空的字段,可以不用插入值,或用null填充 + 3、不可以为空的字段,必须插入值 + 4、字段个数和值的个数必须一致 + 5、字段可以省略,但默认所有字段,并且顺序和表中的存储顺序一致 + +### 修改 + +修改单表语法: + +```sql +update 表名 set 字段=新值,字段=新值 +【where 条件】 +``` +修改多表语法: + +```sql +update 表1 别名1,表2 别名2 +set 字段=新值,字段=新值 +where 连接条件 +and 筛选条件 +``` + +### 删除 + +方式1:delete语句 + +单表的删除: ★ + delete from 表名 【where 筛选条件】 + +多表的删除: + delete 别名1,别名2 + from 表1 别名1,表2 别名2 + where 连接条件 + and 筛选条件; + + +方式2:truncate语句 + +```sql +truncate table 表名 +``` + + +两种方式的区别【面试题】 + + #1.truncate不能加where条件,而delete可以加where条件 + + #2.truncate的效率高一丢丢 + + #3.truncate 删除带自增长的列的表后,如果再插入数据,数据从1开始 + #delete 删除带自增长列的表后,如果再插入数据,数据从上一次的断点处开始 + + #4.truncate删除不能回滚,delete删除可以回滚 + +## DDL语句 +### 库和表的管理 +库的管理: + +```sql +一、创建库 +create database 库名 +二、删除库 +drop database 库名 +``` +表的管理: + #1.创建表 + + +```sql +CREATE TABLE IF NOT EXISTS stuinfo( + stuId INT, + stuName VARCHAR(20), + gender CHAR, + bornDate DATETIME +``` + + +​ +```sql +); + +DESC studentinfo; +#2.修改表 alter +语法:ALTER TABLE 表名 ADD|MODIFY|DROP|CHANGE COLUMN 字段名 【字段类型】; + +#①修改字段名 +ALTER TABLE studentinfo CHANGE COLUMN sex gender CHAR; + +#②修改表名 +ALTER TABLE stuinfo RENAME [TO] studentinfo; +#③修改字段类型和列级约束 +ALTER TABLE studentinfo MODIFY COLUMN borndate DATE ; + +#④添加字段 + +ALTER TABLE studentinfo ADD COLUMN email VARCHAR(20) first; +#⑤删除字段 +ALTER TABLE studentinfo DROP COLUMN email; +``` + + +​ +```sql +#3.删除表 + +DROP TABLE [IF EXISTS] studentinfo; +``` + + +​ + +### 常见类型 + + 整型: + + 小数: + 浮点型 + 定点型 + 字符型: + 日期型: + Blob类型: + + + +### 常见约束 + +```sql +NOT NULL +DEFAULT +UNIQUE +CHECK +PRIMARY KEY +FOREIGN KEY +``` + +## 数据库事务 +### 含义 +​ 通过一组逻辑操作单元(一组DML——sql语句),将数据从一种状态切换到另外一种状态 + +### 特点 +​ (ACID) +​ 原子性:要么都执行,要么都回滚 +​ 一致性:保证数据的状态操作前和操作后保持一致 +​ 隔离性:多个事务同时操作相同数据库的同一个数据时,一个事务的执行不受另外一个事务的干扰 +​ 持久性:一个事务一旦提交,则数据将持久化到本地,除非其他事务对其进行修改 + +相关步骤: + + 1、开启事务 + 2、编写事务的一组逻辑操作单元(多条sql语句) + 3、提交事务或回滚事务 + +### 事务的分类: + +隐式事务,没有明显的开启和结束事务的标志 + +```sql +比如 +insert、update、delete语句本身就是一个事务 +``` + + +显式事务,具有明显的开启和结束事务的标志 + +```sql + 1、开启事务 + 取消自动提交事务的功能 + + 2、编写事务的一组逻辑操作单元(多条sql语句) + insert + update + delete + + 3、提交事务或回滚事务 +``` +### 使用到的关键字 + +```sql +set autocommit=0; +start transaction; +commit; +rollback; + +savepoint 断点 +commit to 断点 +rollback to 断点 +``` + +### 事务的隔离级别: + +事务并发问题如何发生? + + 当多个事务同时操作同一个数据库的相同数据时 +事务的并发问题有哪些? + + 脏读:一个事务读取到了另外一个事务未提交的数据 + 不可重复读:同一个事务中,多次读取到的数据不一致 + 幻读:一个事务读取数据时,另外一个事务进行更新,导致第一个事务读取到了没有更新的数据 + +如何避免事务的并发问题? + +```sql +通过设置事务的隔离级别 +1、READ UNCOMMITTED +2、READ COMMITTED 可以避免脏读 +3、REPEATABLE READ 可以避免脏读、不可重复读和一部分幻读 +4、SERIALIZABLE可以避免脏读、不可重复读和幻读 +``` + +设置隔离级别: + +```sql +set session|global transaction isolation level 隔离级别名; +``` +查看隔离级别: + + select @@tx_isolation; + + + +## 视图 +含义:理解成一张虚拟的表 + +视图和表的区别: + + 使用方式 占用物理空间 + + 视图 完全相同 不占用,仅仅保存的是sql逻辑 + + 表 完全相同 占用 + +视图的好处: + + + 1、sql语句提高重用性,效率高 + 2、和表实现了分离,提高了安全性 + +### 视图的创建 +​ 语法: +​ CREATE VIEW 视图名 +​ AS +​ 查询语句; +### 视图的增删改查 +​ 1、查看视图的数据 ★ +​ + +```sql +SELECT * FROM my_v4; +SELECT * FROM my_v1 WHERE last_name='Partners'; + +2、插入视图的数据 +INSERT INTO my_v4(last_name,department_id) VALUES('虚竹',90); + +3、修改视图的数据 + +UPDATE my_v4 SET last_name ='梦姑' WHERE last_name='虚竹'; +``` + + +​ +​ 4、删除视图的数据 +​ DELETE FROM my_v4; +### 某些视图不能更新 +​ 包含以下关键字的sql语句:分组函数、distinct、group by、having、union或者union all +​ 常量视图 +​ Select中包含子查询 +​ join +​ from一个不能更新的视图 +​ where子句的子查询引用了from子句中的表 +### 视图逻辑的更新 +​ #方式一: +​ CREATE OR REPLACE VIEW test_v7 +​ AS +​ SELECT last_name FROM employees +​ WHERE employee_id>100; +​ + +```sql +#方式二: +ALTER VIEW test_v7 +AS +SELECT employee_id FROM employees; + +SELECT * FROM test_v7; +``` +### 视图的删除 +​ DROP VIEW test_v1,test_v2,test_v3; +### 视图结构的查看 +​ DESC test_v7; +​ SHOW CREATE VIEW test_v7; + +## 存储过程 + +含义:一组经过预先编译的sql语句的集合 +好处: + + 1、提高了sql语句的重用性,减少了开发程序员的压力 + 2、提高了效率 + 3、减少了传输次数 + +分类: + +```sql +1、无返回无参 +2、仅仅带in类型,无返回有参 +3、仅仅带out类型,有返回无参 +4、既带in又带out,有返回有参 +5、带inout,有返回有参 +注意:in、out、inout都可以在一个存储过程中带多个 +``` +### 创建存储过程 +语法: + +```sql +create procedure 存储过程名(in|out|inout 参数名 参数类型,...) +begin + 存储过程体 + +end +``` + +类似于方法: + +```sql +修饰符 返回类型 方法名(参数类型 参数名,...){ + + 方法体; +} +``` + +注意 + +```sql +1、需要设置新的结束标记 +delimiter 新的结束标记 +示例: +delimiter $ + +CREATE PROCEDURE 存储过程名(IN|OUT|INOUT 参数名 参数类型,...) +BEGIN + sql语句1; + sql语句2; + +END $ + +2、存储过程体中可以有多条sql语句,如果仅仅一条sql语句,则可以省略begin end + +3、参数前面的符号的意思 +in:该参数只能作为输入 (该参数不能做返回值) +out:该参数只能作为输出(该参数只能做返回值) +inout:既能做输入又能做输出 +``` + +#调用存储过程 + call 存储过程名(实参列表) +## 函数 + +### 创建函数 + +学过的函数:LENGTH、SUBSTR、CONCAT等 +语法: + +```sql +CREATE FUNCTION 函数名(参数名 参数类型,...) RETURNS 返回类型 +BEGIN + 函数体 + +END +``` + +### 调用函数 +​ SELECT 函数名(实参列表) + + + + + +### 函数和存储过程的区别 + +```sql + 关键字 调用语法 返回值 应用场景 +函数 FUNCTION SELECT 函数() 只能是一个 一般用于查询结果为一个值并返回时,当有返回值而且仅仅一个 +存储过程 PROCEDURE CALL 存储过程() 可以有0个或多个 一般用于更新 +``` + +## 流程控制结构 + +### 系统变量 +一、全局变量 + +作用域:针对于所有会话(连接)有效,但不能跨重启 + +```sql +查看所有全局变量 +SHOW GLOBAL VARIABLES; +查看满足条件的部分系统变量 +SHOW GLOBAL VARIABLES LIKE '%char%'; +查看指定的系统变量的值 +SELECT @@global.autocommit; +为某个系统变量赋值 +SET @@global.autocommit=0; +SET GLOBAL autocommit=0; +``` + +二、会话变量 + +作用域:针对于当前会话(连接)有效 + +```sql +查看所有会话变量 +SHOW SESSION VARIABLES; +查看满足条件的部分会话变量 +SHOW SESSION VARIABLES LIKE '%char%'; +查看指定的会话变量的值 +SELECT @@autocommit; +SELECT @@session.tx_isolation; +为某个会话变量赋值 +SET @@session.tx_isolation='read-uncommitted'; +SET SESSION tx_isolation='read-committed'; +``` + +### 自定义变量 +一、用户变量 + +声明并初始化: + +```sql +SET @变量名=值; +SET @变量名:=值; +SELECT @变量名:=值; +``` +赋值: + +```sql +方式一:一般用于赋简单的值 +SET 变量名=值; +SET 变量名:=值; +SELECT 变量名:=值; +``` + + +```sql +方式二:一般用于赋表 中的字段值 +SELECT 字段名或表达式 INTO 变量 +FROM 表; +``` + +使用: + +```sql +select @变量名; +``` + +二、局部变量 + +声明: + +```sql +declare 变量名 类型 【default 值】; +``` +赋值: + +```sql +方式一:一般用于赋简单的值 +SET 变量名=值; +SET 变量名:=值; +SELECT 变量名:=值; +``` + + +```sql +方式二:一般用于赋表 中的字段值 +SELECT 字段名或表达式 INTO 变量 +FROM 表; +``` + +使用: + +```sql +select 变量名 +``` + + + +二者的区别: + + 作用域 定义位置 语法 +用户变量 当前会话 会话的任何地方 加@符号,不用指定类型 +局部变量 定义它的BEGIN END中 BEGIN END的第一句话 一般不用加@,需要指定类型 + +### 分支 +一、if函数 + 语法:if(条件,值1,值2) + 特点:可以用在任何位置 + +二、case语句 + +语法: + +```sql +情况一:类似于switch +case 表达式 +when 值1 then 结果1或语句1(如果是语句,需要加分号) +when 值2 then 结果2或语句2(如果是语句,需要加分号) +... +else 结果n或语句n(如果是语句,需要加分号) +end 【case】(如果是放在begin end中需要加上case,如果放在select后面不需要) + +情况二:类似于多重if +case +when 条件1 then 结果1或语句1(如果是语句,需要加分号) +when 条件2 then 结果2或语句2(如果是语句,需要加分号) +... +else 结果n或语句n(如果是语句,需要加分号) +end 【case】(如果是放在begin end中需要加上case,如果放在select后面不需要) +``` + +特点: + 可以用在任何位置 + +三、if elseif语句 + +语法: + +```sql +if 情况1 then 语句1; +elseif 情况2 then 语句2; +... +else 语句n; +end if; +``` + +特点: + 只能用在begin end中!!!!!!!!!!!!!!! + +三者比较: + 应用场合 + if函数 简单双分支 + case结构 等值判断 的多分支 + if结构 区间判断 的多分支 + +### 循环 + +语法: + + +```sql +【标签:】WHILE 循环条件 DO + 循环体 +END WHILE 【标签】; +``` + +特点: + +```sql +只能放在BEGIN END里面 + +如果要搭配leave跳转语句,需要使用标签,否则可以不用标签 + +leave类似于java中的break语句,跳出所在循环!!! +``` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/课件/MySQL/MySQL详讲-PDF/1. MySQL基本操作.pdf b/课件/MySQL/MySQL详讲-PDF/1. MySQL基本操作.pdf new file mode 100644 index 0000000..f1e578c Binary files /dev/null and b/课件/MySQL/MySQL详讲-PDF/1. MySQL基本操作.pdf differ diff --git a/课件/MySQL/MySQL详讲-PDF/2. 列类型和数据完整性.pdf b/课件/MySQL/MySQL详讲-PDF/2. 列类型和数据完整性.pdf new file mode 100644 index 0000000..f005396 Binary files /dev/null and b/课件/MySQL/MySQL详讲-PDF/2. 列类型和数据完整性.pdf differ diff --git a/课件/MySQL/MySQL详讲-PDF/3. 数据库设计与查询语句.pdf b/课件/MySQL/MySQL详讲-PDF/3. 数据库设计与查询语句.pdf new file mode 100644 index 0000000..e4bc4fb Binary files /dev/null and b/课件/MySQL/MySQL详讲-PDF/3. 数据库设计与查询语句.pdf differ diff --git a/课件/MySQL/MySQL详讲-PDF/4. 视图、事务、索引、函数.pdf b/课件/MySQL/MySQL详讲-PDF/4. 视图、事务、索引、函数.pdf new file mode 100644 index 0000000..ade32e4 Binary files /dev/null and b/课件/MySQL/MySQL详讲-PDF/4. 视图、事务、索引、函数.pdf differ diff --git a/课件/MySQL/MySQL详讲-PDF/思维导图/第一讲:MySQL基本操作.pdf b/课件/MySQL/MySQL详讲-PDF/思维导图/第一讲:MySQL基本操作.pdf new file mode 100644 index 0000000..e86c313 Binary files /dev/null and b/课件/MySQL/MySQL详讲-PDF/思维导图/第一讲:MySQL基本操作.pdf differ diff --git a/课件/MySQL/MySQL详讲-PDF/思维导图/第二讲:列类型和数据完整性.pdf b/课件/MySQL/MySQL详讲-PDF/思维导图/第二讲:列类型和数据完整性.pdf new file mode 100644 index 0000000..6e2c5d2 Binary files /dev/null and b/课件/MySQL/MySQL详讲-PDF/思维导图/第二讲:列类型和数据完整性.pdf differ diff --git a/课件/MySQL/MySQL详讲-PDF/测试数据.sql b/课件/MySQL/MySQL详讲-PDF/测试数据.sql new file mode 100644 index 0000000..97fc15a --- /dev/null +++ b/课件/MySQL/MySQL详讲-PDF/测试数据.sql @@ -0,0 +1,61 @@ +/*stu测试数据*/ +create table stu +( + stuNo char(6) primary key, + stuName varchar(10) not null, + stuSex char(2) not null, + stuAge tinyint not null , + stuSeat tinyint not null, + stuAddress varchar(10) not null, + ch tinyint, + math tinyint +); + + +insert into stu values ('s25301','张秋丽','男',18,1,'北京',80,null); +insert into stu values ('s25302','李文才','男',31,3,'上海',77,76); +insert into stu values ('s25303','李斯文','女',22,2,'北京',55,82); +insert into stu values ('s25304','欧阳俊雄','男',28,4,'天津',null,74); +insert into stu values ('s25305','诸葛丽丽','女',23,7,'河南',72,56); +insert into stu values ('s25318','争青小子','男',26,6,'天津',86,92); +insert into stu values ('s25319','梅超风','女',23,5,'河北',74,67); + +insert into stu values ('s25320','Tom','男',24,8,'北京',65,67); +insert into stu values ('s25321','Tabm','女',23,9,'河北',88,77); + +/*stuinfo测试数据*/ +create table stuinfo +( + stuNo char(6) primary key, + stuName varchar(10) not null, + stuSex char(2) not null, + stuAge tinyint not null , + stuSeat tinyint not null, + stuAddress varchar(10) not null +); + + +insert into stuinfo values ('s25301','张秋丽','男',18,1,'北京'); +insert into stuinfo values ('s25302','李文才','男',31,3,'上海'); +insert into stuinfo values ('s25303','李斯文','女',22,2,'北京'); +insert into stuinfo values ('s25304','欧阳俊雄','男',28,4,'天津'); +insert into stuinfo values ('s25305','诸葛丽丽','女',23,7,'河南'); +insert into stuinfo values ('s25318','争青小子','男',26,6,'天津'); +insert into stuinfo values ('s25319','梅超风','女',23,5,'河北'); + +/*stuMarks测试数据*/ + +create table stuMarks +( +examNo char(7) primary key, +stuNo char(6) not null , +writtenExam int, +labExam int +); + +insert into stumarks values ('s271811','s25303',80,58); +insert into stumarks values ('s271813','s25302',50,90); +insert into stumarks values ('s271815','s25304',65,50); +insert into stumarks values ('s271816','s25301',77,82); +insert into stumarks values ('s271819','s25318',56,48); +insert into stumarks values ('s271820','s25320',66,77); \ No newline at end of file