vs2022
- 1.函数、数组
- 2.操作符
- 3.常见关键字
- 4.define定义常量和宏
- 5.指针
- 6.结构体
- 7.分支语句
- 9.循环语句
- 10.练习
- (1)计算n的阶乘。
- (2)计算1!+2!+3!+...+10!。
- (3)在一个有序数组中查找具体的某个数字n。编写int binsearch(int x, int v, int n);功能:在v[0]<=v[1]<=v[2]<= ....<=v[n-1]的数组中查找x。
- (4)编写代码,演示多个字符从两端移动,向中间汇聚。
- (5)编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则提示登录成,如果三次均输入错误,则退出程序。
- (6)猜数字:程序自动产生1-100的数,猜测这个数字。猜错:告知猜大、小,直至猜对。除非退出,游戏可持续。
- (7)最大公约数。
- (8)1000-2000的闰年。
- (9)100-200的素数。
- 11.goto语句
学习视频: b站比特c语言就业班
1.函数、数组
函数
数组 :用下标访问,下标从0开始
2.操作符
算术操作符:+ - * / %(取模)
移位操作符:>> <<
位操作符:&(按位与) |(按位或) ^(按位异或)
赋值操作符:= += -= *= ^= |= >>= <<=
单目操作符:只有一个操作数
~:二进制 按位取反
++
(类型):强制类型转换
逻辑操作符:&& ||
条件操作符:三目操作符
exp1 ? exp2 : exp3:exp1成立—>exp2,exp1不成立—>exp3
3.常见关键字
C语言提供,关键字不能用户创建,不能作为变量名
计算机的数据存储位置:靠前快、贵
内存:更小
高数缓存:10+M
内存:8-16G
硬盘:500G+
网盘:例如百度网盘
typedef:类型重命名
static
(1)局部变量
(2)全局变量
(3)函数
4.define定义常量和宏
define是预处理指令,不是关键字
1.define定义常量
2.define定义宏
5.指针
计算机:32/64位:32/64根地址线-物理线-通电-0/1
内存单元:字节
6.结构体
7.分支语句
一:if-else
if:是一种分支语句,既可以单分支,又可以多分支
语法结构:表达式为真,语句执行
代码比较:最好 将常量放在左边
if(表达式)
语句;
或者:表达式为假,else执行
if(表达式)
语句1;
else
语句2;
多分支:
if(表达式)
语句1;
else if(表达式)
语句2;
else
语句3;
执行多条语句:
if(表达式){
语句列表;
}
else if(表达式){
语句列表;
}
else{
语句列表;
}
else匹配:匹配最近的if
二:switch
用于多分支
break:跳出自己所在的switch语句
int、long、char都可以,不能是float
switch(整型表达式){
语句项;
}
case 整形 常量表达式
字符也属于整形:字符以ASCII存储
若匹配了某case,default前没任何中断,default也需执行。
例:如下,func(1)返回0
vs2022
F10:逐过程
F11:逐语句
先F10再F11
9.循环语句
一:while:先判断再执行
语法结构
while(表达式)
循环语句/代码块;
getchar与putchar
报错问题
参考:C6064:缺少“scanf_s”的整型参数(对应于转换说明符“2”
scanf不读取空格
gets可以读取空格
二:for
1.控制变量最好:前闭后开
2.判断部分省略:恒为真:死循环
3.多个循环变量控制
语法
for(表达式1(初始化);表达式2(判断);表达式3(调整))
循环语句;
break和continue
三:do-while:先执行再判断
语法结构:
do
循环语句;
while(表达式);
10.练习
(1)计算n的阶乘。
int i = 0;
printf("计算的n:");
scanf_s("%d",&i);
int sum = 1;
for(;1<=i;i--){
sum = sum*i;
}
printf("%d\n",sum);
(2)计算1!+2!+3!+…+10!。
int i = 1;
int sum2 = 0;
for (; i < 11;i++) {
int j = i;
int sum1 = 1;
for (; 1 <= j;j--) {
sum1 = sum1 * j;
}
sum2 = sum1 + sum2;
}
printf("和:%d\n", sum2);
//优化算法
int i = 1;
int n = 10;
int sum1 = 1;
int sum2 = 0;
for (; i<=n;i++) {
sum1 *= i;
//sum1=i*sum1,9!=9*8!
sum2 += sum1;
}
printf("和:%d\n", sum2);
(3)在一个有序数组中查找具体的某个数字n。编写int binsearch(int x, int v, int n);功能:在v[0]<=v[1]<=v[2]<= …<=v[n-1]的数组中查找x。
折半(二分)查找
由中间值mid判断 左右部分 相对于 查找元素k 的大小,一次性排除一半数值
//折半(二分)查找
int main() {
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//目标数值k
int k = 0;
scanf_s("%d",&k);
//数组元素个数
int sz = sizeof(arr) / sizeof(arr[0]);
//下标
int left = 0;
int right = sz - 1;
//查找
while (left <= right) {
int mid = (left + right) / 2;
if (arr[mid] < k)
left = mid + 1;
else if (arr[mid] > k)
right = mid - 1;
else {
printf("find!it;%d\n", mid);
break;
}
}
if (left > right)
printf("not found!");
return 0;
}
(4)编写代码,演示多个字符从两端移动,向中间汇聚。
#include <stdio.h>
#include <string.h>//strlen的头文件
#include <windows.h>//Sleep的头文件
int main() {
//编写代码,演示多个字符从两端移动,向中间汇聚
char arr1[] = "welcome!";
char arr2[] = "#######!";
int left = 0;
int right = strlen(arr1) - 1;
while (left <= right) {
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf("%s\n", arr2);
Sleep(1000);//单位毫秒:1000ms=1s
system("cls");//清屏
left += 1;
right -= 1;
}
printf("%s\n", arr2);
return 0;
}
(5)编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则提示登录成,如果三次均输入错误,则退出程序。
strcmp:比较对应位置的ASCII,出现不相等/比较完
strcmp(字符串1,字符串2);
<0:1<2
0:1=2
>0:1>2
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>//strcmp的头文件
int main() {
int i = 0;
char passwd[20] = { 0 };
for (; i < 3; i++) {
printf("key:");
//数组是指针,不加取地址符,但必须在scanf下使用
scanf("%s", passwd);
//scanf_s("%s", &passwd, 20);
//两个字符串比较不可以passwd == "123456":比较的是两字符串首字符的地址。应该用strcmp
if (strcmp(passwd, "123456") == 0) {
printf("succes!");
break;
}
else if (strcmp(passwd, "123456") != 0 && i < 2)
printf("again\n");
}
if (i == 3)
printf("error!");
return 0;
}
(6)猜数字:程序自动产生1-100的数,猜测这个数字。猜错:告知猜大、小,直至猜对。除非退出,游戏可持续。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>//srand、rand的头文件
#include <time.h>//time的头文件
//菜单
void manu() {
printf("##################\n");
printf("#### 0.exit ####\n");
printf("#### 1.play ####\n");
printf("##################\n");
}
//游戏
void game() {
//生产随机数
//rand:生成数:0—RAND_MAX(0x7ff:16进制,32767)之间,用srand改变其生产起点
//模100的余数:0-99,+1,0-100
int ret = rand() % 100 + 1;
//猜数字
int guess = 0;
printf("猜:");
while (1) {
scanf("%d", &guess);
if (guess < ret) {
printf("小\n");
printf("再猜:");
}
else if (guess > ret) {
printf("大\n");
printf("再猜:");
}
else {
printf("YEAH! %d\n",ret);
break;
}
}
}
int main() {
int input = 0;
//在调用rand的之前调用srand设置随机数的生成,需要unsigned int类型
//时间戳:随时变化的值,time()获取,返回time-t类型,本质上也是(64位)整形
srand((unsigned int)time(NULL));//利用time设置一个随机的起点
do {
manu();//打印菜单
printf("选择:");
scanf("%d",&input);
switch (input) {
case 1:
printf("begin!\n");
game();
break;
case 0:
printf("bye!\n");
break;
default:
printf("error!\n");
break;
}
} while (input);
return 0;
}
(7)最大公约数。
int main(){
//求最大公约数:辗转相除
printf("所求两数:\n");
int m = 0;
int n = 0;
scanf("%d%d",&m,&n);
int t = 0;
while (m%n) {
t = m % n;
m = n;
n = t;
}
printf("最大公约数:%d",t);
return 0;
}
(8)1000-2000的闰年。
int main(){
int y = 0;
int count = 0;
printf("闰年有:\n");
for (y = 1000; y <= 2000;y++) {
//闰年判断;
1.被4整除,不被100整除
//if (y % 4 == 0) {
// if (y % 100 != 0) {
// printf("%d ", y);
// count++;
// }
//}
2.被400整除
//if (y % 400 == 0){
// printf("%d ", y);
// count++;
//}
//1+2
if (((y%4==0) && (y%100!=0)) || (y%400==0)) {
printf("%d ", y);
count++;
}
}
printf("\n共:%d",count);
return 0;
}
(9)100-200的素数。
int main() {
//素数=质数:只能被1和其本身整除
int i = 0;
int count = 0;
for (i = 100; i <= 200;i++) {
int j = 0;
for (j = 2; j < i;j++) {
if (i % j == 0) {
break;//跳出所在for循环
}
}
if (i == j) {
count++;
printf("%d ", i);
}
}
printf("\n共:%d", count);
return 0;
}
开平方优化
int main() {
//优化,缩短程序运算
//sqrt:开平方函数,库函数
//若存在m = a*b,则有 a或b < m开平方
//既:若j(2,m开平方)内找到了a/b,则m不是素数
//素数=质数:只能被1和其本身整除
int i = 0;
int count = 0;
for (i = 100; i <= 200; i++)
{
int flag = 1;
int j = 0;
for (j = 2; j <= sqrt(i); j++)
{
if (i % j == 0)
{
flag = 0;
break;//跳出所在for循环
}
}
if (flag == 1) {
count++;
printf("%d ", i);
}
}
printf("\n共:%d", count);
return 0;
}
11.goto语句
没必要使用,只试用跳出多层循环情况:只能在其所在函数内跳转,不可跨函数
定时关机
(1)goto
int main() {
//关机
//cmd命令行:
// 关机:shutdown -s -t 数字(单位:秒)
// 取消关机:shutdown -a
//system():执行系统命令,头文件stdlib.h
char input[20] = { 0 };
system("shutdown -s -t 360");
again:
printf("电脑将在6分钟内关机!输入:哈哈,取消关机。\n");
scanf("%s",&input);
if (strcmp(input,"哈哈") == 0) {
//字符串之间不能==比较
//用strcmp()比较,相等返回0,头文件string.h
system("shutdown -a");
}
else {
goto again;
}
return 0;
}
(2)while循环
int main() {
//关机
//cmd命令行:
// 关机:shutdown -s -t 数字(单位:秒)
// 取消关机:shutdown -a
//system():执行系统命令,头文件stdlib.h
char input[20] = { 0 };
system("shutdown -s -t 360");
while(1){
printf("电脑将在6分钟内关机!输入:哈哈,取消关机。\n");
scanf("%s", &input);
if (strcmp(input, "哈哈") == 0) {
//字符串之间不能==比较
//用strcmp()比较,相等返回0,头文件string.h
system("shutdown -a");
break;
}
}
return 0;
}
(3)发行版本