2025-02-06

This commit is contained in:
smallkun 2025-02-06 22:43:19 +08:00
parent 9480e81242
commit af0d9cdab6
82 changed files with 12564 additions and 0 deletions

4
.gitignore vendored Normal file
View File

@ -0,0 +1,4 @@
*
!*.*
!*/
!.gitignore

View File

@ -0,0 +1,5 @@
#include <stdio.h>
int main(){
return 0;
}

View File

@ -0,0 +1,24 @@
#include <stdio.h>
/*
*/
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;
}

View File

View File

@ -0,0 +1,254 @@
#include <stdio.h>
// 交换两个整数的值
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;
}

View File

@ -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,8089 分为B,7079 分为C,6069 分为D,60 分以下为E
6 有一函数请编程序计算y 的值(x 的值由键盘输入)。
<img src="https://yp.smallkun.cn/markdown/image-20241130003549906.png!compress" alt="image-20241130003549906" style="zoom:50%;" />
## 三、循环结构
1 计算n 的阶乘
2 求 1 到 100 之间的奇数之和、偶数之积。
3 输入一行字符,统计其中的英文字母、数字、空格和其他字符个数。
4 用循环语句编写求下列表达式值的程序。
<img src="https://yp.smallkun.cn/markdown/image-20241130003536421.png!compress" alt="image-20241130003536421" style="zoom:50%;" />
5.求1!+2!+3!+...+20!
6.求下列分数序列的前20项之和。
<img src="https://yp.smallkun.cn/markdown/image-20241130003647576.png!compress" alt="image-20241130003647576" style="zoom:50%;" />
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求其最大公约数和最小公倍数
提示:
求 mn的最大公约数:首先将 m除以 nm>n得余数 R再用余数 R 去除原来的除数,得新的余数,重复此过程直到余数为 0 时停止此时的除数就是m 和 n的最大公约数。
求 m和 n的最小公倍数: m和 n的积除以 m和 n 的最大公约数。
测试数据: m12 n24
m100 n300
12 打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数, 其各位数字立方
和等于该数本身。例如 153 是一个水仙花数,因为 1531\*1\*1+5\*5\*5+3\*3\*3要求分别用一重循环和三重循环实现
13 一个数恰好等于它的平方数的右端,这个数称为同构数。如 5 的平方是25 5 是25 中的右端的数, 5 就是同构数。找出11000 之间的全部同构数。
14 3025 这个数具有一种独特的性质将它平分为两段即30 和25使之相加后求平方30+25恰好等于3025 本身。请求出具有这样性质的全部四位数。
15 两位数13 和62 具有很有趣的性质把它们个位数字和十位数字对调其乘积不变即13*6231*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)
测试数据:① x0.3 n8
② x0.5 n20
21 验证歌德巴赫猜想。一个充分大的偶数大于或等于6可以分解为两个素数之和。试编程序将 6 至50 之间全部偶数表示为两个素数之和。
22 用牛顿迭代法求方程在 1.5 附近的根(精度为<img src="https://yp.smallkun.cn/markdown/image-20241130004125210.png!compress" alt="image-20241130004125210" style="zoom: 40%;" />)。
![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 个人围成一圈编号为016从第 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 个自然数 1100我们取 1 2 3 4 时, 我们可将其排成一圈使每两个数之和都是素数即→1→2→3→4→问 1100 内连续取 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 的拉丁方阵的每行、每列均为自然数的一个全排列, 每行(列)上均无重复数。
如 n5 时, 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在各行中的列标号。
测试数据:① n5 ② n8
## 五、函数
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 <stdio.h>
//定义一个函数 传入两个整型指针 交换 两个指针所指向的值
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 <stdio.h>
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<n;i++){
scanf("%d", arr+i);
}
}
//处理数组元素 最大值和最后一个元素交换,最小值和最前一个元素交换
void process(int *arr, int n){
int *max, *min;//max 最大值的地址 min最小值的地址
int i;
max = min = arr;
//通过遍历数组的所有元素 求出最大值和最小值的地址
for(i = 1;i < n;i++){
if(*(arr+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<n;i++){
printf("%d ", *(arr+i));
}
printf("\n");
}
int main(void){
int num[10];
input(num, 10);
process(num, 10);
output(num, 10);
return 0;
}
```
3、 有n 个整数使前面各数顺序向后移m 个位置最后m 个数变成最前面m 个数写一函数实现以上功能在主函数中输入n 个整数和输出调整后的n 个数。
```c
#include <stdio.h>
#include <stdlib.h>
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<n;i++){
printf("%d ", *(arr+i));
}
printf("\n");
}
int main(void){
int n, i, m;
int *num;
printf("请输入您需要输入的元素个数:");
scanf("%d", &n);
/*
1 2 3 4 5 n=5 m = 2
4 5 1 2 3
*/
num = (int *)malloc(sizeof(int)*n);//动态内存分配数组容量
printf("请输入%d个数字:", n);
for(i=0;i<n;i++){
scanf("%d", num+i);//遍历输入数组每一个元素
}
printf("移动前:");
output(num, n);
printf("请输入您需要移动的个数:");
scanf("%d", &m);
for(i = 0;i < m;i++){
move(num, n);
}
printf("移动后:");
output(num, n);
return 0;
}
```
4、 写一函数求一个字符串的长度。在main 函数中输入字符串,并输出其长度。
```c
#include <stdio.h>
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 <stdio.h>
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 <stdio.h>
#include <string.h>
/*
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 <stdio.h>
#include <stdlib.h>
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 <stdio.h>
#include <string.h>
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 <stdio.h>
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 <stdio.h>
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顺序号定为019。输入某一顺序号之后读出相应的数据并显示在屏幕上。
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开始打印然后一左一右依次打印出其它字母即MLNKO。要求初始化时按字母表顺序赋值。
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
<img src="https://yp.smallkun.cn/markdown/image-20241130010005134.png!compress" alt="image-20241130010005134" style="zoom:50%;" />
请编程序找出那些看不清的数字。
10.编程序计算下述函数在X-7-107 时的值。
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 是你的学号)
当 i<j a[i\][j\]=ij
当 i>j 时 a[i\][j\]=i×j
编程序求所有的数组元素之和。
19.找3 个数字,填在下面式子中,使等式成立。
<img src="https://yp.smallkun.cn/markdown/image-20241130010139383.png!compress!compress" alt="image-20241130010139383" style="zoom:50%;" />
① 若答案有多个,则打印一组即可;
② 若无满足条件的数字,则显示'NO DIGITALS'。
20.某航空公司规定在旅游旺季7─9 月份若订票超过20 张优惠票价的1520 张以下优惠5在旅游淡季1─5 月、10 月、11 月份订票超过20 张优惠3020 张以下优惠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+12=8120+252=2025。求10 至9999 之间满足这样条件的数是哪些? 共有多少个?
26.已知有9 个数,请求出这些数中的最大值、最小值及平均值,以及有多少个数等于平均值?
27.求二维数组中每行元素的平均值,不许引入其它的数组。
28.编程序计算函数
<img src="https://yp.smallkun.cn/markdown/image-20241130010348202.png!compress" alt="image-20241130010348202" style="zoom:50%;" />
的值。要求先将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 三元素是偶数时应按下图交换。
<img src="https://yp.smallkun.cn/markdown/image-20241130010458976.png!compress" alt="image-20241130010458976" style="zoom:50%;" />
32.编程序将一个6×6 的二维数组左下三角部分全赋值为-1右上三角全赋值为1主对角线列下标相同上的元素送入2。把数组中的值按列对齐方式输出。
要求: 不允许使用scanf 函数。
33.用随机函数求出10 组三位正整数,每组十个数,调用一函数打印出每组数,并编一函数求出每组中的最大数。
34.已知有三个数组A,B,CA 为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 的素数,验证<img src="https://yp.smallkun.cn/markdown/image-20241130010624492.png!compress" alt="image-20241130010624492" style="zoom:67%;" /> 可被120 整除。编程序输入a 的值判a-1 和a+1 是否为素数。若不是输出“NOTPRIME!”;若都是素数,再验证<img src="https://yp.smallkun.cn/markdown/image-20241130010624492.png!compress!compress" alt="image-20241130010624492" style="zoom:67%;" />是否可被120 整除。
36.有n 个整数编程序将前面的各个数依次向后移动k 个位置最后k 个数移到最前边的k 个位置见下图其中n=8k=3
<img src="https://yp.smallkun.cn/markdown/image-20241130010716416.png!compress!compress" alt="image-20241130010716416" style="zoom:50%;" />
思考: 程序中不许引入其它数组。
37.将一个数M 分解为质因数M≠0
38.将一个整数最多是10 位数从低位到高位打印出来如该数是12345 时输出应是54321只占一行
39.写一个函数比较两个字符串,如果s1=s2则返回值0如果s1>s2则返回值1如果s1<s2 则返回-1
40.求n!的末尾有多少个零。可以通过检查n!含有多少个10 的因数来求它末尾零的个数。因为10=2×5在n!中含有2 的因数显然多于含有5 的因数。一种求n!中5 的因数的个数的算法如下:
1)输入正整数n;
2)0=>k, n=>m;
3)若m<5转第5 否则执行第4 ;
4)m/5取整=>m, k+m=>k, 转第3 步;
5)输出kn!末尾零的个数)。
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 时, 其方阵为:
<img src="https://yp.smallkun.cn/markdown/image-20241130011036567.png!compress" alt="image-20241130011036567" style="zoom:50%;" />
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)
如果<img src="https://yp.smallkun.cn/markdown/image-20241130011207358.png!compress" alt="image-20241130011207358" style="zoom:50%;" />>di (i=k-1,k-2,...,1)则称N 是严格降序数;如果<img src="https://yp.smallkun.cn/markdown/image-20241130011207358.png!compress!compress" alt="image-20241130011207358" style="zoom:50%;" /><di (i=k-1,k-2,...,1)则称N 是严格升序数如果<img src="https://yp.smallkun.cn/markdown/image-20241130011232509.png!compress" alt="image-20241130011232509" style="zoom:50%;" />=di (i=k-1,k-2,...,1)则称N 是等序数此外则称N是无序数。例如 4321 是严格降序数1234 是严格升序数2222 是等序数1243 是无序数。从键盘上输入一个大于9 的整数N判它属于上述哪一类。
49.用简单迭代法解方程 <img src="https://yp.smallkun.cn/markdown/image-20241130011311960.png!compress" alt="image-20241130011311960" style="zoom:50%;" />它有两个根(如图),其迭代公式为:
![image-20241130011327616](https://yp.smallkun.cn/markdown/image-20241130011327616.png!compress!compress)
注:本程序中选取初值<img src="https://yp.smallkun.cn/markdown/image-20241130011341115.png!compress" alt="image-20241130011341115" style="zoom:50%;" /> 不同时要分别使用公式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”。
<img src="https://yp.smallkun.cn/markdown/image-20241130011603125.png!compress" alt="image-20241130011603125" style="zoom:50%;" />
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 表示10B 表示11,…F 表示15。
58.在主函数中输入10 个不等长的字符串用另一函数对它们排序。然后在主函数中输出这10 个已排好序的字符串,用指针数组完成。
59.建立一个链表,每个结点包括:学号、姓名、性别、年龄。输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,将此结点删除,输出最后的链表。
60.有两个链表a和b。设结点中包含学号、姓名。从a链表中删除与b链表中有相同学号的那些结点。

View File

@ -0,0 +1,254 @@
1输入一小写字母分别以字符形式与数值形式输出与该小写字母相应的大写字母
```sql
//输入一小写字母,分别以字符形式与数值形式输出与该小写字母相应的大写字母
#include<stdio.h>
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,计算
<img src="https://yp.smallkun.cn/markdown/image-20250116004443767.png!compress" alt="image-20250116004443767" style="zoom:33%;" />
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五个变量的值分别为China经过运算使c1、c2、 c3、c4、c5分别为Glmre并输出
7编写程序用getchar函数读入两个字符c1,c2然后分别用putchar函数和prinf函数输出这两个字符以 及它们的ASCII值。
8设圆半径r=1.5圆柱高h=3,求圆周长,圆面积,圆球表面积,圆球体积,圆柱体积
9编写程序输入两个整数 ,计算并输出它们的和、差、积、除(精确除)、整除及模的结果。
10编一程序对于一个给定的一个百分制成绩输出相应的五分制成绩。设90分以上为ˊAˊ8089 分为ˊBˊ7079分为ˊCˊ6069分为ˊ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且在[09]范围内,若加密后某位数字 大于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=123.编程找出1000以内的所 有完数。
36猴子吃桃问题猴子第一天摘下若干个桃子当即吃了一半还不瘾又多吃了一个第二天早上又将剩 下的桃子吃掉一半又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再 吃时,见只剩下一个桃子了。求第一天共摘了多少.
37有一分数序列2/13/25/38/513/821/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编写一程序求135799101的值。
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个西瓜第一天卖一半多两个以后每天卖剩下的一半多两个问几天以后能卖完
544位反序数设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子串删除。函数deletesin实现从字符串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(xy)以实现两个整数之间的交换并利用它将一维数组a和b的所有元素的值进行交换。
109输入两个整数,求它们相除的余数.用带参数的宏来实现,编程序.
110定义两个带参数的宏一个用来求S(s=1/2(a+b+c))另个用来求areaarea为三角形的面积。写程序在程序中用带实参的宏名来求面积area。
111已知字符串S中的内容为“Student请用指针的方法将S中的内容逆序输出且不能改变串中的内容。
112输入一行文字找出其中大写字母、小写字母、空格、数字以及其他字符个数。要求用指针实现
113通过指针操作将输入的3个字符串按由大到小的顺序输出。
114定义整型数组a,有10个元素,用指针实现数组中的全部元素的输出.
115编一程序将字符串computer赋给一个字符数组然后从第一个字母开始间隔地输出该串。请用指针完成。
116利用指针编写一程序将字符串中的第m个字符开始的全部字符复制成另一个字符串。要求在主函数中输入字符串及m的值并输出复制结果在被调函数中完成复制。
117用指针法实现输入10个数按由小到大的顺序输出。
118用指针法实现写一个函数求一个字符串的长度。在main函数中输入字符串并输出其长度值。
119从键盘输入10个学生的成绩显示其中的最高分、最低分和平均分。用指针实现。
120数组中存放N个元素编写程序删除掉下标为奇数的元素使得数组中只存放下标为偶数的元素。用指针实现。

View File

@ -0,0 +1,20 @@
#include <stdio.h>
// !定义一些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;
}

478
2207/C语言精通120题.md Normal file
View File

@ -0,0 +1,478 @@
1输入一小写字母分别以字符形式与数值形式输出与该小写字母相应的大写字母
2输入一个华氏温度要求输出摄氏温度。公式为c=5/9*(f-32)
3写一个程序输入实数X,输出Y,计算<img src="https://yp.smallkun.cn/markdown/image-20250116004443767.png!compress" alt="image-20250116004443767" style="zoom:33%;" />
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五个变量的值分别为China经过运算使c1、c2、 c3、c4、c5分别为Glmre并输出
7编写程序用getchar函数读入两个字符c1,c2然后分别用putchar函数和prinf函数输出这两个字符以 及它们的ASCII值。
8设圆半径r=1.5圆柱高h=3,求圆周长,圆面积,圆球表面积,圆球体积,圆柱体积
9编写程序输入两个整数 ,计算并输出它们的和、差、积、除(精确除)、整除及模的结果。
10编一程序对于一个给定的一个百分制成绩输出相应的五分制成绩。设90分以上为ˊAˊ8089 分为ˊBˊ7079分为ˊCˊ6069分为ˊ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且在[09]范围内,若加密后某位数字 大于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=123.编程找出1000以内的所 有完数。
36猴子吃桃问题猴子第一天摘下若干个桃子当即吃了一半还不瘾又多吃了一个第二天早上又将剩 下的桃子吃掉一半又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再 吃时,见只剩下一个桃子了。求第一天共摘了多少.
37有一分数序列2/13/25/38/513/821/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编写一程序求135799101的值。
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个西瓜第一天卖一半多两个以后每天卖剩下的一半多两个问几天以后能卖完
544位反序数设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子串删除。函数deletesin实现从字符串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(xy)以实现两个整数之间的交换并利用它将一维数组a和b的所有元素的值进行交换。
109输入两个整数,求它们相除的余数.用带参数的宏来实现,编程序.
110定义两个带参数的宏一个用来求S(s=1/2(a+b+c))另个用来求areaarea为三角形的面积。写程序在程序中用带实参的宏名来求面积area。
111已知字符串S中的内容为“Student请用指针的方法将S中的内容逆序输出且不能改变串中的内容。
112输入一行文字找出其中大写字母、小写字母、空格、数字以及其他字符个数。要求用指针实现
113通过指针操作将输入的3个字符串按由大到小的顺序输出。
114定义整型数组a,有10个元素,用指针实现数组中的全部元素的输出.
115编一程序将字符串computer赋给一个字符数组然后从第一个字母开始间隔地输出该串。请用指针完成。
116利用指针编写一程序将字符串中的第m个字符开始的全部字符复制成另一个字符串。要求在主函数中输入字符串及m的值并输出复制结果在被调函数中完成复制。
117用指针法实现输入10个数按由小到大的顺序输出。
118用指针法实现写一个函数求一个字符串的长度。在main函数中输入字符串并输出其长度值。
119从键盘输入10个学生的成绩显示其中的最高分、最低分和平均分。用指针实现。
120数组中存放N个元素编写程序删除掉下标为奇数的元素使得数组中只存放下标为偶数的元素。用指针实现。

107
2207/MySQL常用语法.md Normal file
View File

@ -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 ;
```

View File

@ -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.条件、连接查询 视图
```

View File

@ -0,0 +1,246 @@
### C语言-1
```c
/*------------------------------------------------------------------------------
1【程序设计】定义一个大小为50的整型数组将数字1~50存入该数组利用指针将数组中的值输出每行5个每个数字占4个符号位左对齐。
------------------------------------------------------------------------------*/
#include <stdio.h>
#include <stdlib.h>
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 <stdio.h>
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<size1;i++){
mergedArray[j++] = arr1[i];
mergedArray[j++] = arr2[i];
}
//降序排序
for(i=0;i<size1*2-1;i++){//已经有序的个数
for(j=0;j<size1*2-i-1;j++){//i每+1 代表最前面已经有一个最小的元素
if(mergedArray[j] < mergedArray[j+1]){ //无序的元素两两比较小值后移
temp = mergedArray[j];
mergedArray[j] = mergedArray[j+1];
mergedArray[j+1] = temp;
}
}
}
//去重
/*
默认第一个数字不用判断,从数组中第二个元素开始判断,
是否等于前一项如果不等于则进行赋值操作,然后元素个数加一
*/
*newLen = 1;//当前数组中已经过滤后的有效数字个数
for(i=1;i<size1*2;i++){//使用i变量从1下标元素开始 遍历数组中的所有数字
if(mergedArray[(*newLen) - 1] != mergedArray[i]){
//如果当前判断的元素不等于前一个元素则插入到有效数字位置
mergedArray[(*newLen)++] = mergedArray[i];
}
}
/********** End **********/
return mergedArray;
}
```
### MySQL-1
```sql
#1. 设置字段主键+自动增长
ALTER TABLE t_user MODIFY uid INT(11) PRIMARY KEY AUTO_INCREMENT;
#只设置主键
ALTER TABLE t_user ADD PRIMARY KEY(uid);
#2. 插入记录
#DEFAULT 自增/默认值/NULL
INSERT INTO t_user()
VALUES(DEFAULT, 'mike', 'mm123', '小明', DEFAULT);
#3. 更新记录
UPDATE t_user u
SET u.`password` = '888888'
WHERE u.username = 'Dennis';
#4. tj11 条件查询+多表联查
SELECT u.nickname, c.mid, c.score, c.content
FROM t_user u, t_comment c
WHERE u.uid = c.uid AND u.nickname = '白色';
#5. tj12 分组查询+多表联查
SELECT m.mname, ROUND(AVG(c.score), 2)
FROM t_movie m, t_comment c
WHERE m.mid = c.mid
GROUP BY m.mid;
#6. tj13 分组查询+多表联查
SELECT m.mname, COUNT(*)
FROM t_movie m, t_comment c
WHERE m.mid = c.mid
GROUP BY m.mid;
#7 视图 多表联查
CREATE VIEW v_movie AS
SELECT m.mname, u.nickname, c.score, c.content
FROM t_user u, t_movie m , t_comment c
WHERE u.uid = c.uid AND m.mid = c.mid;
#8 存储过程
DELIMITER $$
DROP PROCEDURE IF EXISTS pro_getUserNumber;
CREATE PROCEDURE pro_getUserNumber(IN in_uid INT, OUT out_number INT)
BEGIN
SET out_number = (
SELECT COUNT(*)
FROM t_user u, t_comment c
WHERE u.uid = c.uid AND u.uid = in_uid
);
END $$
DELIMITER ;
#9 触发器
DELIMITER $$
DROP TRIGGER IF EXISTS tri_userlog;
CREATE TRIGGER tri_userlog
AFTER INSERT ON t_user
FOR EACH ROW
BEGIN
INSERT INTO t_log()
VALUES(DEFAULT, NEW.uid, '新增用户', '2024-01-01');
END $$
DELIMITER ;
```
### MySQL-2
```sql
#1 修改表结构
ALTER TABLE t_examinee MODIFY sex CHAR(2);
DESC t_examinee;#查看表结构
#2 插入记录
INSERT INTO t_room()
VALUES(DEFAULT, '202教室', '2号教学楼');
#3 删除记录
DELETE FROM t_teacher
WHERE rid IS NULL;
#4 更新记录
UPDATE t_examinee
SET tel = '1396668888'
WHERE ename = '龚致远';
#5 tj11 条件查询+多表联查
SELECT e.ename, r.rname, r.site
FROM t_examinee e, t_room r
WHERE e.rid = r.rid AND e.ename = '陶宇宁';
#6 tj12
SELECT r.rname, r.site, t.tname, t.tel
FROM t_teacher t, t_room r
WHERE t.rid = r.rid AND r.rname = '402教室';
#7
CREATE VIEW v_exam AS
SELECT e.ename, e.sex, e.tel, e.examnum, r.rname, r.site
FROM t_examinee e, t_room r
WHERE e.rid = r.rid;
#8 存储过程
DELIMITER $$
DROP PROCEDURE IF EXISTS pro_getExamNumber;
CREATE PROCEDURE pro_getExamNumber(IN in_rid INT, OUT out_number INT)
BEGIN
SELECT COUNT(*) INTO out_number
FROM t_examinee e
WHERE e.rid = in_rid;
END $$
DELIMITER ;
#9 触发器
DELIMITER $$
DROP TRIGGER IF EXISTS tri_examlog;
CREATE TRIGGER tri_examlog
BEFORE INSERT ON t_examinee
FOR EACH ROW
BEGIN
INSERT INTO t_log()
VALUES(DEFAULT, NEW.eid, '新增考生', '2024-01-01');
END $$
DELIMITER ;
```

View File

@ -0,0 +1,346 @@
### C语言-1
```c
/*------------------------------------------------------------------------------
【程序设计】输入一个1000以内的三位数找出小于这个三位数且个位数字与十位数字之和
除以10所得的余数等于百位数字的数并输出满足条件的数字之和。
------------------------------------------------------------------------
注意部分源程序给出如下。请勿改动主函数main或其它函数中给出的内容否则不得分。
仅在Program-End之间填入若干语句。不要删除标志否则不得分。
------------------------------------------------------------------------------*/
#include<stdio.h>
int main()
{
int a,b,c,d,i,j,sum=0;
scanf("%d",&j);
/**********Program**********/
for(i=100;i<j;i++){
a = i%10;//个位
b = i%100/10;//十位
c = i/100;//百位
d = (a+b)%10;//个位+十位 取模
if(c == d){
sum += i;
}
}
/********** End **********/
printf("%d\n",sum);
}
```
### C语言-2
```c
/*------------------------------------------------------------------------------
【程序设计】任意一个大于0的正整数都可以写成若干个2的正整数次幂的和的形式。
例如7=2^2+2^1+2^0
------------------------------------------------------------------------
注意部分源程序给出如下。请勿改动主函数main或其它函数中给出的内容否则不得分。
仅在Program-End之间填入若干语句。不要删除标志否则不得分。
------------------------------------------------------------------------------*/
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<ctype.h>
#include<stdlib.h>
#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<N;++i)
binary_power(n[i]);
return 0;
}
```
### C语言-3
```c
/*------------------------------------------------------------------------------
【程序设计】从键盘接收3个无序的整数将这3个数据都插入到升序排列的数组中并保持数组仍然有序。
输入输出如下:
4 6 9 12 15 18 23 26 32 39
1 5 6
1 4 5 6 6 9 12 15 18 23 26 32 39
------------------------------------------------------------------------
注意部分源程序给出如下。请勿改动主函数main或其它函数中给出的内容否则不得分。
仅在Program-End之间填入若干语句。不要删除标志否则不得分。
------------------------------------------------------------------------------*/
#include<stdio.h>
#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<N;i++){
printf("%d ",a[i]);
}
printf("\n");
/**********Program**********/
for(i=N;i<N+3;i++){
scanf("%d", a+i);
}
for(i=0;i<N+3-1;i++){
for(j=0;j<N+3-1-i;j++){
if(a[j] > a[j+1]){
x = a[j];
a[j] = a[j+1];
a[j+1] = x;
}
}
}
/********** End **********/
for(i=0;i<N+3;i++){
printf("%d ",a[i]);
}
printf("\n");
}
```
### C语言-4
```c
/*------------------------------------------------------------------------------
【程序设计】输入一个小于等于10000的整数n在[100,n]之间打印出各位数字和为5的所有整数的个数.
------------------------------------------------------------------------
注意部分源程序给出如下。请勿改动主函数main或其它函数中给出的内容否则不得分。
仅在Program-End之间填入若干语句。不要删除标志否则不得分。
------------------------------------------------------------------------------*/
#include<stdio.h>
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 <stdio.h>
#include <string.h>
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<stdlib.h>
#include<stdio.h>
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<stdio.h>
#include <stdlib.h>
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 <stdio.h>
#include <string.h>
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 **********/
}
```

297
2207/小游戏.md Normal file
View File

@ -0,0 +1,297 @@
### 贪吃蛇
```c
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#include <time.h>
#include <process.h>
#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<HEIGHT;i++){
for(j=0;j<WIDTH;j++){
buffer[k++] = map[i][j];
}
buffer[k++] = '\n';
}
buffer[k] = '\0';
printf("%s\n", buffer);
Sleep(200);
}
}
//打印地图
void changeMap(void* param){
int i, j, k;
int isFill;
while(gameStatus){
for(i=0;i<HEIGHT;i++){
for(j=0;j<WIDTH;j++){
if(i==0 || i == HEIGHT-1 || j==0 || j == WIDTH - 1){
map[i][j] = '#';
}else if(i == foodY && j == foodX){
map[i][j] = '$';
}else if(i == sankeY[0] && j == sankeX[0]){
map[i][j] = '0';
}else{
isFill = 0;
for(k=1;k<size;k++){
if(i == sankeY[k] && j == sankeX[k]){
map[i][j] = 'o';
isFill = 1;
}
}
if(!isFill){
map[i][j] = ' ';
}
}
}
}
}
}
void changeSnake(void* param){
//蛇的移动
while(gameStatus){
int sankeXpre = sankeX[0], sankeYpre=sankeY[0];
int sankeXpre2, sankeYpre2;
int i;
Sleep(400-size*2);
sankeX[0] += (direction == RGIHT)?1:(direction == LEFT)?-1:0;
sankeY[0] += (direction == DOWN)?1:(direction == UP)?-1:0;
for(i=1;i<size;i++){
sankeXpre2 = sankeX[i];
sankeYpre2 = sankeY[i];
sankeX[i] = sankeXpre;
sankeY[i] = sankeYpre;
sankeXpre = sankeXpre2;
sankeYpre = sankeYpre2;
}
//判断蛇是否吃到食物
if(sankeX[0] == foodX && sankeY[0] == foodY){
size++;
foodX = rand()%(WIDTH-5)+3;
foodY = rand()%(HEIGHT-5)+3;
}
//边界检测、以及是否撞到自己
for(i=1;i<size;i++){
if(sankeX[0] == sankeX[i] && sankeY[0] == sankeY[i]){
gameStatus = 0;
}
}
if(sankeX[0] == 0 || sankeX[0] == WIDTH || sankeY[0]==0 || sankeY[0] == HEIGHT){
gameStatus = 0;
}
}
}
void input(void* param){
char key;
while(gameStatus){
if(_kbhit()){
key = _getch();
switch(key){
case 'w':direction=UP;break;
case 's':direction=DOWN;break;
case 'a':direction=LEFT;break;
case 'd':direction=RGIHT;break;
case 'q':gameStatus=0;break;
}
}
}
}
int main() {
system("color 02");
srand((unsigned)time(NULL));
sankeX[0] = WIDTH/2;
sankeY[0] = HEIGHT/2;
foodX = rand()%(WIDTH-5)+3;
foodY = rand()%(HEIGHT-5)+3;
_beginthread(changeMap, 0, NULL);
_beginthread(draw, 0, NULL);
_beginthread(input, 0, NULL);
_beginthread(changeSnake, 0, NULL);
while(gameStatus){
}
printf("游戏结束您的得分是%d\n", size-1);
return 0;
}
```
<img src="https://yp.smallkun.cn/markdown/image-20250104225941821.png!compress" alt="image-20250104225941821" style="zoom:50%;" />
<img src="https://yp.smallkun.cn/markdown/image-20250104225957306.png!compress" alt="image-20250104225957306" style="zoom:50%;" />
### 飞机大战
```c
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <process.h>
#include <Windows.h>
#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<HEIGHT;i++){
for(j=0;j<WIDTH;j++){
if(i == HEIGHT-1){
map[i][j] = '~';
}else if(j == 0 || j == WIDTH-1){
map[i][j] = '|';
}else{
map[i][j] = ' ';
}
}
}
for(i = 0;i<3;i++){
for(j = 0;j<5;j++){
map[planeY+i][planeX+j] = plane[i][j];
}
}
i=bulletFront;
while(i!=bulletRear){
map[bulletY[i]][bulletX[i]] = '*';
i=(i+1)%bulletNum;
}
Sleep(100);
}
}
void darwMap(void* param){
int i, j, k;
char buffer[100000];
while(gameStatus){
k=0;
for(i=0;i<HEIGHT;i++){
for(j=0;j<WIDTH;j++){
buffer[k++] = map[i][j];
}
buffer[k++] = '\n';
}
buffer[k] = '\0';
system("cls");
printf(buffer);
printf("您的得分:%d\n", score);
printf("操作说明WSAD分别对印前后左右移动\n**空格是发出子弹**\n");
}
}
void changeBullets(void* param){
int i;
while(gameStatus){
Sleep(500);
i=bulletFront;
while(i!=bulletRear){
bulletY[i]--;
if(bulletY[i] < 0){
bulletFront=(bulletFront+1)%bulletNum;
}
i=(i+1)%bulletNum;
}
}
}
void shootBullets(){
// planeY+1
bulletX[bulletRear] = planeX+2;
bulletY[bulletRear++] = planeY-1;
}
void input(void* param){
char key;
while(gameStatus){
if(_kbhit()){
key = _getch();
switch(key){
case 'q':gameStatus = 0;break;
case 'w':planeY--;break;
case 's':planeY++;break;
case 'a':planeX--;break;
case 'd':planeX++;break;
case 32:shootBullets();break;
}
}
}
}
int main(void){
system("color 02");
_beginthread(changeMap, 0, NULL);
_beginthread(darwMap, 0, NULL);
_beginthread(input, 0, NULL);
_beginthread(changeBullets, 0, NULL);
while(gameStatus){
}
return 0;
}
```
<img src="https://yp.smallkun.cn/markdown/image-20250105004011680.png!compress" alt="image-20250105004011680" style="zoom:50%;" />

67
2207/标准库函数.md Normal file
View File

@ -0,0 +1,67 @@
### 标准输入输出
```c
#include <stdio.h>
/*
scanf 格式化输入
printf 格式化输出
getchar 读取单个字符
putchar 输出单个字符
gets 读取一行字符串 空格也会读入
puts 输出字符串(会自带一个换行)
*/
int main(){
char str[100];
/*
scanf("%s", str);//占位符遇到空格结束
*/
gets(str);//读取一行字符串
printf("%s\n", str);
return 0;
}
```
### 字符串处理
```c
#include <stdio.h>
#include <string.h>
/*
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;
}
```

111
2207/汉诺塔.md Normal file
View File

@ -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 <stdio.h>
/*
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 <stdio.h>
/*
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;
}
```

107
2207/约瑟夫环.md Normal file
View File

@ -0,0 +1,107 @@
### 写法1-暴力写法 使用数组来模拟队列
```c
#include <stdio.h>
/*
约瑟夫环人数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 <stdio.h>
/*
使用数组模拟循环队列
*/
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;
}
```

156
2207/线性结构.md Normal file
View File

@ -0,0 +1,156 @@
### 顺序表
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <math.h>
#include <Windows.h>
/*
顺序表 连续存储的动态数组
链表 分散存储的动态数组
栈 后进先出的数组
队列 先进先出的数组
*/
//顺序表
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;i<list->size;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;i<list->size-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;i<list->size-1;i++){
for(j=0;j<list->size-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;
}
```

View File

@ -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修改会员表结构。添加字段「联系地址」数据类型设置为 VARCHAR50更改「联系地址」为「联系方式」删除添加的字段「联系地址」。
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 用户的全部权限。

334
2207/结构体.md Normal file
View File

@ -0,0 +1,334 @@
### 结构体类型定义
```c
/*
struct 结构体名{
数据类型 变量名;
数据类型 变量名;
};
CREATE TABLE 表名(
字段名 数据类型,
字段名 数据类型
);
*/
//声明了一个结构体类型 学生类型
struct student{
int id;//学号
char name[20];//姓名
int age;//年龄
char sex;//性别
double score;//成绩
};
```
### 结构体变量定义
```c
#include <stdio.h>
#include <string.h>
/*
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 <stdio.h>
#include <string.h>
//结构体类型的定义
//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 <stdio.h>
#include <string.h>
/*
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 <stdio.h>
/*
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 <stdio.h>
/*
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 <stdio.h>
/*
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 <stdio.h>
/*
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 <stdio.h>
#include <math.h>
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;
}
```

View File

@ -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 <stdio.h>
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);
}
```

95
2208/MySQL常用语句.md Normal file
View File

@ -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套
*/
```

View File

@ -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;
```

View File

@ -0,0 +1,181 @@
### C语言-1
```c
/*------------------------------------------------------------------------------
1【程序设计】定义一个大小为50的整型数组将数字1~50存入该数组利用指针将数组中的值输出每行5个每个数字占4个符号位左对齐。
------------------------------------------------------------------------------*/
#include <stdio.h>
#include <stdlib.h>
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 <stdio.h>
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<size1*2-1;i++){
for(j=0;j<size1*2-1-i;j++){
if(mergedArray[j] < mergedArray[j+1]){
temp = mergedArray[j];
mergedArray[j] = mergedArray[j+1];
mergedArray[j+1] = temp;
}
}
}
//去重
for(i=1;i<size1*2;i++){
if(mergedArray[(*newLen)- 1] != mergedArray[i]){
mergedArray[(*newLen)++] = mergedArray[i];
}
}
/********** End **********/
return mergedArray;
}
```
### 数据库-1
```sql
#1. 设置字段主键+自动增长
ALTER TABLE t_user MODIFY uid INT(11) PRIMARY KEY AUTO_INCREMENT;
#2. 插入记录
INSERT INTO t_user()
VALUES(DEFAULT, 'mike', 'mm123', '小明', DEFAULT);
#3. 更新记录
UPDATE t_user u
SET u.`password` = '888888'
WHERE u.username = 'Dennis';
#4. tj11 条件查询+多表联查
SELECT u.nickname, c.mid, c.score, c.content
FROM t_user u, t_comment c
WHERE u.uid = c.uid AND u.nickname = '白色';
#5. tj12 分组查询+多表联查
SELECT m.mname, ROUND(AVG(c.score), 2)
FROM t_movie m, t_comment c
WHERE m.mid = c.mid
GROUP BY m.mid;
#6. tj13 分组查询+多表联查
SELECT m.mname, COUNT(*)
FROM t_movie m, t_comment c
WHERE m.mid = c.mid
GROUP BY m.mid;
#7 视图 多表联查
CREATE VIEW v_movie AS
SELECT m.mname, u.nickname, c.score, c.content
FROM t_user u, t_movie m , t_comment c
WHERE u.uid = c.uid AND m.mid = c.mid;
#8 存储过程
DELIMITER $$
DROP PROCEDURE IF EXISTS pro_getUserNumber;
CREATE PROCEDURE pro_getUserNumber(IN in_uid INT, OUT out_number INT)
BEGIN
SET out_number = (
SELECT COUNT(*)
FROM t_user u, t_comment c
WHERE u.uid = c.uid AND u.uid = in_uid
);
END $$
DELIMITER ;
#9 触发器
DELIMITER $$
DROP TRIGGER IF EXISTS tri_userlog;
CREATE TRIGGER tri_userlog
AFTER INSERT ON t_user
FOR EACH ROW
BEGIN
INSERT INTO t_log()
VALUES(DEFAULT, NEW.uid, '新增用户', '2024-01-01');
END $$
DELIMITER ;
```
### 数据库-2
```sql
```

View File

@ -0,0 +1,126 @@
### 数据库-1
```sql
#1 添加字段
ALTER TABLE t_customer ADD integral INT(10) DEFAULT 0;
#2 插入记录
INSERT INTO t_goods()
VALUES(10011, '口香糖', 2.5, 10, '零食');
#3 tj11 排序+分页+子查询查询
#先将第五个的库存数量查询出来 LIMIT 起始位置(从0开始), 取的个数;
SELECT g1.gname, g1.stock
FROM t_goods g1
WHERE g1.stock <= (
SELECT g2.stock
FROM t_goods g2
ORDER BY g2.stock
LIMIT 4, 1
)
ORDER BY g1.stock;
#4 tj12 子查询
SELECT g1.gname, g1.type, g1.price
FROM t_goods g1
WHERE g1.price = (
SELECT MIN(g2.price)
FROM t_goods g2
WHERE g2.type = g1.type
);
#5 tj13 分组查询
SELECT o.ono, g.gname, o.num * g.price, o.otime
FROM t_order o, t_goods g
WHERE o.gno = g.gno;
#6 tj14 排序查询+连接查询
SELECT c.cno, c.cname, o.ono, o.gno, o.num, o.otime
FROM t_customer c, t_order o
WHERE c.cno = o.cno AND c.cname = '龙睿'
ORDER BY o.otime DESC;
#7 排序查询+分组查询+连接查询
CREATE VIEW v_order AS
SELECT o.ono, c.cname, g.gname, o.num, o.otime
FROM t_customer c, t_order o, t_goods g
WHERE c.cno = o.cno AND o.gno = g.gno
ORDER BY o.otime DESC
LIMIT 49, 31;
#8 触发器
DELIMITER $$
DROP TRIGGER IF EXISTS tri_customerlog;
CREATE TRIGGER tri_customerlog
AFTER UPDATE ON t_customer
FOR EACH ROW
BEGIN
INSERT INTO t_log()
VALUES(DEFAULT, NEW.cno, '更新客户信息', '2024-06-06');
END $$
DELIMITER ;
#9 存储过程
DELIMITER $$
DROP PROCEDURE IF EXISTS pro_getSaleNumber;
CREATE PROCEDURE pro_getSaleNumber(IN in_gno CHAR(10), OUT out_number INT)
BEGIN
SELECT COUNT(DISTINCT cno) INTO out_number
FROM t_order
WHERE gno = in_gno;
END $$
DELIMITER ;
#测试
CALL pro_getSaleNumber(10001, @result);
SELECT @result;
```
### 数据库-2
```sql
#1 插入记录
INSERT INTO t_student()
VALUES(DEFAULT, '赵十', '男', 17, '10006');
#2 添加字段
ALTER TABLE t_student ADD notes VARCHAR(255);
#3 创建表
CREATE TABLE t_teacher(
tid CHAR(10) PRIMARY KEY,
tname VARCHAR(20) NOT NULL,
sex CHAR(2),
age INT(2),
subject VARCHAR(20),
salary DECIMAL(10, 2)
);
#4 设置薪资默认值
#ALTER TABLE 表名 ALTER 字段名 SET DEFAULT 默认值;
ALTER TABLE t_teacher ALTER salary SET DEFAULT 5000;
#5 插入记录
INSERT INTO t_teacher()
VALUES('t0001', '王老师', '男', 42, '数学', 6000);
#6 数据更新
UPDATE t_class c
SET c.address = '四层'
WHERE c.cname = '高三2班';
#7 tj11 条件查询
SELECT *
FROM t_student s
WHERE s.sex = '男';
#8 视图
CREATE VIEW v_class AS
SELECT c.cname, COUNT(IF(s.sex = '男', TRUE, NULL)), COUNT(IF(s.sex = '女', TRUE, NULL))
FROM t_student s, t_class c
WHERE s.cid = c.cid
GROUP BY c.cid;
```

View File

@ -0,0 +1,351 @@
创建一个空数据库名字为`book_store_db`,字符集使用UTF8
## 创建表
目的:
1熟练掌握创建表结构的方法。
2掌握查看表信息的方法。
内容:
1使用 MySQL 创建会员表(如表 3-9 所示)、图书表(如表 3-10 所示)的表结构。
```sql
#(1)会员表
CREATE TABLE `user`(
uid CHAR(4) PRIMARY KEY COMMENT '会员编号',
uname VARCHAR(20) COMMENT '会员昵称',
email VARCHAR(20) COMMENT '电子邮箱',
tnum VARCHAR(15) COMMENT '联系电话',
score INT COMMENT '积分'
);
#(1)图书表 (先创建图书类别表再创建图书表)
DROP TABLE book;
CREATE TABLE book(
bid INT PRIMARY KEY AUTO_INCREMENT COMMENT '图书编号',
bname VARCHAR(50) NOT NULL COMMENT '图书名称',
author CHAR(8) COMMENT '作者',
price FLOAT COMMENT '价格',
publisher VARCHAR(50) COMMENT '出版社',
discount FLOAT COMMENT '折扣',
cid INT COMMENT '图书类别'
);
```
2使用 MySQL 创建图书类别表(如表 3-11 所示)、订购表(如表 3-12 所示)的表结构。
```sql
#(2)图书类别表
CREATE TABLE category(
cid INT PRIMARY KEY AUTO_INCREMENT COMMENT '类别编号',
cname VARCHAR(16) COMMENT '类别名称'
);
#(2)订购表
CREATE TABLE b_order(
bid INT NOT NULL COMMENT '图书编号',
uid CHAR(4) NOT NULL COMMENT '会员编号',
ordernum INT DEFAULT 1 COMMENT '订购量',
oderdate DATETIME COMMENT '订购日期',
deliverydate DATETIME COMMENT '发货日期'
);
```
3使用 DROP TABLE 语句删除上述创建的表,然后使用 CREATE TABLE 语句再次创建上述表。
```sql
#(3)删除上述所有的表
DROP TABLE `user`;
DROP TABLE book;
DROP TABLE category;
DROP TABLE b_order;
```
4查看会员表的信息。
```sql
#(4)查看会员表的信息
DESC `user`;
```
5修改会员表结构。添加字段「联系地址」数据类型设置为 VARCHAR50更改「联系地址」为「联系方式」删除添加的字段「联系地址」。
```sql
#(5)修改会员表结构
#添加联系地址字段
ALTER TABLE `user` ADD taddress VARCHAR(50);
#修改联系地址字段名为联系方式
ALTER TABLE `user` CHANGE taddress tmanner VARCHAR(50);
#删除联系方式字段
ALTER TABLE `user` DROP tmanner;
```
6使用创建表时添加约束和为已存在的表添加约束这两种方式给表添加约束。
```sql
#(6)添加外键
#1.创建表时添加外键
CREATE TABLE book(
bid INT PRIMARY KEY AUTO_INCREMENT COMMENT '图书编号',
bname VARCHAR(50) NOT NULL COMMENT '图书名称',
author CHAR(8) COMMENT '作者',
price FLOAT COMMENT '价格',
publisher VARCHAR(50) COMMENT '出版社',
discount FLOAT COMMENT '折扣',
cid INT COMMENT '图书类别',
CONSTRAINT fk_cid FOREIGN KEY(cid) REFERENCES category(cid)
);
#2.表创建之后添加外键
DROP TABLE IF EXISTS book;
CREATE TABLE book(
bid INT PRIMARY KEY AUTO_INCREMENT COMMENT '图书编号',
bname VARCHAR(50) NOT NULL COMMENT '图书名称',
author CHAR(8) COMMENT '作者',
price FLOAT COMMENT '价格',
publisher VARCHAR(50) COMMENT '出版社',
discount FLOAT COMMENT '折扣',
cid INT COMMENT '图书类别'
);
ALTER TABLE `book` ADD CONSTRAINT fk_cid FOREIGN KEY(cid) REFERENCES category(cid);
```
表 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插入记录。
```sql
#(2)插入记录
INSERT INTO `user`()
VALUES
('1001', '何仙姑', 'Hxg18@163.com', 13320101991, 20),
('1002', '平平人生', 'Lp011@126.com', 13545158219, 300),
('1003', '四十不惑', '12345@qq.com', 18688168818, 10000),
('1004', '桃花岛主', '810124@qq.com', 13068011234, 600),
('1005', '水灵', 'zs123@371.com', 15838182503, 150),
('1006', '感动心灵', 'gandong@tome.com', 13641151234, 500);
INSERT INTO book()
VALUES
(1, '中国时代', '师永刚', 39.0, '作家出版社', 27.8, 1),
(2, '中国历史的屈辱', '王重旭', 26.0, '华夏出版社', 18.2, 2),
(3, '择业要趁早', '海文', 28.0, '海天出版社', 19.3, 3),
(4, '房间', '爱玛', 37.6, '人民文学出版社', 26.3, 4),
(5, '平凡的世界', '路遥', 75, '北京出版社', 63.75, 4),
(6, '心灵鸡汤', '关然', 27.0, '大豫出版社', 20.0, 3),
(7, '蜕', '赵婷', 32.0, '上海出版社', 28.5, 3);
INSERT INTO category()
VALUES
(1, '历史'),
(2, '家教'),
(3, '文化'),
(4, '小说');
INSERT INTO b_order()
VALUES
(1001, 1, 2, '2016-03-12', DEFAULT),
(1001, 3, 1, '2016-04-15', DEFAULT),
(1001, 1, 1, '2016-09-15', DEFAULT),
(1003, 7, 1, '2015-12-14', DEFAULT),
(1003, 3, 1, '2016-10-10', DEFAULT),
(1005, 5, 1, '2015-08-17', DEFAULT),
(1005, 7, 3, '2016-11-12', DEFAULT),
(1006, 5, 1, '2016-09-18', DEFAULT),
(1006, 1, 2, '2016-10-21', DEFAULT),
(1006, 7, 2, '2015-11-21', DEFAULT);
```
3使用 SQL 语句修改表中记录。
① 把 user 表中 uid 字段值为 1001 的记录的 uname 字段值修改为「何大姑」。
```sql
```
② 把 b_order 表中 uid 字段值为 1003 且 bid 字段值为 3 的记录的 ordernum 字段值改为「10」并把该记录的 orderdate 字段值改为「2016-10-01」deliverydate 字段值设为「2016-10-03」。
```sql
```
4使用 SQL 语句删除表中记录。
① 删除 2015 年的订单信息。
```sql
```
② 清空 book 表。
```sql
```
## 简单查询
目的:掌握 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 用户的全部权限。

View File

@ -0,0 +1,68 @@
```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_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
```

View File

23
2301/教学大纲.md Normal file
View File

@ -0,0 +1,23 @@
## 基本数据类型
## 运算符和表达式
## 基本输入输入函数
## 顺序结构
## 选择结构
## 循环结构
## 数组
## 函数
## 指针
## 结构体
## 预处理
## 文件

8
2301/源码/Hello.c Normal file
View File

@ -0,0 +1,8 @@
#include <stdio.h>
int main(void){
printf("Hello 2301!\n");
return 0;
}

View File

23
2302/教学大纲.md Normal file
View File

@ -0,0 +1,23 @@
## 基本数据类型
## 运算符和表达式
## 基本输入输入函数
## 顺序结构
## 选择结构
## 循环结构
## 数组
## 函数
## 指针
## 结构体
## 预处理
## 文件

8
2302/源码/Hello.c Normal file
View File

@ -0,0 +1,8 @@
#include <stdio.h>
int main(void){
printf("Hello 2302!\n");
return 0;
}

View File

23
2303/教学大纲.md Normal file
View File

@ -0,0 +1,23 @@
## 基本数据类型
## 运算符和表达式
## 基本输入输入函数
## 顺序结构
## 选择结构
## 循环结构
## 数组
## 函数
## 指针
## 结构体
## 预处理
## 文件

8
2303/源码/Hello.c Normal file
View File

@ -0,0 +1,8 @@
#include <stdio.h>
int main(void){
printf("Hello 2303!\n");
return 0;
}

4
push.bat Normal file
View File

@ -0,0 +1,4 @@
git pull
git add .
git commit -m "Auto commit"
git push origin main

83
其他/markdown语法.md Normal file
View File

@ -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 的一些常用语法,它们可以帮助您更方便地编写格式化的文本。

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 270 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 311 KiB

View File

@ -0,0 +1,242 @@
1输入一小写字母分别以字符形式与数值形式输出与该小写字母相应的大写字母
2输入一个华氏温度要求输出摄氏温度。公式为c=5/9*(f-32)
3写一个程序输入实数X,输出Y,计算
<img src="https://yp.smallkun.cn/markdown/image-20250116004443767.png!compress" alt="image-20250116004443767" style="zoom:33%;" />
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五个变量的值分别为China经过运算使c1、c2、 c3、c4、c5分别为Glmre并输出
7编写程序用getchar函数读入两个字符c1,c2然后分别用putchar函数和prinf函数输出这两个字符以 及它们的ASCII值。
8设圆半径r=1.5圆柱高h=3,求圆周长,圆面积,圆球表面积,圆球体积,圆柱体积
9编写程序输入两个整数 ,计算并输出它们的和、差、积、除(精确除)、整除及模的结果。
10编一程序对于一个给定的一个百分制成绩输出相应的五分制成绩。设90分以上为ˊAˊ8089 分为ˊBˊ7079分为ˊCˊ6069分为ˊ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且在[09]范围内,若加密后某位数字 大于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=123.编程找出1000以内的所 有完数。
36猴子吃桃问题猴子第一天摘下若干个桃子当即吃了一半还不瘾又多吃了一个第二天早上又将剩 下的桃子吃掉一半又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再 吃时,见只剩下一个桃子了。求第一天共摘了多少.
37有一分数序列2/13/25/38/513/821/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编写一程序求135799101的值。
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个西瓜第一天卖一半多两个以后每天卖剩下的一半多两个问几天以后能卖完
544位反序数设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子串删除。函数deletesin实现从字符串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(xy)以实现两个整数之间的交换并利用它将一维数组a和b的所有元素的值进行交换。
109输入两个整数,求它们相除的余数.用带参数的宏来实现,编程序.
110定义两个带参数的宏一个用来求S(s=1/2(a+b+c))另个用来求areaarea为三角形的面积。写程序在程序中用带实参的宏名来求面积area。
111已知字符串S中的内容为“Student请用指针的方法将S中的内容逆序输出且不能改变串中的内容。
112输入一行文字找出其中大写字母、小写字母、空格、数字以及其他字符个数。要求用指针实现
113通过指针操作将输入的3个字符串按由大到小的顺序输出。
114定义整型数组a,有10个元素,用指针实现数组中的全部元素的输出.
115编一程序将字符串computer赋给一个字符数组然后从第一个字母开始间隔地输出该串。请用指针完成。
116利用指针编写一程序将字符串中的第m个字符开始的全部字符复制成另一个字符串。要求在主函数中输入字符串及m的值并输出复制结果在被调函数中完成复制。
117用指针法实现输入10个数按由小到大的顺序输出。
118用指针法实现写一个函数求一个字符串的长度。在main函数中输入字符串并输出其长度值。
119从键盘输入10个学生的成绩显示其中的最高分、最低分和平均分。用指针实现。
120数组中存放N个元素编写程序删除掉下标为奇数的元素使得数组中只存放下标为偶数的元素。用指针实现。

View File

@ -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,8089 分为B,7079 分为C,6069 分为D,60 分以下为E
6 有一函数请编程序计算y 的值(x 的值由键盘输入)。
<img src="https://yp.smallkun.cn/markdown/image-20241130003549906.png!compress" alt="image-20241130003549906" style="zoom:50%;" />
## 三、循环结构
1 计算n 的阶乘
2 求 1 到 100 之间的奇数之和、偶数之积。
3 输入一行字符,统计其中的英文字母、数字、空格和其他字符个数。
4 用循环语句编写求下列表达式值的程序。
<img src="https://yp.smallkun.cn/markdown/image-20241130003536421.png!compress" alt="image-20241130003536421" style="zoom:50%;" />
5.求1!+2!+3!+...+20!
6.求下列分数序列的前20项之和。
<img src="https://yp.smallkun.cn/markdown/image-20241130003647576.png!compress" alt="image-20241130003647576" style="zoom:50%;" />
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求其最大公约数和最小公倍数
提示:
求 mn的最大公约数:首先将 m除以 nm>n得余数 R再用余数 R 去除原来的除数,得新的余数,重复此过程直到余数为 0 时停止此时的除数就是m 和 n的最大公约数。
求 m和 n的最小公倍数: m和 n的积除以 m和 n 的最大公约数。
测试数据: m12 n24
m100 n300
12 打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数, 其各位数字立方
和等于该数本身。例如 153 是一个水仙花数,因为 1531\*1\*1+5\*5\*5+3\*3\*3要求分别用一重循环和三重循环实现
13 一个数恰好等于它的平方数的右端,这个数称为同构数。如 5 的平方是25 5 是25 中的右端的数, 5 就是同构数。找出11000 之间的全部同构数。
14 3025 这个数具有一种独特的性质将它平分为两段即30 和25使之相加后求平方30+25恰好等于3025 本身。请求出具有这样性质的全部四位数。
15 两位数13 和62 具有很有趣的性质把它们个位数字和十位数字对调其乘积不变即13*6231*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)
测试数据:① x0.3 n8
② x0.5 n20
21 验证歌德巴赫猜想。一个充分大的偶数大于或等于6可以分解为两个素数之和。试编程序将 6 至50 之间全部偶数表示为两个素数之和。
22 用牛顿迭代法求方程在 1.5 附近的根(精度为<img src="https://yp.smallkun.cn/markdown/image-20241130004125210.png!compress" alt="image-20241130004125210" style="zoom: 40%;" />)。
![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 个人围成一圈编号为016从第 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 个自然数 1100我们取 1 2 3 4 时, 我们可将其排成一圈使每两个数之和都是素数即→1→2→3→4→问 1100 内连续取 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 的拉丁方阵的每行、每列均为自然数的一个全排列, 每行(列)上均无重复数。
如 n5 时, 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在各行中的列标号。
测试数据:① n5 ② n8
## 五、函数
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 <stdio.h>
//定义一个函数 传入两个整型指针 交换 两个指针所指向的值
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 <stdio.h>
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<n;i++){
scanf("%d", arr+i);
}
}
//处理数组元素 最大值和最后一个元素交换,最小值和最前一个元素交换
void process(int *arr, int n){
int *max, *min;//max 最大值的地址 min最小值的地址
int i;
max = min = arr;
//通过遍历数组的所有元素 求出最大值和最小值的地址
for(i = 1;i < n;i++){
if(*(arr+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<n;i++){
printf("%d ", *(arr+i));
}
printf("\n");
}
int main(void){
int num[10];
input(num, 10);
process(num, 10);
output(num, 10);
return 0;
}
```
3、 有n 个整数使前面各数顺序向后移m 个位置最后m 个数变成最前面m 个数写一函数实现以上功能在主函数中输入n 个整数和输出调整后的n 个数。
```c
#include <stdio.h>
#include <stdlib.h>
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<n;i++){
printf("%d ", *(arr+i));
}
printf("\n");
}
int main(void){
int n, i, m;
int *num;
printf("请输入您需要输入的元素个数:");
scanf("%d", &n);
/*
1 2 3 4 5 n=5 m = 2
4 5 1 2 3
*/
num = (int *)malloc(sizeof(int)*n);//动态内存分配数组容量
printf("请输入%d个数字:", n);
for(i=0;i<n;i++){
scanf("%d", num+i);//遍历输入数组每一个元素
}
printf("移动前:");
output(num, n);
printf("请输入您需要移动的个数:");
scanf("%d", &m);
for(i = 0;i < m;i++){
move(num, n);
}
printf("移动后:");
output(num, n);
return 0;
}
```
4、 写一函数求一个字符串的长度。在main 函数中输入字符串,并输出其长度。
```c
#include <stdio.h>
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 <stdio.h>
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 <stdio.h>
#include <string.h>
/*
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 <stdio.h>
#include <stdlib.h>
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 <stdio.h>
#include <string.h>
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 <stdio.h>
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 <stdio.h>
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顺序号定为019。输入某一顺序号之后读出相应的数据并显示在屏幕上。
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开始打印然后一左一右依次打印出其它字母即MLNKO。要求初始化时按字母表顺序赋值。
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
<img src="https://yp.smallkun.cn/markdown/image-20241130010005134.png!compress" alt="image-20241130010005134" style="zoom:50%;" />
请编程序找出那些看不清的数字。
10.编程序计算下述函数在X-7-107 时的值。
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 是你的学号)
当 i<j a\[i\]\[j\]=ij
当 i>j 时 a\[i\]\[j\]=i×j
编程序求所有的数组元素之和。
19.找3 个数字,填在下面式子中,使等式成立。
<img src="https://yp.smallkun.cn/markdown/image-20241130010139383.png!compress!compress" alt="image-20241130010139383" style="zoom:50%;" />
① 若答案有多个,则打印一组即可;
② 若无满足条件的数字,则显示'NO DIGITALS'。
20.某航空公司规定在旅游旺季7─9 月份若订票超过20 张优惠票价的1520 张以下优惠5在旅游淡季1─5 月、10 月、11 月份订票超过20 张优惠3020 张以下优惠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+12=8120+252=2025。求10 至9999 之间满足这样条件的数是哪些? 共有多少个?
26.已知有9 个数,请求出这些数中的最大值、最小值及平均值,以及有多少个数等于平均值?
27.求二维数组中每行元素的平均值,不许引入其它的数组。
28.编程序计算函数
<img src="https://yp.smallkun.cn/markdown/image-20241130010348202.png!compress" alt="image-20241130010348202" style="zoom:50%;" />
的值。要求先将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 三元素是偶数时应按下图交换。
<img src="https://yp.smallkun.cn/markdown/image-20241130010458976.png!compress" alt="image-20241130010458976" style="zoom:50%;" />
32.编程序将一个6×6 的二维数组左下三角部分全赋值为-1右上三角全赋值为1主对角线列下标相同上的元素送入2。把数组中的值按列对齐方式输出。
要求: 不允许使用scanf 函数。
33.用随机函数求出10 组三位正整数,每组十个数,调用一函数打印出每组数,并编一函数求出每组中的最大数。
34.已知有三个数组A,B,CA 为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 的素数,验证<img src="https://yp.smallkun.cn/markdown/image-20241130010624492.png!compress" alt="image-20241130010624492" style="zoom:67%;" /> 可被120 整除。编程序输入a 的值判a-1 和a+1 是否为素数。若不是输出“NOTPRIME!”;若都是素数,再验证<img src="https://yp.smallkun.cn/markdown/image-20241130010624492.png!compress!compress" alt="image-20241130010624492" style="zoom:67%;" />是否可被120 整除。
36.有n 个整数编程序将前面的各个数依次向后移动k 个位置最后k 个数移到最前边的k 个位置见下图其中n=8k=3
<img src="https://yp.smallkun.cn/markdown/image-20241130010716416.png!compress!compress" alt="image-20241130010716416" style="zoom:50%;" />
思考: 程序中不许引入其它数组。
37.将一个数M 分解为质因数M≠0
38.将一个整数最多是10 位数从低位到高位打印出来如该数是12345 时输出应是54321只占一行
39.写一个函数比较两个字符串,如果s1=s2则返回值0如果s1>s2则返回值1如果s1<s2 则返回-1
40.求n!的末尾有多少个零。可以通过检查n!含有多少个10 的因数来求它末尾零的个数。因为10=2×5在n!中含有2 的因数显然多于含有5 的因数。一种求n!中5 的因数的个数的算法如下:
1)输入正整数n;
2)0=>k, n=>m;
3)若m<5转第5 否则执行第4 ;
4)m/5取整=>m, k+m=>k, 转第3 步;
5)输出kn!末尾零的个数)。
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 时, 其方阵为:
<img src="https://yp.smallkun.cn/markdown/image-20241130011036567.png!compress" alt="image-20241130011036567" style="zoom:50%;" />
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)
如果<img src="https://yp.smallkun.cn/markdown/image-20241130011207358.png!compress" alt="image-20241130011207358" style="zoom:50%;" />>di (i=k-1,k-2,...,1)则称N 是严格降序数;如果<img src="https://yp.smallkun.cn/markdown/image-20241130011207358.png!compress!compress" alt="image-20241130011207358" style="zoom:50%;" /><di (i=k-1,k-2,...,1)则称N 是严格升序数如果<img src="https://yp.smallkun.cn/markdown/image-20241130011232509.png!compress" alt="image-20241130011232509" style="zoom:50%;" />=di (i=k-1,k-2,...,1)则称N 是等序数此外则称N是无序数。例如 4321 是严格降序数1234 是严格升序数2222 是等序数1243 是无序数。从键盘上输入一个大于9 的整数N判它属于上述哪一类。
49.用简单迭代法解方程 <img src="https://yp.smallkun.cn/markdown/image-20241130011311960.png!compress" alt="image-20241130011311960" style="zoom:50%;" />它有两个根(如图),其迭代公式为:
![image-20241130011327616](https://yp.smallkun.cn/markdown/image-20241130011327616.png!compress!compress)
注:本程序中选取初值<img src="https://yp.smallkun.cn/markdown/image-20241130011341115.png!compress" alt="image-20241130011341115" style="zoom:50%;" /> 不同时要分别使用公式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”。
<img src="https://yp.smallkun.cn/markdown/image-20241130011603125.png!compress" alt="image-20241130011603125" style="zoom:50%;" />
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 表示10B 表示11,…F 表示15。
58.在主函数中输入10 个不等长的字符串用另一函数对它们排序。然后在主函数中输出这10 个已排好序的字符串,用指针数组完成。
59.建立一个链表,每个结点包括:学号、姓名、性别、年龄。输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,将此结点删除,输出最后的链表。
60.有两个链表a和b。设结点中包含学号、姓名。从a链表中删除与b链表中有相同学号的那些结点。

View File

@ -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 下面创建函数来实现该查询功能。

View File

@ -0,0 +1,114 @@
### **一、标准输入输出函数**`<stdio.h>`
| 函数 | 功能 | 示例 |
| --------- | -------------------- | ------------------------------------ |
| `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);` |
------
### **二、字符串处理函数**`<string.h>`
| 函数 | 功能 | 示例 |
| --------- | ------------------------ | --------------------------------- |
| `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, ",");` |
------
### **三、数学函数**`<math.h>`
| 函数 | 功能 | 示例 |
| ------- | ---------------- | --------------------------------------- |
| `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` |
------
### **四、内存操作函数**`<string.h>`
| 函数 | 功能 | 示例 |
| --------- | ------------ | ------------------------------------ |
| `memset` | 设置内存的值 | `memset(buffer, 0, sizeof(buffer));` |
| `memcpy` | 内存拷贝 | `memcpy(dest, src, n);` |
| `memcmp` | 比较内存区域 | `memcmp(ptr1, ptr2, n);` |
| `memmove` | 内存区域移动 | `memmove(dest, src, n);` |
------
### **五、动态内存管理函数**`<stdlib.h>`
| 函数 | 功能 | 示例 |
| --------- | -------------------- | ------------------------------------------- |
| `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.h>`
| 函数 | 功能 | 示例 |
| ----------- | ------------------ | ---------------------------------------- |
| `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);` |
------
### **七、随机数函数**`<stdlib.h>`
| 函数 | 功能 | 示例 |
| ------- | -------------- | ------------------------------ |
| `rand` | 生成随机数 | `int r = rand();` |
| `srand` | 设置随机数种子 | `srand((unsigned)time(NULL));` |
------
### **八、进程控制函数**`<stdlib.h>`
| 函数 | 功能 | 示例 |
| -------- | ------------ | ---------------- |
| `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);` |

Binary file not shown.

After

Width:  |  Height:  |  Size: 252 KiB

View File

@ -0,0 +1,115 @@
### 1.创建项目
<img src="https://yp.smallkun.cn/markdown/image-20241222165137489.png!compress" alt="image-20241222165137489" style="zoom:50%;" />
创建项目时选择空项目
### 2.配置输出控制台
<img src="https://yp.smallkun.cn/markdown/image-20241222165231278.png!compress" alt="image-20241222165231278" style="zoom:50%;" />
右键项目名称选择`属性`
配置属性->链接器->系统->子系统设置为`控制台 (/SUBSYSTEM:CONSOLE)`
<img src="https://yp.smallkun.cn/markdown/image-20241222165309647.png!compress" alt="image-20241222165309647" style="zoom:50%;" />
### 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&amp;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++目录 将上述路径加入到`包含目录`
<img src="https://yp.smallkun.cn/markdown/image-20241222170322231.png!compress" alt="image-20241222170322231" style="zoom:50%;" />
点击最右侧下拉框后点击编辑
![image-20241222170447324](https://yp.smallkun.cn/markdown/image-20241222170447324.png!compress)
**配置lib文件路径**
C:\Program Files (x86)\MySQL\MySQL Connector C 6.1\lib
右键项目名称点击属性 找到 配置属性->链接器->常规 将上述路径加入到`附加库目录`
<img src="https://yp.smallkun.cn/markdown/image-20241222170720851.png!compress" alt="image-20241222170720851" style="zoom:50%;" />
**配置附加依赖性**
配置属性——>链接器——>输入——>附加依赖项
<img src="https://yp.smallkun.cn/markdown/image-20241222170820644.png!compress" alt="image-20241222170820644" style="zoom:50%;" />
在其中加入`libmysql.lib`
<img src="https://yp.smallkun.cn/markdown/image-20241222171057161.png!compress" alt="image-20241222171057161" style="zoom:50%;" />
### 5.编写数据库连接代码
```c
#include <stdio.h>
#include <stdlib.h>
#include <mysql.h>
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
运行代码后会发现
<img src="https://yp.smallkun.cn/markdown/image-20240518190612777.png!compress!compress" alt="image-20240518190612777" style="zoom:50%;" />
要永久地关闭 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)

View File

@ -0,0 +1,40 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#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;
}

View File

@ -0,0 +1,108 @@
#ifndef MYSQL_H
#include <mysql.h>
#endif
#ifndef STDIO_H
#include <stdio.h>
#endif
#ifndef STDLIB_H
#include <stdlib.h>
#endif
#ifndef STRING_H
#include <string.h>
#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");
}
}

View File

@ -0,0 +1,3 @@
## 解决vs2010程序运行结束后关闭
右键项目名称->属性->链接器->系统->子系统->设置成控制台

View File

@ -0,0 +1,106 @@
1. **函数指针示例**:
```c
#include <stdio.h>
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 <stdio.h>
#include <stdlib.h>
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 <stdio.h>
// 回调函数的类型定义
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;
}
```

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -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 一对多 1N
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 多对多NM
主表中的一条记录对应从表中的多条记录,从表中的一条记录对应主表中的多条记录
班级和讲师的关系
![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-REntityRelationship实体关系图
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
ATom BToom CTam DTm ETmo
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 B2100诺基亚 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语句中的数据类型可以不一致。

File diff suppressed because it is too large Load Diff

1054
课件/MySQL/MySQL基础.md Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@ -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);