当前位置: 首页 > news >正文

C语言简单练习题

文章目录

  • 练习题
    • 一、计算n的阶乘
      • bool类型
    • 二、计算1!+2!+3!+...+10!
    • 三、计算数组arr中的元素个数
      • 二分法查找
    • 四、动态打印字符
      • Sleep()ms延时函数
      • system("cls")清屏函数
    • 五、模拟用户登录
      • strcmp()函数
    • 六、猜数字小游戏
      • 产生一个随机数
        • rand
        • srand
        • RAND_MAX
        • 时间戳time()
      • 示例
    • 七、关机程序
    • 八、修改字符串
      • memset()的使用
    • 九、使用函数实现质数的判断
      • sqrt()的使用
    • 十、利用函数打印1000 - 2000年之间的闰年
    • 十一、函数实现整形有序数组的二分查找
    • 十二、将三个整数按从大到小输出
    • 十三、求两个数的最大公约数
      • 辗转相除法
    • 十四、求1-100的整数之间出现了多少个数字9
    • 十五、打印99乘法表
    • 十六、递归实现字符串逆序
    • 十七、模拟实现strlen()
    • 十八、三子棋
    • 十九、扫雷
    • 二十、求一个整数存储在内存中二进制1的个数
    • 二十一、青蛙跳台阶问题(斐波那契数列)
    • 二十二、序列中删除指定数字
    • 二十三、模拟实现strcpy
      • assert(断言)的使用
      • const的使用
    • 二十四、菱形打印

练习题

一、计算n的阶乘

//计算n的阶乘
#include<stdio.h>
int main()
{while (1){printf("阶乘:");int i = 0;int n = 0;scanf("%d", &n);int T = 1;i = n;if (i >= 0){for (i = n; i > 0; i--){T = T * i;}printf("%d!=%d\n", n, T);}elseprintf("输入错误\n");}return 0;
}
  • 输出:

  •   阶乘:55!=120阶乘:66!=720
    
//导入 stdbool.h 来使用布尔类型
#include <stdbool.h>
#include <stdio.h>//计算n!,n的值在main中定义
int main(void)
{int n = 0;scanf("%d", &n);int sum = 1; //用来存放阶乘的结果bool flag = false;    //阶乘标记int num = n;    //循环次数while (!flag){sum = sum * (num--);//当num=1时结束循环if (num == 1){flag = true;}}printf("%d的阶乘值为 %d \n", n, sum);return 0;
}
  • 输出:

    5
    5的阶乘值为 120
    

    bool类型

    • C 语言标准(C99)解决了布尔类型的问题

    • C99 提供了 Bool 型

    • Bool 依然仍是整数类型,但与一般整型不同的是,Bool 变量只能赋值为 0 或 1,非 0 的值都会被存储为 1

    • C99还提供了一个头文件 <stdbool.h> 定义了 bool 代表 _Bool,true 代表 1false 代表 0

二、计算1!+2!+3!+…+10!

//计算1!+2!+3!+...+10!
#include<stdio.h>
int main()
{int i = 1;int n = 0;int Temp = 1;int sum = 0;for (i = 1; i <= 10; i++){for (n = i; n > 0; n--){Temp = Temp * n;}sum = sum + Temp;Temp = 1;}printf("%d", sum);return 0;
}
  • 输出:

  •   4037913
    
//计算1!+2!+3!+...+10!(函数调用)
#include<stdio.h>
int main()
{int i = 1;int sum = 0;for (i = 1; i <= 10; i++){sum = sum + Get(i);}printf("%d\n", sum);return 0;
}int Get(int n)//返回n的阶乘
{int a = 0;for (a=1; n > 0; n--){a = a * n;}return a;
}
  • 输出:

  •   4037913
    

三、计算数组arr中的元素个数

//计算数组arr中的元素个数
#include<stdio.h>
int main()
{int arr[] = { 1,2,3,4,5,6 };int sz = sizeof(arr) / sizeof(arr[0]);printf("%d\n", sz);return 0;
}
  • 输出:

  •   6
    

二分法查找

//二分法查找
#include<stdio.h>
int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 };int a = 0;int sz = sizeof(arr) / sizeof(arr[0]);int left = 0;//最左侧元素下标int right = sz - 1;//最右侧元素下标while (1){int left = 0;//最左侧元素下标int right = sz - 1;//最右侧元素下标scanf("%d", &a);while(left <= right){ int mid = left + (right - left) / 2;//中间元素下标(防止运算数值过大导致越界)if (a > arr[mid])left = mid + 1;else if (a < arr[mid]){right = mid - 1;}else if (a == arr[mid]){printf("%d的下标是:%d\n", a, mid);break;}}if (left > right)printf("数组里没有这个数!\n");}return 0;
}
  • 输出:

  •   1212的下标是:1133的下标是:2
    

四、动态打印字符

//动态打印字符
#include<stdio.h>
#include<Windows.h>
#include<stdlib.h>
int main()
{char arr1[] = "Hello World!!!";char arr2[] = "##############";int Left = 0;int Right = strlen(arr1)-1;// sizeof(arr1) / sizeof(arr1[0]) - 1;while (Left <= Right){arr2[Left] = arr1[Left];arr2[Right] = arr1[Right];printf("%s\n", arr2);Sleep(1000);//包含于<Windows.h>中,延时函数ms//清屏system("cls");//system是一个库函数,可执行系统文件;包含于<stdlib.h>中Left++;Right--;}printf("%s\n", arr2);return 0;
}

Sleep()ms延时函数

  • 包含于<Windows.h>头文件中

system(“cls”)清屏函数

  • 包含于<stdlib.h>头文件中
  • system是一个库函数,可执行系统文件

五、模拟用户登录

//编写代码实现,模拟用户登录,并且只能登录三次
//(只允许登录三次密码,如果密码正确,则提示登录成功,如果三次均输入错误,则退出程序)
#include<stdio.h>
#include<string.h>
int main()
{int i = 0;int pass[20] = { 0 };for (i = 0; i < 3; i++){printf("请输入密码:");scanf("%s", pass);if (strcmp(pass, "abc123") == 0){printf("登录成功!\n");break;}elseprintf("密码错误!\n");}if (i == 3){printf("三次输入错误,退出程序");}return 0;
}
  • 输出:

  •   请输入密码:132密码错误!请输入密码:asc密码错误!请输入密码:abc123登录成功!
    

strcmp()函数

  • 包含于<string.h>头文件中

  • 用于判断两个字符串(字符数组) 是否相等

  • 使用方法

    • strcmp(字符串1,字符串2) == 0,则字符串1字符串2相等,反之则不相等

六、猜数字小游戏

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include<Windows.h>
//猜数字小游戏
void star()
{printf("**************************\n");printf("********  1.Play  ********\n");printf("********  2.Exit  ********\n");printf("**************************\n");
}
void game()
{system("cls");//清屏//猜数字游戏int guess = 0;//1、生成一个1-100的随机数(利用时间戳)int number = rand()%100+1;//如此guess的范围就被限制在了<1-100>之间//2、猜数字while (1){printf("你猜的数是:");scanf("%d", &guess);if (guess > number){printf("猜大了!\n");}else if (guess < number){printf("猜小了!\n");}else{printf("恭喜你,猜对了!\n");break;}}
}
int main()
{srand((unsigned int)time(NULL));int mode = 0;do{star();printf("输入游戏模式<1/2>:");scanf("%d", &mode);switch (mode){case 1:game();case 2:{printf("退出游戏\n");break;}default:printf("输入错误\n");}} while (2-mode);return 0;
}

产生一个随机数

rand
定义于头文件 <stdlib.h>
rand();
  • 返回 0【RAND_MAX】之间的伪随机整数值(包含 0RAND_MAX
参数返回值
(无)0RAND_MAX间(包含边界)的伪随机整数值。
srand

在使用前需要使用srand()“播种”

srand

定义于头文件 <stdlib.h>
void srand( unsigned seed );

以值 seed为种子 “播种” rand() 所用的随机数生成器

  • 注:若在 srand() 的调用前使用 rand() ,则 rand() 表现为如同它被以 srand(1) 播种

  • 以相同的 seed(srand(seed))播种 rand() 时,它会产生相同的值数列

参数返回值
seed--种子值(无)

注意: 每次使用rand()产生伪随机数时,都只需用srand()播种一次,不应重复播种

  • 通常使用时间戳来充当srand()的种子值,种子值的不断变化以保证产生的伪随机数值列不同
RAND_MAX
  • 展开成等于函数rand()最大返回值的整数常量表达式。此值为实现定义。标准保证此值至少为 32767
时间戳time()
  • 返回自纪元 Epoch(1970-01-01 00:00:00 UTC)起经过的时间,以秒为单位。如果 seconds 不为空,则返回值也存储在变量 seconds

  • 头文件以及函数声明

    • <time.h>

    •   time_t time( time_t *arg );
      
参数返回值
arg—>指向将存储时间的 time_t 对象的指针,或空指针成功时返回编码成time_t对象的当前日历时间。错误时返回 (time_t)(-1) 。若arg不是空指针,则返回值也会存储于 arg 所指向的对象

返回编码成time_t对象的当前日历时间,并将其存储于 arg 指向的time_t对象(除非 arg 为空指针)

示例:

#include <stdio.h>
#include <time.h>int main ()
{time_t seconds;seconds = time(NULL);printf("自 1970-01-01 起的小时数 = %ld\n", seconds/3600);return(0);
}
  • 运行上面的程序,产生以下结果:

  • 1970-01-01 起的小时数 = 373711
    

    示例

#include <stdio.h>
#include <stdlib.h>
#include <time.h>int main(void)
{srand(time(NULL)); // 以当前时间为随机生成器的种子int random_variable = rand();printf("Random value on [0,%d]: %d\n", RAND_MAX, random_variable);// 扔 6 面色子 20 次for (int n = 0; n != 20; ++n) {int x = 7;while(x > 6) x = 1 + rand() / ((RAND_MAX + 1u) / 6); // 注意: 1 + rand() % 6 有偏差!printf("%d ", x); }
}
  • 可能的输出:

  • Random value on [0,2147483647]: 448749574
    3 1 3 1 4 2 2 1 3 6 4 4 3 1 6 2 3 2 6 1
    

    七、关机程序

//关机程序
//运行程序后,电脑60s后自动关机
//如果输入:你好  则取消关机
#include <stdio.h>
#include <time.h>
#include<Windows.h>
int main()
{char input[20] = { 0 };printf("电脑将在60s后关机,输入“你好”后取消关机!!\n");int time0 = (unsigned int)time(NULL);system("shutdown -s -t 60");
again:scanf("%s", input);if (strcmp(input, "你好") == 0){system("shutdown -a");printf("成功取消关机!\n");}else{int time1 = 60-(((unsigned int)time(NULL))-time0);printf("电脑将在%d后关机,输入“你好”后取消关机!!\n",time1);goto again;}return 0;
}
  • 运行结果:

  • 电脑将在60s后关机,输入“你好”后取消关机!!
    a
    电脑将在55后关机,输入“你好”后取消关机!!
    b
    电脑将在51后关机,输入“你好”后取消关机!!
    c
    电脑将在48后关机,输入“你好”后取消关机!!
    你好
    成功取消关机!
    
    • 控制电脑关机: shutdown -s -t 60

    • 取消电脑关机: shutdown -a

    Windows 10 shutdown 命令详解

    八、修改字符串

memset()的使用

#include <stdio.h>
int main()
{char str[] = "Hello World!";printf("%s\n", str);memset(str, 'A', 5);printf("%s\n", str);return 0;
}
  • 输出结果:

  •   Hello World!AAAAA World!
    
#include <stdio.h>
int main()
{char str[] = "Hello World!";printf("%s\n", str);memset(str+4, 'A', 1);printf("%s\n", str);return 0;
}
  • 输出结果:

  •   Hello World!HellA World!
    

九、使用函数实现质数的判断

  • 质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数(规定1既不是质数也不是合数)
#include <stdio.h>
//使用函数判断一个数是不是素数(质数)
#include <math.h>
//sqrt()开平方,返回值为double类型
int Prime(int A)
{int i = 0;for (i = 2; i <= (int)sqrt(A); i++){if (A % i == 0){return 0;//不是质数}}return 1;//是质数
}
int main()
{int a = 0;while (1){scanf("%d", &a);if (Prime(a) == 1)printf("%d->是质数\n", a);else printf("%d->不是质数\n", a);}return 0;
}
  • 输出:

  • 3
    3->是质数
    4
    4->不是质数
    5
    5->是质数
    6
    6->不是质数
    

    sqrt()的使用

    doubel sqrt(double A)

    • 包含在头文件include <math.h>

    • 返回值是其中参数的开平方(double类型)

    十、利用函数打印1000 - 2000年之间的闰年

#include <stdio.h>
//打印1000-2000年之间的闰年
//闰年:1、能被四整除且不能被100整除;2、能被100整除
int main()
{int i = 0;for (i = 1000; i <= 2000; i++){if (((i % 4 == 0) && (i % 100 != 0)) || (i % 400 == 0)){printf("%d ", i);}}return 0;
}
  • 输出:

  • 1004 1008 1012 1016 1020 1024 1028 1032 1036 1040 1044 1048 1052 1056 1060 1064 1068 1072 1076 1080 1084 1088 1092 1096 1104 1108 1112 1116 1120 1124 1128 1132 1136 1140 1144 1148 1152 1156 1160 1164 1168 1172 1176 1180 1184 1188 1192 1196 1200 1204 1208 1212 1216 1220 1224 1228 1232 1236 1240 1244 1248 1252 1256 1260 1264 1268 1272 1276 1280 1284 1288 1292 1296 1304 1308 1312 1316 1320 1324 1328 1332 1336 1340 1344 1348 1352 1356 1360 1364 1368 1372 1376 1380 1384 1388 1392 1396 1404 1408 1412 1416 1420 1424 1428 1432 1436 1440 1444 1448 1452 1456 1460 1464 1468 1472 1476 1480 1484 1488 1492 1496 1504 1508 1512 1516 1520 1524 1528 1532 1536 1540 1544 1548 1552 1556 1560 1564 1568 1572 1576 1580 1584 1588 1592 1596 1600 1604 1608 1612 1616 1620 1624 1628 1632 1636 1640 1644 1648 1652 1656 1660 1664 1668 1672 1676 1680 1684 1688 1692 1696 1704 1708 1712 1716 1720 1724 1728 1732 1736 1740 1744 1748 1752 1756 1760 1764 1768 1772 1776 1780 1784 1788 1792 1796 1804 1808 1812 1816 1820 1824 1828 1832 1836 1840 1844 1848 1852 1856 1860 1864 1868 1872 1876 1880 1884 1888 1892 1896 1904 1908 1912 1916 1920 1924 1928 1932 1936 1940 1944 1948 1952 1956 1960 1964 1968 1972 1976 1980 1984 1988 1992 1996 2000
    

    使用函数:

#include <stdio.h>
//利用函数打印1000 - 2000年之间的闰年
int Get_Leap_Year(int year)
{//是闰年返回1//不是闰年返回0if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))return 1;else return 0;
}
int main()
{int i = 0;for (i = 1000; i <= 2000; i++){if(Get_Leap_Year(i))printf("%d ", i);		}return 0;
}
  • 输出:

  • 1004 1008 1012 1016 1020 1024 1028 1032 1036 1040 1044 1048 1052 1056 1060 1064 1068 1072 1076 1080 1084 1088 1092 1096 1104 1108 1112 1116 1120 1124 1128 1132 1136 1140 1144 1148 1152 1156 1160 1164 1168 1172 1176 1180 1184 1188 1192 1196 1200 1204 1208 1212 1216 1220 1224 1228 1232 1236 1240 1244 1248 1252 1256 1260 1264 1268 1272 1276 1280 1284 1288 1292 1296 1304 1308 1312 1316 1320 1324 1328 1332 1336 1340 1344 1348 1352 1356 1360 1364 1368 1372 1376 1380 1384 1388 1392 1396 1404 1408 1412 1416 1420 1424 1428 1432 1436 1440 1444 1448 1452 1456 1460 1464 1468 1472 1476 1480 1484 1488 1492 1496 1504 1508 1512 1516 1520 1524 1528 1532 1536 1540 1544 1548 1552 1556 1560 1564 1568 1572 1576 1580 1584 1588 1592 1596 1600 1604 1608 1612 1616 1620 1624 1628 1632 1636 1640 1644 1648 1652 1656 1660 1664 1668 1672 1676 1680 1684 1688 1692 1696 1704 1708 1712 1716 1720 1724 1728 1732 1736 1740 1744 1748 1752 1756 1760 1764 1768 1772 1776 1780 1784 1788 1792 1796 1804 1808 1812 1816 1820 1824 1828 1832 1836 1840 1844 1848 1852 1856 1860 1864 1868 1872 1876 1880 1884 1888 1892 1896 1904 1908 1912 1916 1920 1924 1928 1932 1936 1940 1944 1948 1952 1956 1960 1964 1968 1972 1976 1980 1984 1988 1992 1996 2000
    

    十一、函数实现整形有序数组的二分查找

#include <stdio.h>
//函数实现整形有序数组的二分查找
int Search_Array(int *arr, int a, int sz)
{int left = 0;int right = sz - 1;//找到了返回下标//找不到返回-1(数组第一个元素下标为0)while (left <= right){int mid = left + (right - left) / 2;if (arr[mid] > a)right = mid - 1;else if (arr[mid] < a)left = mid + 1;elsereturn mid;}return -1;
}
int main()
{int arr[] = { 1,3,4,6,7,8,9,10,11,12,13,15,16,17,19,20 };int a = 6;int sz = sizeof(arr) / sizeof(arr[0]);int Sub = Search_Array(arr, a, sz);if (Sub == -1)printf("数组中没有这个数\n");elseprintf("%d在数组中的下标是%d\n", a, Sub);return 0;
}
  • 输出:

  •   6在数组中的下标是3
    

十二、将三个整数按从大到小输出

//将三个整数按从大到小输出
void swap(int* x, int* y)
{int temp = 0;temp = *x;*x = *y;*y = temp;
}
int main()
{int a = 0;int b = 0;int c = 0;while (1){//输入scanf("%d %d %d", &a, &b, &c);//交换if (a < b)swap(&a, &b);if (a <  c)swap(&a, &c);if (b < c)swap(&b, &c);//输出printf("%d %d %d\n", a, b, c);}return 0;
}
  • 输出:

  •   6 8 38 6 3
    

十三、求两个数的最大公约数

//求两个数的最大公约数
int main()
{int a = 0;int b = 0;while (1){scanf("%d %d", &a, &b);int min = (a < b ? a : b);while (1){if (a % min == 0 && b % min == 0)break;min--;}printf("%d和%d的最大公约数是:%d\n", a, b, min);}return 0;
}
  • 输出:

  •   18 241824的最大公约数是:6
    

辗转相除法

欧几里得算法是用来求两个正整数最大公约数的算法

  • 古希腊数学家欧几里得在其著作《The Elements》中最早描述了这种算法,所以被命名为欧几里得算法。扩展欧几里得算法可用于RSA加密等领域

假如需要求 1997 和 615 两个正整数的最大公约数,用欧几里得算法,是这样进行的:

在这里插入图片描述

​ 至此,最大公约数为1以除数和余数反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数,所以就得出了 1997 和 615 的最大公约数 1

//辗转相除法
int main()
{int a = 0;int b = 0;int c = 0;while(1){scanf("%d %d", &a, &b);while (c = a % b){a = b;b = c;}printf("最大公约数是:%d\n", b);}return 0;
}
  • 输出:

  •   18 24最大公约数是:6
    

十四、求1-100的整数之间出现了多少个数字9

//求1-100的整数之间出现了多少个数字9
int main()
{int i = 1;int count = 0;for (i = 1; i < 100; i++)//不用计算100{if (i % 10 == 9)//判断个位是不是9count++;if (i / 10 == 9)//判断十位是不是9count++;}printf("%d个9\n", count);return 0;
}
  • 输出:

  •   209
    

十五、打印99乘法表

//打印99乘法表
int main()
{int i = 0;int j = 0;for (i = 1; i <= 9; i++)//9行{for (j = 1; j <= i; j++){printf("%d*%d=%2d ", j, i, i * j);//%-2d打印两位整数左对齐// %2d打印两位整数右对齐}printf("\n");}return 0;
}
  • 输出:

  •   1*1=11*2=2 2*2=41*3=3 2*3=6  3*3=91*4=4 2*4=8  3*4=12 4*4=161*5=5 2*5=10 3*5=15 4*5=20 5*5=251*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=361*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=491*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=641*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
    

十六、递归实现字符串逆序

#include <stdio.h>
#include <string.h>void change(char* str, int left, int right)
{char temp = 0;if (left < right){temp = str[left];str[left] = str[right];str[right] = temp;change(str, left + 1, right - 1);}
}int main()
{char str[] = "abcdefg";int left = 0;int right = strlen(str) - 1;change(str, left, right);printf("%s", str);return 0;
}
  • 输出:

  •   gfedcba
    

十七、模拟实现strlen()

  • 使用临时变量
//模拟实现strlen(),返回字符串个数//int my_strlen(char str[])//参数部分写成指针的形式
int my_strlen(char str[])  //参数部分写成数组的形式
{int count = 0;//计数,使用临时变量while (*str != '\0'){count++;str++;//找下一个字符}return count;
}
int main()
{char str[] = "abcd";//[a b c d \0]printf("%d", my_strlen(str));return 0;
}
  • 输出:

  •   4
    
  • 使用递归,不创建临时变量

//不创建临时变量使用递归
int my_strlen(char* str)
{if (*str != '\0')return 1 + my_strlen(str + 1);elsereturn 0;
}
int main()
{char str[] = "abcd";//[a b c d \0]printf("%d", my_strlen(str));return 0;
}
  • 输出:

  •   4
    

在这里插入图片描述

十八、三子棋

test.c:测试游戏的逻辑

game.c:游戏代码的实现

game.h:游戏代码的声明(函数定义,符号定义)

  • test.c

    •   #define _CRT_SECURE_NO_WARNINGS#include "game.h"//***************************************************************//游戏菜单void menu(){printf("================================\n");printf("==-----------1.Play-----------==\n");printf("==-----------2.Exit-----------==\n");printf("================================\n");}//***************************************************************void game(){char board[ROW][COL] = { 0 };char ret = 0;//输赢判断标志位Init_Board(board);//棋盘初始化while (1){	Print_Board(board);//打印棋盘Player_Chess(board);//玩家回合ret = IsWin(board);//判断输赢if (ret != 'C')break;Print_Board(board);//打印棋盘Computer_Chess(board);//电脑回合ret = IsWin(board);//判断输赢if (ret != 'C')break;}if (ret == '*')printf("你赢得了游戏!\n");else if (ret == '#')printf("你输了。。。\n");else if (ret == 'P')printf("+++平局+++\n");Print_Board(board);//打印棋盘printf("<------------------------------>\n");printf("<----------$回合结束$---------->\n");printf("<------------------------------>\n");printf("\n\n");}//***************************************************************void test(){int mode = 0;do{menu();printf("<输入游戏模式>:");scanf("%d", &mode);switch (mode){case 1:game();break;case 2:break;default:printf("<输入错误!>\n");break;}} while (mode != 2);}//***************************************************************int main(){srand((unsigned int)time(NULL));//设置随机数的生成起点test();return 0;}
      
  • game.c

    •   #define _CRT_SECURE_NO_WARNINGS#include "game.h"//***************************************************************//棋盘初始化函数void Init_Board(char board[ROW][COL]){int i = 0;for (i = 0; i < ROW; i++){int j = 0;for (j = 0; j < COL; j++)board[i][j] = ' ';}}//***************************************************************//打印棋盘void Print_Board(char board[ROW][COL]){int i = 0;for (i = 0; i < ROW; i++){int j = 0;//数据打印for (j = 0; j < COL; j++){printf(" %c ", board[i][j]);if (j < COL - 1)printf("|");elseprintf("\n");}//分割信息打印if (i < ROW - 1){int j = 0;for (j = 0; j < COL; j++){printf("---");if (j < COL - 1)printf("|");elseprintf("\n");}}}}//***************************************************************//玩家下棋void Player_Chess(char board[ROW][COL]){printf("<玩家回合>:\n");int x = 0;int y = 0;while (1){scanf("%d %d", &x, &y);if (1 <= x && x <= ROW && 1 <= y && y <= COL)//数据验证{if (board[x - 1][y - 1] == ' '){board[x - 1][y - 1] = '*';break;}elseprintf("<此处已被占用!>\n请重新输入:");}elseprintf("<超出棋盘范围!>\n请重新输入:");}}//***************************************************************//电脑下棋void Computer_Chess(char board[ROW][COL]){printf("<电脑回合>:\n");Sleep(1000);//延时一秒int x = 0;int y = 0;while (1){x = rand() % ROW;//产生0~(ROW-1)之间的随机数y = rand() % COL;//0~2if (board[x][y] == ' '){board[x][y] = '#';break;}}}//***************************************************************//判断棋盘是否满了int Board_Full(char board[ROW][COL]){int i = 0;for (i = 0; i < ROW; i++){int j = 0;for (j = 0; j < COL; j++){if (board[i][j] == ' ')return 0;//棋盘没满时返回0}}return 1;//棋盘满了,返回1}//***************************************************************//继续---->'C'//玩家赢-->'*'//电脑赢-->'#'//平局---->'P'char IsWin(char board[ROW][COL]){//行rowint i = 0;for (i = 0; i < ROW; i++){if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')return board[i][1];}//列columnint j = 0;for (j = 0; j < COL; j++){if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' ')return board[1][j];}//对角线if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')return board[1][1];if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')return board[1][1];//平局if (Board_Full(board))//返回1-->满了;此时为平局return 'P';//继续return 'C';}
      
  • game.h

    •   #pragma once#include <stdio.h>#include <stdlib.h>#include <time.h>#include <Windows.h>#define ROW 3#define COL 3//棋盘初始化void Init_Board();//打印棋盘void Print_Board(char board[ROW][COL]);//玩家回合void Player_Chess(char board[ROW][COL]);//电脑回合void Computer_Chess(char board[ROW][COL]);//输赢判断char IsWin(char board[ROW][COL]);
      
  • 结果:

    •   ==================================-----------1.Play-----------====-----------2.Exit-----------==================================<输入游戏模式>3<输入错误!>==================================-----------1.Play-----------====-----------2.Exit-----------==================================<输入游戏模式>1|   |---|---|---|   |---|---|---|   |<玩家回合>2 2|   |---|---|---| * |---|---|---|   |<电脑回合>|   |---|---|---| * |---|---|---| # |<玩家回合>1 1* |   |---|---|---| * |---|---|---| # |<电脑回合>* |   |---|---|---| * |---|---|---# | # |<玩家回合>3 3你赢得了游戏!* |   |---|---|---| * |---|---|---# | # | *<------------------------------><----------$回合结束$----------><------------------------------>
      
      ================================
      ==-----------1.Play-----------==
      ==-----------2.Exit-----------==
      ================================
      <输入游戏模式>2D:\文档\新建文件夹 (2)\C语言程序设计\源码\C_Code_1\game_1\Debug\game_1.exe (进程 9740)已退出,代码为 0。
      按任意键关闭此窗口. . .
      

十九、扫雷

test.c:测试游戏的逻辑

game.c:游戏代码的实现

game.h:游戏代码的声明(函数定义,符号定义)

  • test.c

    •   #include "game.h"void game(){//创建数组,布置雷的信息,初始化时放入'0'char mine[ROWS][COLS] = { 0 };//创建数组,排查雷的信息,初始化时放入'*'char show[ROWS][COLS] = { 0 };//数组初始化InitBoard(mine, ROWS, COLS, Kong);InitBoard(show, ROWS, COLS, View);//随机放置雷Place_Mine(mine, ROW, COL);//打印棋盘//PrintBoard(mine, ROW, COL);PrintBoard(show, ROW, COL); Game_Run(mine, show, ROW, COL);}int main(){//设置产生随机数的初始值srand((unsigned int)time(NULL));int mode = 0;do{menu();//初始化游戏菜单printf("输入游戏模式:");//游戏模式选择scanf("%d", &mode);switch (mode){case 1:printf("开始游戏\n");game();break;case 2:printf("退出游戏\n");break;default :printf("输入错误!\n");break;}} while (mode != 2);return 0;}
      
  • game.c

    •   #define _CRT_SECURE_NO_WARNINGS#include "game.h"void menu(){//游戏菜单printf("====--------------------------====\n");printf("====--------- 1.Play ---------====\n");printf("====--------- 2.Exit ---------====\n");printf("====--------------------------====\n");}//初始化雷盘void InitBoard(char arr[ROWS][COLS], int rows, int cols, char set){int i = 0;int j = 0;for (i = 0; i < rows; i++){for (j = 0; j < cols; j++){arr[i][j] = set;}}}//打印雷盘void PrintBoard(char arr[ROWS][COLS], int row, int col){int i = 1;int j = 1;printf("=------扫-雷------=\n");//显示出列号(|)for (j = 0; j <= col; j++){printf("%d ", j);}printf("\n");for (i = 1; i <= row; i++){printf("%d ", i);//显示出行号(—)for (j = 1; j <= col; j++){printf("%c ", arr[i][j]);}printf("\n");}}//放置雷void Place_Mine(char arr[ROWS][COLS], int row, int col){int count = 0;while (count < Set_of_Mine){	//产生1~9之间的随机数int x = rand() % row + 1;int y = rand() % col + 1;if (arr[x][y] == Kong){arr[x][y] = Lei;count++;}}	}//扫雷主逻辑void Game_Run(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col){int count = 0;while (count < row * col - Set_of_Mine){int x = 0;int y = 0;printf("请选择位置排雷:>");scanf("%d %d", &x, &y);if (x > 0 && x <= row && y > 0 && y <= col){if (mine[x][y] != Lei){show[x][y] = Count_of_Mine(mine, x, y);//计算出(x,y)周围雷的数量if (show[x][y] == '0'){Find_Zero_Mine(mine, show, row, col, x, y);}system("cls");//清屏PrintBoard(show, ROW, COL);Mark_Mine(show);count++;}else if (mine[x][y] == Lei){system("cls");//清屏printf("你碰到了雷,游戏结束!\n");PrintBoard(mine, ROW, COL);printf("====--------------------------====\n");printf("====--------Game  Over--------====\n");printf("====--------------------------====\n\n");break;}			}else{printf("非法坐标,请重新输入!\n\n");}}if (count == row * col - Set_of_Mine){printf("恭喜你,排雷成功!!!\n\n");PrintBoard(mine, ROW, COL);}}//计算周围雷的数量char Count_of_Mine(char arr[ROWS][COLS], int x, int y){char count = 0;int i = 0;int j = 0;for (i = -1; i < 2; i++){for (j = -1; j < 2; j++){if (arr[x + i][y + j] == Lei)count++;elsecontinue;}}return count + '0';//数字+'0'可将其转换成字符串//字符串-'0'可将其转换成数字}//如果检测到该坐标周围雷的数量为0,就显示出该坐标/*条件:1.该坐标不是雷2.该坐标周围没有雷3.不能重复排查*///展开一片没有雷的区域(函数递归)void Find_Zero_Mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col, int x, int y){if (Count_of_Mine(mine, x, y) == '0'){show[x][y] = ' ';int i = 0;int j = 0;for (i = -1; i < 2; i++){for (j = -1; j < 2; j++){if (x + i > 0 && x + i <= row && y + j > 0 && y + j <= col && show[x + i][y + j] == View){Find_Zero_Mine(mine, show, row, col, x + i, y + j);}}}}//显示区域边缘雷的数量elseshow[x][y] = Count_of_Mine(mine, x, y);}void Mark_Mine(char show[ROWS][COLS]){int Flag = 1;int x = 0;int y = 0;while (Flag){printf("是否需要标记(1/0):");scanf("%d", &Flag); if (Flag == 1){printf("请输入要标记的位置:>");scanf("%d %d", &x, &y);if (x > 0 && x <= ROW && y > 0 && y <= COL){show[x][y] = Sign;PrintBoard(show, ROW, COL);}else{printf("非法坐标!\n");continue;}}elsebreak;}system("cls");//清屏PrintBoard(show, ROW, COL);}
      
  • game.h

    •   #pragma once#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <time.h>#include <stdlib.h>#include <Windows.h>//设置扫雷棋盘界面的大小#define ROW 9#define COL 9//为了方便棋盘边缘的计算#define ROWS ROW+2#define COLS COL+2//设置样式#define Lei '1'		//雷#define Kong '0'	//Mine数组中没有雷的部分#define View '*'	//Show数组中显示部分#define Sign '#'	//Show数组中用于标记雷//设置雷的数量#define Set_of_Mine 10void menu();void InitBoard(char arr[ROWS][COLS], int rows, int cols, char set);void PrintBoard(char arr[ROWS][COLS], int row, int col);void Place_Mine(char arr[ROWS][COLS], int row, int col);void Game_Run(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);char Count_of_Mine(char arr[ROWS][COLS], int x, int y);void Find_Zero_Mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col, int x, int y);void Mark_Mine(char show[ROWS][COLS]);
      
  • 结果:

    •   ====--------------------------========--------- 1.Play ---------========--------- 2.Exit ---------========--------------------------====输入游戏模式:1开始游戏=-------------=0 1 2 3 4 5 6 7 8 91 * * * * * * * * *2 * * * * * * * * *3 * * * * * * * * *4 * * * * * * * * *5 * * * * * * * * *6 * * * * * * * * *7 * * * * * * * * *8 * * * * * * * * *9 * * * * * * * * *请选择位置排雷:>6 8=-------------=0 1 2 3 4 5 6 7 8 91 * * * * * * * * *2 * * * * * * * * *3 * * * * * * * * *4 * * * * * * * * *5 * * * * * * * * *6 * * * * * * * 1 *7 * * * * * * * * *8 * * * * * * * * *9 * * * * * * * * *是否需要标记(1/0):0=-------------=0 1 2 3 4 5 6 7 8 91 * * * * * * * * *2 * * * * * * * * *3 * * * * * * * * *4 * * * * * * * * *5 * * * * * * * * *6 * * * * * * * 1 *7 * * * * * * * * *8 * * * * * * * * *9 * * * * * * * * *请选择位置排雷:>2 4=-------------=0 1 2 3 4 5 6 7 8 91 * * 1         1 *2 * * 1     1 2 3 *3 * * 2 1   1 * * *4 * * * 2   1 2 2 15 * * * 26 * * 1 1       1 17 * * 1   1 1 1 1 *8 * * 1   1 * * * *9 * * 1   1 * * * *是否需要标记(1/0):1请输入要标记的位置:>1 9=-------------=0 1 2 3 4 5 6 7 8 91 * * 1         1 #2 * * 1     1 2 3 *3 * * 2 1   1 * * *4 * * * 2   1 2 2 15 * * * 26 * * 1 1       1 17 * * 1   1 1 1 1 *8 * * 1   1 * * * *9 * * 1   1 * * * *是否需要标记(1/0):0请输入要标记的位置:>3 7你碰到了雷,游戏结束!=-------------=0 1 2 3 4 5 6 7 8 91 0 0 0 0 0 0 0 0 12 0 1 0 0 0 0 0 0 03 0 0 0 0 0 0 1 1 04 0 0 1 0 0 0 0 0 05 0 0 1 0 0 0 0 0 06 0 0 0 0 0 0 0 0 07 0 0 0 0 0 0 0 0 18 1 1 0 0 0 1 0 0 09 0 0 0 0 0 0 0 0 0====--------------------------========--------Game  Over--------========--------------------------====
      

二十、求一个整数存储在内存中二进制1的个数

//编写代码实现:求一个整数存储在内存中二进制1的个数
//求补码的二进制1的个数
int main() {int a = 7;//0000 0000 0000 0000 0000 0000 0000 0111//0000 0000 0000 0000 0000 0000 0000 0001
//&	  0000 0000 0000 0000 0000 0000 0000 0001int i = 0;int count = 0;for (i = 0; i < 32; i++) {if ((a & (1 << i)) == (1 << i))count++;}printf("%d\n", count);return 0;
}

二十一、青蛙跳台阶问题(斐波那契数列)

n阶台阶,每次可走1阶或两阶,问有多少种走法

//n阶台阶,每次可走1阶或两阶,有多少种走法
int Fib(int n) {if (n == 1)return 1;else if (n == 2)return 2;elsereturn Fib(n - 1) + Fib(n - 2);
}
int main() {int n = 0;scanf("%d", &n);int count = 0;count = Fib(n);printf("%d", count);return 0;
}
  •   1089
    

F i b ( n ) = { 1 , n=1 1 , n=2 F i b ( n − 1 ) + F i b ( n − 2 ) , n>2 Fib(n) = \begin{cases} 1, & \text{n=1} \\\\ 1, & \text{n=2} \\\\ Fib(n-1)+Fib(n-2), & \text{n>2} \end{cases} Fib(n)= 1,1,Fib(n1)+Fib(n2),n=1n=2n>2

二十二、序列中删除指定数字

int main() {int arr[20] = { 0 };int n = 0;int i = 0;printf("输入数字的个数:");scanf("%d", &n);for (i = 0; i < n; i++) {scanf("%d ", &arr[i]);}//删除int del = 0;int j = 0;scanf("%d", &del);for (j = 0; j < n; j++) {if (del != arr[j])printf("%d ", arr[j]);}return 0;
}
  •   输入数字的个数:51 2 3 4 521 3 4 5
    

二十三、模拟实现strcpy

//模拟实现strcpy
#include <assert.h>//将字符数组Source的内容复制到Goal中
char* my_strcpy(char* Goal, const char* Source) {//之所以返回char*是为了实现链式访问//const可确保Source不会被改变char* ret = Goal;//断言assert(Source != NULL);//如果不满足条件,程序将直接中断运行,并抛出异常assert(Goal != NULL);while (*Goal++ = *Source++);return ret;//返回目标数据的首地址
}int main() {char arr1[20] = { 0 };char arr2[] = "For YOU!";my_strcpy(arr1, arr2);printf("arr1:%s\n", arr1);printf("arr1:%s\n", my_strcpy(arr1, arr2));printf("arr2:%s\n", arr2); return 0;
}
  •   arr1:For YOU!//arr1arr1:For YOU!//my_strcpy(arr1, arr2)arr2:For YOU!//arr2
    

assert(断言)的使用

  • 在 C 语言中,assert 是一个宏定义,它定义在 assert.h 头文件中。assert 宏用于在程序执行期间测试某个条件是否为真。如果条件为假(即表达式计算结果为0),则 assert 宏会终止程序的执行,并输出一个错误消息

  • 使用 assert 宏可以帮助开发者在开发和测试阶段发现错误,但它通常不用于生产环境,因为可以通过定义 NDEBUG 宏来禁用所有的 assert 检查

如何使用 assert

  1. 包含头文件:首先,需要包含 assert.h 头文件

  2. 使用 assert:在代码中使用 assert 宏来检查条件

  3. 定义 NDEBUG:如果定义了 NDEBUG 宏,则所有的 assert 检查都会被禁用

示例代码:

#include <stdio.h>
#include <assert.h>int main() {int a = 10;int b = 0;// 检查除数是否为0assert(b != 0); // 如果 b 为0,程序将终止并输出错误信息printf("结果是: %d\n", a / b);return 0;
}

禁用 assert

如果你想要禁用 assert 检查,可以在编译时定义 NDEBUG 宏。这可以通过编译器的命令行选项来实现:

gcc -DNDEBUG program.c

或者在代码中定义:

#define NDEBUG
#include <stdio.h>
#include <assert.h>int main() {int a = 10;int b = 0;// 这个 assert 检查将被禁用assert(b != 0);printf("结果是: %d\n", a / b);return 0;
}

使用 assert 宏时,应该谨慎选择要检查的条件,避免在性能敏感的代码路径中使用,因为即使条件总是为真,assert 宏也会进行计算。此外,assert 宏不应该用于检查程序的正常运行逻辑,而应该用于捕获不可能发生的情况

const的使用

在 C 语言中,const 关键字用于定义常量值,即值在程序执行过程中不能被修改的变量。使用 const 可以提高代码的可读性和可维护性,同时帮助编译器进行优化

基本用法:

  1. 定义常量:使用 const 关键字可以定义一个常量,这意味着一旦初始化后,其值不能被改变

    const int MAX_USERS = 100;
    
  2. 定义常量指针:你可以定义指向常量的指针,这有两种情况:

    • 指针本身是常量(不能改变指向)
    • 指针指向的值是常量(不能通过这个指针改变值)
    const int *ptr;  // 指针本身是常量
    int *const ptr2 = &someInt;  // 指针指向的地址是常量
    const int *const ptr3 = &someInt;  // 指针本身和指向的值都是常量
    

常量数组:

  • 你可以定义一个数组为常量,这意味着数组中的元素不能被修改
const int days[] = {1, 2, 3, 4, 5};

函数参数:

  • 使用 const 修饰函数参数可以保证函数内部不会修改这些参数
void printArray(const int arr[], int size) {for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("\n");
}
  • 在这个例子中,printArray 函数接收一个整数数组和数组的大小。由于数组被声明为 const,函数内部不能修改数组的元素

常量成员函数:

  • 在 C++ 中(C 语言的超集),你可以定义一个成员函数为常量成员函数,这意味着该函数不会修改对象的任何成员变量
class Counter {
public:int value;void increment() {value++;}int getValue() const {  // 常量成员函数return value;}
};
  • 在这个例子中,getValue 函数被声明为常量成员函数,这意味着它不会修改对象的任何成员变量

注意事项:

  • 使用 const 可以提高代码的安全性,防止意外修改变量
  • 在数组或结构体中使用 const 时,需要小心处理,因为 const 只保护直接访问,不保护间接访问
  • 在使用指针时,明确 const 的位置非常重要,因为它影响指针的行为

二十四、菱形打印

//4____*____1 1
//3___***___2 3 
//2__*****__3 5
//1_*******_4 7 
//0*********5 9
//1_*******_1 7
//2__*****__2 5 
//3___***___3 3
//4____*____4 1
void print_star(int line) {int i = 0;for (i = 0; i < line; i++) {//上部分lineint j = 0;for (j = 0; j < (line - 1 - i); j++) {//空格printf(" ");}for (j = 0; j < 2 * i + 1; j++) {//*printf("*");}printf("\n");}for (i = 0; i < (line - 1); i++) {//下部分line-1int j = 0;for (j = 0; j <= i; j++) {//空格printf(" ");}for (j = 0; j < 2 * (line - 1 - i) - 1; j++) {//*printf("*");}printf("\n");}}
int main() {int n = 0;while (1) {scanf("%d", &n);print_star(n);}return 0;
}
  •   5*****************************************9*************************************************************************************************************************************************
    

相关文章:

C语言简单练习题

文章目录 练习题一、计算n的阶乘bool类型 二、计算1!2!3!...10!三、计算数组arr中的元素个数二分法查找 四、动态打印字符Sleep()ms延时函数system("cls")清屏函数 五、模拟用户登录strcmp()函数 六、猜数字小游戏产生一个随机数randsrandRAND_MAX时间戳time() 示例 …...

基于Python的深度学习音乐推荐系统(有配套论文)

音乐推荐系统 提供实时音乐推荐功能&#xff0c;根据用户行为和偏好动态调整推荐内容 Python、Django、深度学习、卷积神经网络 、算法 数据库&#xff1a;MySQL 系统包含角色&#xff1a;管理员、用户 管理员功能&#xff1a;用户管理、系统设置、音乐管理、音乐推荐管理、系…...

Java:单例模式(Singleton Pattern)及实现方式

一、单例模式的概念 单例模式是一种创建型设计模式&#xff0c;确保一个类只有一个实例&#xff0c;并提供一个全局访问点来访问该实例&#xff0c;是 Java 中最简单的设计模式之一。该模式常用于需要全局唯一实例的场景&#xff0c;例如日志记录器、配置管理、线程池、数据库…...

解锁养生秘籍,拥抱健康生活

在这个快节奏的时代&#xff0c;人们行色匆匆&#xff0c;常常在忙碌中忽略了健康。其实&#xff0c;养生并非遥不可及&#xff0c;它就藏在生活的细微之处&#xff0c;等待我们去发现和实践。 规律作息是健康的基础。日出而作&#xff0c;日落而息&#xff0c;顺应自然规律&am…...

数据结构之堆(Heap)

数据结构之堆&#xff08;Heap&#xff09; 数据结构之堆&#xff08;Heap&#xff09;一、堆的核心概念1. 定义与性质2. 存储方式 二、核心操作与算法1. 操作复杂度概览2. 关键操作详解(1) 向上调整&#xff08;Sift Up&#xff09;(2) 向下调整&#xff08;Sift Down&#xf…...

人工智能 - 机器学习、深度学习、强化学习是人工智能领域的理论基础和方法论

机器学习、深度学习、强化学习是人工智能领域的三大核心方向,各自具有独特的理论基础和方法论。以下是它们的核心理论知识总结: 一、机器学习(Machine Learning, ML) 1. 基础概念 目标:通过数据驱动的方式,让机器从经验中学习规律,完成预测、分类或决策任务。 核心范式…...

github上文件过大无法推送问题

GitHub 对文件大小有限制&#xff0c;超过 100 MB 的文件无法直接推送到仓库中。 解决思路&#xff1a; 使用 Git Large File Storage (Git LFS) 来管理大文件不上传对应的大文件 使用Git LFS&#xff1a; 1. 安装 Git LFS 首先&#xff0c;你需要安装 Git LFS。可以按照以…...

Elasticsearch:将 Ollama 与推理 API 结合使用

作者&#xff1a;来自 Elastic Jeffrey Rengifo Ollama API 与 OpenAI API 兼容&#xff0c;因此将 Ollama 与 Elasticsearch 集成非常容易。 在本文中&#xff0c;我们将学习如何使用 Ollama 将本地模型连接到 Elasticsearch 推理模型&#xff0c;然后使用 Playground 向文档提…...

【Linux】详谈 进程控制

目录 一、进程是什么 二、task_struct 三、查看进程 四、创建进程 4.1 fork函数的认识 4.2 2. fork函数的返回值 五、进程终止 5.1. 进程退出的场景 5.2. 进程常见的退出方法 5.2.1 从main返回 5.2.1.1 错误码 5.2.2 exit函数 5.2.3 _exit函数 5.2.4 缓冲区问题补…...

构建高效智能对话前端:基于Ant Design X 的deepseek对话应用

文章目录 实现的效果前言Ant Design X添加欢迎组件创建对话气泡存储对话历史渲染对话气泡 输入组件WebSocket 连接总结 实现的效果 待机页面&#xff1a; 等待页面&#xff1a; 完成页面&#xff1a; 前言 随着人工智能技术的飞速发展&#xff0c;大模型对话系统已成为…...

WordPress“更新失败,响应不是有效的JSON响应”问题的修复

在使用WordPress搭建网站时&#xff0c;许多人在编辑或更新文章时&#xff0c;可能会遇到一个提示框&#xff0c;显示“更新失败&#xff0c;响应不是有效的JSON响应”。这个提示信息对于不了解技术细节的用户来说&#xff0c;太难懂。其实&#xff0c;这个问题并不复杂&#x…...

华为交换机trunk简介配置

目录 一、Trunk 口简介二、Trunk 口配置案例及命令&#xff08;一&#xff09;组网需求&#xff08;二&#xff09;配置步骤&#xff08;三&#xff09;验证配置 三、注意事项 一、Trunk 口简介 Trunk 口是交换机中一种重要的端口类型&#xff0c;主要用于连接交换机与交换机、…...

DeepSeek从入门到精通(清华大学)

​ DeepSeek是一款融合自然语言处理与深度学习技术的全能型AI助手&#xff0c;具备知识问答、数据分析、编程辅助、创意生成等多项核心能力。作为多模态智能系统&#xff0c;它不仅支持文本交互&#xff0c;还可处理文件、图像、代码等多种格式输入&#xff0c;其知识库更新至2…...

【SpringBoot3】面向切面 AspectJ AOP 使用详解

文章目录 一、AspectJ介绍二、简单使用步骤 1、引入依赖2、定义一个Aspect3、开启AOP支持 三、AOP 核心概念四、切点&#xff08;Pointcut&#xff09; 1. execution2. within3. this & target4. args & args5. within & target & annotation 五、通知&#xf…...

容器运行常见数据库

一.涉及镜像压缩包 均为amd架构版本&#xff1a;mysql:5.7.42、postgres:13.16、dm8:20250206_rev257733_x86_rh6_64、oceanbase-ce:v4.0、opengauss:5.0.2 通过网盘分享的文件&#xff1a;db.tgz 链接: https://pan.baidu.com/s/1EBbFPZj1FxCA4_GxjVunWg?pwd563s 提取码: 5…...

OpenGL ES学习大纲

如果您想从头学习 OpenGL ES,以下是一个详细的学习大纲,涵盖了从基础到高级的知识点,循序渐进地帮助您掌握 OpenGL ES 的核心概念、API 使用、渲染管线、着色器编程、性能优化等内容。 1. 学习前的准备 1.1 基础知识 在学习 OpenGL ES 之前,您需要掌握以下基础知识: 数学…...

Kotlin 优雅的接口实现

1. 日常遇到的冗余的接口方法实现 日常开发中&#xff0c;经常会要实现接口&#xff0c;但是很多场景中&#xff0c;只需要用到其中一两个方法&#xff0c;例如 ActivityLifecycleCallbacks&#xff0c;它有很多个接口需要实现&#xff0c;但是很多时候我们只需要用到其中的一…...

数据结构实现顺序表的尾插,尾删,按值查找/修改/删除,按下标查找/增加/删除

头文件&#xff1a;head.h #ifndef __HEAD_H__ #define __HEAD_H__#include <stdio.h> #include <string.h> #include <stdlib.h> #define MAXSIZE 20enum num {success,false-1};typedef int datatype;typedef struct {int len;datatype data[MAXSIZE]; }S…...

qt实现文字跑马灯效果

实现跑马灯的方式多种多少样&#xff0c;可以通过定时器&#xff0c;或者animation等来实现。 本文通过定时器&#xff0c;将第一个文字&#xff0c;移动到最后一个这种方式来实现&#xff0c;还有其他方式哈。 直接上源码 h文件 #ifndef TEXTTICKER_H #define TEXTTICKER_…...

PyTorch Tensor 形状变化操作详解

PyTorch Tensor 形状变化操作详解 在深度学习中&#xff0c;Tensor 的形状变换是非常常见的操作。PyTorch 提供了丰富的 API 来帮助我们调整 Tensor 的形状&#xff0c;以满足模型输入、计算或数据处理的需求。本文将详细介绍 PyTorch 中常见的 Tensor 形状变换操作&#xff0…...

关于Node.js前端面试的试题概念、工作原理及实际应用

文章目录 1. 什么是Node.js&#xff1f;2. Node.js是如何工作的&#xff1f;3. Node.js与其他流行的框架相比有何优势&#xff1f;4. Node.js如何克服I/O操作阻塞的问题&#xff1f;5. 为什么Node.js是单线程的&#xff1f;6. 如果Node.js是单线程的&#xff0c;那么它是如何处…...

OpenCV机器学习(3)期望最大化(Expectation-Maximization, EM)算法cv::ml::EM

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::ml::EM 是 OpenCV 机器学习模块中的一部分&#xff0c;用于实现期望最大化&#xff08;Expectation-Maximization, EM&#xff09;算法。EM …...

Spring Boot 集成 Kettle

Kettle 简介 Kettle 最初由 Matt Casters 开发&#xff0c;是 Pentaho 数据集成平台的一部分。它提供了一个用户友好的界面和丰富的功能集&#xff0c;使用户能够轻松地设计、执行和监控 ETL 任务。Kettle 通过其强大的功能和灵活性&#xff0c;帮助企业高效地处理大规模数据集…...

Debezium同步之如何同步GIS数据

Debezium 可以用于同步数据库中的变更数据(CDC),包括GIS(地理信息系统)数据。GIS 数据通常存储在具有地理空间数据类型的表中,例如 PostGIS(PostgreSQL 的扩展)中的 geometry 或 geography 类型。通过 Debezium,可以实时捕获和同步这类数据的变更。本文章简单介绍Post…...

Java与C语言中取模运算符%的区别对比

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: Java 文章目录 &#x1f4af;前言&#x1f4af;C语言中的取模运算符 %基本行为示例 注意事项示例&#xff1a;负数取模 &#x1f4af;Java中的取模运算符 %基本行为示例 对浮点数的支持示例&#xff1a;浮点数取模 符…...

如何commit后更新.gitignore实现push

目录 步骤 1: 更新 .gitignore 文件 步骤 2: 移除已追踪的大文件 步骤 3: 提交更改 步骤 4: 尝试推送 注意事项 如果已经执行了git commit&#xff0c;但后来意识到需要更新.gitignore文件以排除某些不应该被追踪的大文件或目录&#xff0c;并希望在不丢失现有提交记录的情…...

从MySQL迁移到PostgreSQL的完整指南

1.引言 在现代数据库管理中&#xff0c;选择合适的数据库系统对业务的成功至关重要。随着企业数据量的增长和对性能要求的提高&#xff0c;许多公司开始考虑从MySQL迁移到PostgreSQL。这一迁移的主要原因包括以下几个方面&#xff1a; 1.1 性能和扩展性 PostgreSQL以其高性能…...

20250214 随笔 Nginx 负载均衡在数据库中的应用

Nginx 负载均衡在数据库中的应用 在高并发环境下&#xff0c;数据库的性能往往是系统的瓶颈。为了提高数据库的吞吐能力、优化请求分配、减少单点故障&#xff0c;我们可以使用 Nginx 负载均衡 来优化数据库的访问。本文将介绍如何使用 Nginx 进行数据库负载均衡&#xff0c;以…...

从养殖场到科技前沿:YOLOv11+OpenCV精准计数鸡蛋与鸡

前言 谁能想到,鸡蛋和鸡的计数居然能变成一项高科技活儿?想象一下,早上去市场,卖家把鸡蛋摔得稀巴烂,结果鸡蛋滚得到处都是——难道你就得一个个捡回来数?还得小心别弄错?可是,你又不是超人!别担心,科技来帮忙!今天的主角是YOLOv11和OpenCV,它们是计算机视觉领域的…...

【Qt】 Data Visualization

三维数据可视化 三维柱状图三维图的创建程序截图示例代码 三维散点图三维图创建程序截图示例代码 三维曲面图三维图创建程序截图示例代码 Data Visualization 是 Qt 中的一个三维数据可视化模块&#xff0c;可用于绘制三维柱状图、三维散点图和三维曲面。与 Charts 模块类似&am…...

python基础语法

文章目录 字面量定义分类 注释定义分类单行注释多行注释 变量定义 数据类型类型转换定义 案例 标识符定义命名规则内容限定大小写敏感不可使用关键字 命名规范变量的命名规范 运算符数学运算符赋值运算符复合赋值运算符 定义字符串定义方式 字符串拼接语法 字符串格式化语法1字…...

【C++游戏开发-五子棋】

使用C开发五子棋游戏的详细实现方案&#xff0c;涵盖核心逻辑、界面设计和AI对战功能&#xff1a; 1. 项目结构 FiveChess/ ├── include/ │ ├── Board.h // 棋盘类 │ ├── Player.h // 玩家类 │ ├── AI.h // AI类 │ └── Game.h // 游戏主逻辑 ├── src/ …...

C/C++ | 每日一练 (2)

&#x1f4a2;欢迎来到张胤尘的技术站 &#x1f4a5;技术如江河&#xff0c;汇聚众志成。代码似星辰&#xff0c;照亮行征程。开源精神长&#xff0c;传承永不忘。携手共前行&#xff0c;未来更辉煌&#x1f4a5; 文章目录 C/C | 每日一练 (2)题目参考答案封装继承多态虚函数底…...

如何在 VS Code 中快速使用 Copilot 来辅助开发

在日常开发中&#xff0c;编写代码往往是最耗时的环节之一。而 GitHub Copilot&#xff0c;作为一款 AI 编码助手&#xff0c;可以帮助开发者 自动补全代码、生成代码片段&#xff0c;甚至直接编写完整的函数&#xff0c;大幅提升编码效率。那么&#xff0c;如何在 VS Code 中快…...

FFmpeg源码:av_strlcpy函数分析

一、引言 在C/C编程中经常会用到strcpy这个字符串复制函数。strcpy是C/C中的一个标准函数&#xff0c;可以把含有\0结束符的字符串复制到另一个地址空间。但是strcpy不会检查目标数组dst的大小是否足以容纳源字符串src&#xff0c;如果目标数组太小&#xff0c;将会导致缓冲区…...

【生产变更】- 集群中配置SCAN ip的不同端口应用

【生产变更】- 集群中配置SCAN ip的不同端口应用 一、概述二、操作步骤三、故障解决 一、概述 使用非默认端口&#xff08;1521&#xff09;监听scan ip。 二、操作步骤 1、添加11521端口 srvctl add listener -l lis11521 -o /opt/grid/products/11.2.0 -p 11521 srvctl st…...

RabbitMQ 3.12.2:单节点与集群部署实战指南

前言&#xff1a;在当今的分布式系统架构中&#xff0c;消息队列已经成为不可或缺的组件之一。它不仅能够实现服务之间的解耦&#xff0c;还能有效提升系统的可扩展性和可靠性。RabbitMQ 作为一款功能强大且广泛使用的开源消息中间件&#xff0c;凭借其高可用性、灵活的路由策略…...

Node.js技术原理分析系列——如何在Node.js中新增一个内置模块

本文由体验技术团队曹杨毅原创。 Node.js 是一个开源的、跨平台的JavaScript运行时环境&#xff0c;它允许开发者在服务器端运行JavaScript代码。Node.js 是基于Chrome V8引擎构建的&#xff0c;专为高性能、高并发的网络应用而设计&#xff0c;广泛应用于构建服务器端应用程序…...

从低清到4K的魔法:FlashVideo突破高分辨率视频生成计算瓶颈(港大港中文字节)

论文链接&#xff1a;https://arxiv.org/pdf/2502.05179 项目链接&#xff1a;https://github.com/FoundationVision/FlashVideo 亮点直击 提出了 FlashVideo&#xff0c;一种将视频生成解耦为两个目标的方法&#xff1a;提示匹配度和视觉质量。通过在两个阶段分别调整模型规模…...

康耐视CAM-CIC-10MR-10-GC工业相机

康耐视(COGNEX)的工业相机CAM-CIC-10MR-10-GC是CAM-CIC-10MR系列中的一款型号,主要应用于工业自动化检测和高精度视觉系统 基本参数与特性 分辨率与帧率: CAM-CIC-10MR-10-GC属于康耐视CIC系列,具备10MP(1000万像素)的分辨能力,帧率为10fps。该系列相机支持卷帘快门(R…...

解惑Python:一文解决osgeo库安装失败问题

Osgeo&#xff08;Open Source Geospatial Foundation&#xff09;是一个支持开源地理空间数据处理的基金会&#xff0c;我们可以在python中使用“osgeo”库来访问其提供的高效地理空间数据。例如&#xff0c;我们使用该模块提供的GDAL处理栅格数据&#xff0c;使用OGR处理矢量…...

3、树莓派5 安装VNC查看器 开启VNC服务器

在前序文章中&#xff08; 2、树莓派5第一次开机&#xff09;&#xff0c;可以使用三种方式开机&#xff0c;其中使用网线及wifi的方式均需要使用到VNC查看器进行远程桌面控制&#xff0c;本文将介绍如何下载安装并配置及使用VNC查看器及服务器&#xff0c;对前序文章做一些补充…...

Django 创建表时 “__str__ ”方法的使用

在 Django 模型中&#xff0c;__str__ 方法是一个 Python 特殊方法&#xff08;也称为“魔术方法”&#xff09;&#xff0c;用于定义对象的字符串表示形式。它的作用是控制当对象被转换为字符串时&#xff0c;应该返回什么样的内容。 示例&#xff1a; 我在初学ModelForm时尝…...

STM32 CAN过滤器配置和应用方法介绍

目录 概述 一、CAN过滤器核心概念 二、过滤器配置步骤&#xff08;以标准ID为例&#xff09; 三、不同模式的配置示例 四、高级配置技巧 五、调试与问题排查 六、关键计算公式 总结 概述 在STM32微控制器中&#xff0c;CAN过滤器可以配置为标识符屏蔽模式和标识符列表模…...

【第1章:深度学习概览——1.3 深度学习的核心组件与概念解析之神经网络基础】

大家好!今天咱们一头扎进深度学习的神秘领域,好好探索一下其最重要的基石 —— 神经网络。不管你是深度学习的新手小白,还是已经接触过一些基础概念,这篇文章都能助力你更透彻地理解神经网络的原理和运作机制。咱们从最基础的知识入手,一步步揭开神经网络的神秘面纱! 一、…...

Python中如何进行数据库连接?

在 Python 中进行数据库连接&#xff0c;不同的数据库需要使用不同的库。下面分别介绍几种常见数据库&#xff08;SQLite、MySQL、PostgreSQL&#xff09;的连接方法。 1. 连接 SQLite 数据库 SQLite 是一种轻量级的嵌入式数据库&#xff0c;Python 标准库中自带了sqlite3模块…...

解析 WebGPU 中 device.createBuffer 的参数意义

在 WebGPU 开发里&#xff0c;device.createBuffer 方法扮演着至关重要的角色&#xff0c;它用于创建一个 GPU 缓冲区对象&#xff0c;这个对象能够存储顶点数据、索引数据、统一数据等。下面我们就来详细剖析该方法各个参数的意义。 1. size&#xff1a;决定缓冲区容量 size …...

PLC的集成RAM,存储器卡,用户程序存储空间,数据存储容量分别指的什么,有什么关联?

1. 集成RAM 定义&#xff1a;集成RAM&#xff08;随机存取存储器&#xff09;是PLC内部的高速易失性存储器&#xff0c;用于临时存储运行时的数据&#xff08;如输入/输出状态、中间变量、计数器/定时器的当前值等&#xff09;。 特点&#xff1a; 易失性&#xff1a;断电后数…...

BFS-FloodFill 算法 解决最短路问题 多源 解决拓扑排序

文章目录 一、FloodFill 算法[733. 图像渲染](https://leetcode.cn/problems/flood-fill/description/)2.思路3.代码 [200. 岛屿数量](https://leetcode.cn/problems/number-of-islands/description/)2.思路3.代码 [LCR 105. 岛屿的最大面积](https://leetcode.cn/problems/ZL6…...

USB2.03.0接口区分usb top工具使用

一. USB2.0 & 3.0接口支持区分 1.1. 颜色判断 USB接口的颜色并不是判断版本的可靠标准&#xff0c;但根据行业常见规范分析如下&#xff1a; USB接口颜色与版本对照表&#xff1a; 接口颜色常见版本内部触点数量传输速度黑色USB2.04触点480 Mbps (60 MB/s)白色USB2.0(多…...