目录
可以说是零基础了QWQ,之前大一的有学过c语言(已经忘光了),当时就没怎么学会,可以说是没有基础(就是循环语句都看不明白的那种),现在大三考研er,重拾c语言(希望可以变强),这篇文章主要会记录,我考研过程中我C语言的学习经历,学习过程中学习到的知识和碰到的各种问题都会记录下来。(之前没打算写博客)本人用的vs2017
这是基本框架,
#include<stdio.h>是头文件
int main()是主函数
return是函数的返回值,根据函数类型的不同,返回的值也是不同的。
简单梳理一下C语言的知识结构
数据类型:char字符型,int整型,float浮点型,double双精度浮点型,
字符串函数:strlen(字符串长度),strcmp(比较字符串),
循环体:for,while,if,
数组:a[]
指针:*a
结构体:struct
-2021/10/16
比较两个数的大小主要代码
#include<stdio.h>
int MAX(int x, int y)
{
if (x > y)
return x;
else
return y;
{
}
}
int main()
{
int a = 0;
int b = 0;
scanf_s("%d %d", &a, &b);
int m=MAX(a, b);
printf("%d\n", m);
return 0;
}
// #define _CRT_SECURE_NO_WARNINGS 1(把scanf_s改成scanf等)
分支语句(if,switch)
1.if(简单使用)
int main()
{
int age = 0;
scanf("%d", &age);
if (age >= 18)
printf("chengnian");
else
{
printf("meichengnian");
}
}
判断奇数偶数
int main()
{
int num;
scanf("%d", &num);
if (num % 2 == 1)
printf("为奇数\n");
else
{
printf("为偶数\n");
}
return 0;
}
输出一百以内的奇数
int main()
{
int a;
for (a = 1; a < 101; a++)
if (a % 2 ==1)
printf("%d\n", a);
return 0;
}
2.switch(简单使用)
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1 :
printf("星期一\n" );
break;
case 2 :
printf("星期二\n" );
break;
case 3:
printf("星期三\n");
break;
case 4:
printf("星期四\n");
break;
case 5:
printf("星期五\n");
break;
case 6:
printf("星期六\n");
break;
case 7:
printf("星期天\n");
break;
default:
break;
}
return 0;
}
判断m,n的值
int main()
{
int n = 1;
int m = 2;
switch (n)
{
case 1:m++;//3
case 2:n++;//2
case 3:
switch (n)
{
case 1:
n++;//n=2不执行case1直接case2
case 2:m++; n++;//m=4,n=3
break;
default:
break;
}
case 4:m++;//m=5
break;
default:
break;
}
printf("m= %d,n= %d", m, n);
return 0;
}
结果如图:
循环语句
1.while(简单使用)
int main()
{
while (1)
{
printf("爱你\n");
}
return 0;
}
结果
无限循环爱你。
打印一到一百
int main()
{
int a = 1;
while (a <= 100)
{
printf("%d\n",a);
a++;
}
return 0;
}
结果
在while循环中,continue用于,跳过本次循环也就是continue后面的代码
在while循环中,break用于永久终止循环
2021/10/17
接while
getchar的简单应用
int main()
{
char password[20] = { 0 };
printf("请输入密码:");
scanf("%s", &password);
printf("请确认密码(Y/N):");
getchar();//处理\n
int a = getchar();
if (a != 'Y')
{
printf("请重新输入密码:");
scanf("%s", &password);
}
else
{
printf("密码确认成功!");
}
return 0;
}
这段代码碰到这种密码7651 ab会失效
所以进行改进
int main()
{
char password[20] = { 0 };
printf("请输入密码:");
scanf("%s", &password);
printf("请确认密码(Y/N):");
//getchar();//处理\n
int b = 0;
while ((b = getchar() !='\n'))//清理缓冲区的内容
{
;
}
int a = getchar();
if (a != 'Y')
{
printf("请重新输入密码:");
scanf("%s", &password);
}
else
{
printf("密码确认成功!");
}
return 0;
}
这种就🆗啦
2.for
3.do while
int main()
{
int a = 0;
do
{
printf("%d",a);
a++;
} while (a<=10);
return 0;
}
结果如图
循环体的应用
求1到n的阶乘
int main()
{
int a = 0;
int n = 0;
int sum = 1;
scanf("%d", &n);
for (a = 1; a <= n; a++)
sum = sum * a;
printf("%d",sum);
return 0;
}
结果如图
计算1!+2!+.....+10!
int main()
{
int a = 0;
int n = 0;
int sum1 = 1;
int sum2 = 0;
for (n = 1; n <=4; n++)
{
sum1 = 1;//把sum1的值初始化为1
for (a = 1; a <= n; a++)
sum1 = sum1 * a;
sum2 = sum2 + sum1;
}
printf("%d",sum2);
return 0;
}
改进代码
int main()
{
int a = 0;
int n = 0;
int sum1 = 1;
int sum2 = 0;
for (n = 1; n <=4; n++)
{
sum1 = sum1 * n;
sum2 = sum2 + sum1;
}
printf("%d",sum2);
return 0;
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int a = 7;//要查找的元素
//在arr 有序的数组中查找a
int sz = sizeof(arr) / sizeof(arr[0]);//计算整个元素的大小/一个元素的尺寸=元素的个数
int left = 0;
int right = sz - 1;
while (left <= right)
{
int b = (left + right) / 2;//计算平均值
if (arr[b] < a)
{
left = b + 1;
}
else if (arr[b] > a)
{
right = b - 1;
}
else
{
printf("找到了:下标是%d\n", b);
break;
}
if (left > right)
{
printf("找不到\n");
}
}
return 0;
}
#include<string.h>
int main()
{
char arr1[] = "Welcome come to jingda";
char arr2[] = "######################";
int left = 0;//左边下标
int rignht = strlen(arr1) - 1;//右边下标
while (left<=rignht)
{
arr2[left] = arr1[left];
arr2[rignht] = arr1[rignht];
printf("%s\n", arr2);
left++;
rignht--;
}
return 0;
}
结果如图
int main()//假设密码为'123456'
{
char password[20] = {0};
int i = 0;
for ( i = 0; i <3; i++)
{
printf("请输入密码:");
scanf("%s", &password);
if (strcmp(password,"123456")==0)//==0则登录成功
{
printf("登录成功\n");
break;
}
}
if (i==3)
{
printf("退出登录\n");
}
return 0;
}
猜字游戏
会自动产生一到一百的随机数,然后猜字
#include<stdlib.h>
#include<time.h>
void menu()
{
printf("********************************************\n");
printf("**********1.palay***************************\n");
printf("**********0.exit****************************\n");
printf("********************************************\n");
}
void game()
{
//猜数字游戏的实现
//1.生成随机数
//引用头文件#include<stdlib.h>然后使用rand函数,范围在0-32767,
//再用rand函数调用随机生成器之前要用srand函数来设置rand函数
int a = rand()%100+1;//%100数是0-99在加1即可
//printf("%d\n", a);
//2.猜数字
int b;
while (1)
{
printf("请猜数字:>");
scanf("%d", &b);
if (b<a)
{
printf("猜小了!\n");
}
else if (b>a)
{
printf("猜大了!\n");
}
else
{
printf("恭喜你,猜对了!\n");
}
}
}
int main()
{
do
{ srand((unsigned int)time(NULL));//用时间戳来随机生成一个srand用的值,头文件time.h,需要unsigned int数据类型
int input;
menu();//打印菜单
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,重新选择\n");
break;
}
} while (true);
return 0;
}
比较三个数的大小
int main()
{
int a = 0;
int b = 0;
int c = 0;
scanf("%d %d %d", &a, &b, &c);
if (a<b)
{
int x = a;
a = b;
b = x;
}
if (a<c)
{
int y = a;
a = c;
c = y;
}
if (b<c)
{
int z = b;
b = c;
c = z;
}
printf("%d %d %d", a, b, c);
return 0;
}
常规方法
int main()
{
int a;
int b;
scanf("%d %d", &a, &b);
int c = 0;//c设为最大公约数
if (a > b)
{
c = b;
}
if (a < b)
{
c = a;
}//设最大公约数为ab的较小值
while (1)
{
if (a%c == 0 && b%c == 0)
{
printf("最大公约数为:%d\n", c);
break;
}
c--;
}
return 0;
}
辗转相除法
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
int c;
while (c = a % b)
{
a = b;
b = c;
}
printf("%d\n", b);
return 0;
}
2021/10/18
续-求1000到2000之间的闰年
int main()
{
int year = 0;
for (year=1000 ; year<= 2000; year++)//判断是不是闰年,1.被4整除不被100整除,2.能被400整除
{
if (year%4==0)
{
if (year % 100 != 0)
{
printf("%d\n", year);
}
}
if (year%400==0)
{
printf("%d\n", year);
}
}
return 0;
}
打印100到200之间的素数
int main()
{
int a = 0;
for ( a = 100; a <= 200; a++)//判断素数,2到a-1之间的数,看能不能整除
{
int j = 0;
for ( j = 2; j < a; j++)
{
if (a%j==0)
{
break;
}
}
if (a==j)
{
printf("%d ", a); //素数
}
}
return 0;
}
关机小程序
(这段代码有点奇怪,能运行但有bug)
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
char input[30] = { 0 };
system("shutdown -s -t 60");//system()用来执行系统命令
while (1)
{
printf("请注意你的电脑在一分钟内关机,叫爸爸则取消关机\n");
scanf("%s", input);
if (strcmp(input, "爸爸") == 0);
{
system("shutdown -a");
}
}
return 0;
}
(这段明明一模一样,无bug)
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
//关机
//C语言提供了一个函数:system()- 执行系统命令的
char input[20] = { 0 };//存放输入的信息
system("shutdown -s -t 60");//system - stdlib.h
while (1)
{
printf("请注意,你的电脑在1分钟内关机,叫爸爸就取消关机\n");
scanf("%s", input);
//string.h
if (strcmp(input, "爸爸") == 0)//两个字符串比较是不能使用==的,应该使用strcmp() string compare
{
system("shutdown -a");
break;
}
}
return 0;
}
函数
函数是什么
c语言中函数的分类
1. 库函数
(这个网站可以查找库函数)
cplusplus.com - The C++ Resources Network
2.自定义函数
写一个函数,可以交换两个数的内容
void swap(int* pa,int* pb)//函数返回类型的地方加void,表示这个函数不返回任何值(无参数)就是没有return
{
int z = 0;
z = *pa;
*pa = *pb;
*pb = z;
}
int main()
{
int a = 10;
int b = 20;
printf("交换前:a=%d,b=%d\n", a, b);
swap(&a,&b);
printf("交换后:a=%d,b=%d\n", a, b);
return 0;
}
函数调用
习题
写一个函数,判断是不是素数
int is_prime(int x)
{
int j = 0;
for (j = 2; j < x; j++)
{
if (x % j == 0)
return 0;
}
return 1;
}
int main()
{
int i = 0;
for (i = 100; i <= 200; i++)
{
if (is_prime(i) == 1)//判断是不是素数的函数名
{
printf("%d", i);
}
}
return 0;
}
判断是不是闰年
//is_leap_year
//判断是闰年返回1
//不是闰年返回2
int is_leap_year(int a)
{
int b = 0;
if (a % 4 == 0&& a%100!=0 || a%400==0)
{
return 1;
}
return 0;
}
int main()
{
int y = 0;
for ( y = 1000; y <=2000; y++)
{
if (is_leap_year(y) == 1)
{
printf("%d\n", y);
}
}
return 0;
}
2021/10/23
习题
用二分查找(又是我的代码不行,老师的行,我吐了)
int binary_search(int a[], int k, int s)
{
int left = 0;
int right = s - 1;
while (left <= right)
{
int mid = (left + right) / 2;
if (a[mid] > k)
{
right = mid - 1;
}
else if (a[mid] < k)
{
left = mid + 1;
}
else
{
return mid;
}
}
return -1;//找不到了
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int key = 7;
//找到了就返回找到的位置的下标
//找不到返回-1
//数组arr传参,实际传递的不是数组的本身
//仅仅传过去了数组首元素的地址
int sz = sizeof(arr) / sizeof(arr[0]);
int ret = binary_search(arr, key, sz);
if (-1 == ret)
{
printf("找不到\n");
}
else
{
printf("找到了,下标是:%d\n", ret);
}
return 0;
}
这是我的
int binary_search(int a[], int k, int s)
{
int right = s - 1;
int left = 0;
int mid = (left = right) / 2;
while (left <= right)
{
if (a[mid] > k)
{
right = mid - 1;
}
else if (a[mid] < k)
{
left = mid + 1;
}
else
{
return mid;
}
}
return -1;
}
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,10 };
int key = 8;//找到了就返回找到位置的下标,找不到返回-1
int sz = sizeof(arr) / sizeof(arr[0]);//数组的总大小除数组一个元素的大小=元素的个数
int ret = binary_search(arr,key,sz);//ret是下标的意思
if (ret == -1)
{
printf("找不到\n");
}
else
{
printf("找到了,下标是%d\n",ret);
}
return 0;
}
2021/10/28
链式访问
//链式访问
int main()
{
printf("%d", printf("%d", printf("%d", 43)));
return 0;
}
函数的声明
函数递归
forexmlp
void print(unsigned int n)
{
if (n>9)
{
print(n / 10);
}
printf("%d ", n % 10);
}
int main()
{
unsigned int num = 0;
scanf("%u", &num);
print(num);
return 0;
}
就是模拟一个函数实现strlen函数的功能
这是有变量的
int my_strlen(char* str)
{
int count = 0;
while(*str!='\0')
{
count++;
str++;
}
return count;
}
int main()
{
char arr[] = "lcx";
printf("%d\n", my_strlen(arr));
return 0;
}
无变量,递归的方法
int my_strlen(char* str)
{
if (*str!='\0')
{
return 1 + my_strlen(str+1);
}
else
{
return 0;
}
}
int main()
{
char arr[] = "lcx";
printf("%d\n", my_strlen(arr));
return 0;
}
代码解析
然后开始返回