编程成长之路

我们都是站在父母的肩上去看他们不曾看到的风景!加油!
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

王道 C语言督学营--初级阶段

Posted on 2023-06-14 01:17  来颗维C  阅读(117)  评论(0编辑  收藏  举报

1-数据类型-常量-变量

1.1符号常量

#include<stdio.h>

//1-符号常量
#define PI 3+2  //不用在最后加分号
int main()
{
	int i = PI * 2;  //i就是一个整形变量 变量i是4个字节
	printf("i=%d\n", i);
	printf("i size=%d\n", sizeof(i)); //sizeof用来计算变量i的大小

	return 0;
}
//最终输出结果是7,原因是符号常量PI是直接替换的效果,因此不可以写成PI=8

1.2float-浮点型常量

	//浮点型常量  
/* 表示方法:
	小数形式:0.123
	指数形式:3e-3(为3*10-3次方 即0.003)
注意:字母e(或E)之前必须有数字,且e后面的指数必须为整数.
正确示例:1e3  1.8e-3  -123e-6
错误示例:e3 2.1e3.5 .e3

通过float来定义浮点型变量 f占用4个字节空间大小
*/
#include<stdio.h>

int main()
{
	float f = 3e-3;
	printf("f=%f\n", f);//字符型使用%f来进行输出

	return 0;
}

1.3字符型数据

使用单引号括起来的一个字符是字符型常量,且只能包含一个字符! 例如:'a' 'A' '1' ' '是正确的字符型常量,而'abc' "a" " "是错误的字符型常量

转义字符:\n 表示换行 \b 表示退格 \ 表示反斜杠

1.4字符变量

/*字符型变量  大写字符转换小写字符*/
#include<stdio.h>

int main()
{
	char c = 'A';
	char b = 'a';
	printf("%c\n", c + 32);//大写转换成小写字符 以字符形式输出
	printf("%c\n", b - 32);//小写转换成大写字符
	printf("%d\n", c);//以数值形式输出


	return 0;
}

1.5字符串型常量

字符串型常量是由一对双引号括起来的字符序列.例如'a'是字符型常量,"a"是字符串常量.两者是不同的 在C语言中规定在每个字符串常量的结尾加一个字符结束标志,以便系统据此判断字符串是否结束.C语言规定以"\0"作为字符串结束标志.因此在计算字符串占用的内存单元时要加上\0.例如"CHINA"占用的不是5个字符,而是6个字符,大小为6个字节

2-混合运算-printf讲解

2.1 混合运算-强制类型转换场景

整数进行触发运算时,如果运算结果为小数,那么存储浮点数时一定要进行强制类型转换

#include<stdio.h>

//强制类型转换
int main()
{
	int i = 5;
	float f = i / 2;//以整数输出  这里做的是整型运算,因为左右操作数都是整型
	float k = (float)i/2;//强制类型转换 以小数输出

	printf("%f\n", f);
	printf("%f\n", k);

	return 0;
}

2.2 printf函数的介绍

printf函数可以输出各种类型的数据,包括整型、浮点型、字符串型等,实际原理是printf函数将这些类型的数据格式化为字符串后,放入标准输出缓冲区,然后将结果显示在屏幕上

语法:

#include<stdio.h>
/* %c:输出字符  %d:输出带符号的整数  %s:输出一串字符  %f:输出浮点数即小数*/

//语法:int printf(const char* format, ...);

int main()
{
	int age = 21;
	printf("Hello %s,you are %d years old\n", "Bob", age);
	//%s表示在该位置插入首个参数(一个字符串),%d表示第二个参数(一个整数)应该放在那里.
	int i = 1001;//第一次定义了i

	float f = 96.3;
	printf("student number = %3d,score = %5.2f\n", i, f);//3d表示输出结果占三个空格
	
	i = 100;//第二次不用定义i直接使用第一次定义的就可以
	f = 98.21;
	printf("student number = %-3d,score = %5.2f", i, f);//.2表示小数点后保留两位 -3d表示向左对齐三个空格

	return 0;
}

3-整型进制转换

/*在计算机中,1字节(byte)为8位(bbit),1位即二进制的1位,它存储0和1,int型常量的大小是4字节,即32位   

二进制 0和1  转八进制(每三个数为一位)   

十进制 0-9  123 转十六进制 123/16  =7..11(11在十六进制里面就是b)=7b  就是用这个十进制数除16  转八进制就除八

八进制 0-7   转二进制 例如:173 =1*8*8+7*8+3=64+56+3=123

十六进制0-9 a-f

1KB = 1024字节(byte)
1MB = 1024KB
1GB = 104MB

*/
#include<stdio.h>

int main()
{
	int i = 123;//一般赋值都是十进制 八进制 十六进制 没有二进制一说
//int i = 0123;//八进制赋值
	//int i = 0x7b;//十六进制赋值
	printf("%d\n", i);//以十进制输出 化为二进制使用短除法(除2)
	printf("八进制=%o\n", i);//一八进制输出
	printf("十六进制=%x\n", i);//一十六进制输出


	return 0;
}
//为什么显示结果为7b 00 00 00 呢? 原因是英特尔的CPU采用了小端方式进行数据存储,因此低位在前,高位在后

4-scanf函数的标准输入

scanf函数的原理

/*scanf函数读取标准输入 scanf %d %f 发现里边有\n 空格,忽略
   scanf %c 不忽略内容
 */

#include<stdio.h>
#pragma warning(disable:4996)

//scanf用来读取标准输入,scanf把标准输入内的内容,需要放到某个变量空间里,因此变量必须取地址
int main()
{
	int i;
	char c;
    float f;

	scanf("%d", &i);  //一定要取地址
	printf("i=%d\n", i);
	
	rewind(stdin);//清空标准输入缓冲区写在两个scanf函数之间  如果不写该函数的话在执行结果时控制台直接输出两个结果 在visualStdio2022环境中将fflush改成rewind
	//fflush(stdin);  //清除标准输入缓冲区  在CMakeLists环境中使用,在visaolstdio环境不起作用

	scanf("%c", &c);//如果没有写rewind(stdin)函数,这一步就会阻塞
	printf("c=%c\n", c);
    
    scanf("%f", &f);
	printf("f=%f", f);

	return 0;
}

出现如下的执行结果是没有将上面的rewind(stdin)函数打开,此时scanf("%c",&c)会阻塞,原因是我们向标准输入缓冲区中放入字符为'20\n',输入'\n'(回车)后,scanf函数才开始匹配,scanf函数中的%d匹配整数20,然后放入变量i中,接着打印输出,这是'\n'仍然在标准输入缓冲区(stdin)内,如果第二个scanf函数为scanf("%d",&i),那么依然会发生阻塞,因为scanf函数在读取整型数、浮点数、字符串时会忽略\n(回车)、空格等字符(忽略是指scanf函数执行时会首先删除这些字符,然后在阻塞).scanf函数匹配一个字符时,会在缓冲区删除对应的字符.因为在执行scanf("%c",&c)语句时,不会忽略任何字符,所以scanf("%c",&c)读取了还在缓冲区中残留的'\n'.总的来说就是%d %f输出是不用写rewind(stdin)函数会阻塞 而用%c输入时要加rewind(stdin)函数

image-20230615135333566

scanf混合输入多种数据局类型

#include<stdio.h>
#pragma warning(disable:4996)
//scanf一次读取多种数据类型
int main()
{
	int i, ret;
	float f;
	char c;
	ret = scanf("%d %c%f", &i, &c, &f); // ret是scanf匹配成功的个数
	printf("i=%d,c=%c,f=%5.2f\n", i, c,f);


	return 0;
}

5-运算符与表达式

5-1 算术运算符与关系运算符的使用

#include<stdio.h>

int main()
{
	int a;
	while(scanf("%d",&a))
	{
		if (3 < a && a < 10)//a大于3同时a小于10要这样写
		{
			printf("a is between 3 and 10\n");
		}
		else 
		{
			printf("a is not between 3 and 10\n");
		}
	}
	


	return 0;
}

5-2 逻辑运算符与赋值运算符,求字节运算符

#include<stdio.h>
#include<stdlib.h>
#pragma warning(disable:4996)

//判断闰年
int main()
{
	int year;
	while(1)
	{
		printf("请输入你要查询的年份:\n");
		scanf("%d", &year);
		if(year%4==0&&year%100!=0 ||year%400==0)
		{
			printf("%d is lead year\n",year);
		}
		else
		{
			printf("%d is not lead year\n",year);
		}
	}


	return 0; 
}


短路运算

#include<stdio.h>
#include<stdlib.h>

//逻辑与和逻辑或  短路运算
int main()
{
	int i = 0; // 0 表示假 1表示真
	i&& printf("you can't see me !\n");//短路运算 :当i为假时,不会执行逻辑与后的表达式,称为短路运算 

	i = 0;
	i || printf("you can see me !\n");
	
	//相当于if判断条件的真假
	/*if(i)
	{
		printf("you can't see me !\n");
	}
	else 
	{
		
	}*/



	return 0;
}

加后赋值与乘后赋值运算符使用

#include<stdio.h>


//加后赋值与乘后赋值用法
int main()
{
	int a = 1, b = 2;
	a += 3; //a = a + 3;  //正确写法
	b *= 5; // b = b*5;
	//b + 2 = a;// 错误写法
	printf("a = %d\n", a);
	printf("b = %d\n", b);


	return 0;
}

求字节运算符

#include<stdio.h>
#include<stdlib.h>

//sizeof实际是一个运算法,很多人会将它认为是函数 他不是函数
int mian()
{
	int i;
	printf("i is %d\n", sizeof(i));


	return 0;
}

6选择--循环

if -else语句

#include<stdio.h>
#include<stdlib.h>


int main()
{
	int i;

	while(1)
	{
		scanf("%d", &i);
		if(i>0)//良好的编程习惯,在if下边使用大括号 让代码更加的清晰
		{
			printf("i is bigger than 0\n");
		}
		else
		{
			printf("i is not bigger than 0\n");
		}
	}



	return  0;
}

while、for循环

#include<stdio.h>

//while循环,先循环在执行语句
int main()
{
	int i = 1;
	 int sum = 0;//计算从1-100的和
	while(i<=100)
	{
		sum += i; //或者sum = sum + i;
		i++; //等价于i = i + 1  没有这一步就会进入死循环了
	}
	printf("sum = %d\n", sum);


	return 0;
}
#include<stdio.h>
//for循环

int main()
{
	int i, sum;
    //初始化
	for(i = 1;i<=100;i++)//相比while循环for循环在一条语句内完成初始化  for循环的好处是不会让编程者忘记i++这一步操作从而忘记表达式二i<=100进行假的操作
	{
		sum += i;//等价于sum = sum + i
	}
	printf("sum = %d\n", sum);

	return 0;
}
//使用for循环还是使用while循环根据个人编程喜欢和解决问题的效率来选择
#include<stdio.h>


//continue语句的作用:结束本次循环,即跳过循环体中下面尚未执行的语句,接着是否进行下一次循环的判断


//求1-100的奇数和
int main()
{
	int i, sum = 0;
		for(i = 0;i<=100;i++)//在for后面加分号不会死循环,会结果不对
		{
			if(i%2==0)
			{
				continue;//continue下面的语句不会得到执行 直接跳出循环体 直接执行printf函数
			}
			sum = sum + i;
		}
		printf("sum=%d\n", sum);


	return 0;
}

break语句

/*break语句的作用是结束整个循环过程,不在判断执行循环的条件是否成立*/

#include<stdio.h>

int main()
{
	int i, sum = 0;
	for(i=1;i<=100;i++)
	{
		if(i>2000)
		{
			break;
		}
		sum += i;//sum = sum + i
	}



	return 0;
}