自学c语言五节课后的一些随笔记录,思路较乱,对一些知识点有一些自己的理解
一、基本框架
#define
#include<stdio.h>
int main()
{
printf(“hello logic\n”);
return 0;
}
1.main : 主函数 是程序的入口 有且仅有一个
2.int 是整型的意思
3.printf ( print function) 打印函数 属于库函数(c语言本身提供给的)
所以要使用c语言的函数要“打招呼 “(声明一下:#include<stdio.h>)
Stdio:standard input output
2024年9月14日
21:29
二、数据类型
引子:
Char 字符数据类型
Short 短整型
Int 整型
Long 长整型
Long long 更长的整形
Float 单精度浮点型
Double 双精度浮点型
Eg ‘A’叫字符 理解:想要显示字符 就需要存储字符(也就是内存的作用)
1.打印数据的语法
(1)打印字符(char)
#define
#include<stdio.h>
int main()
{
char ch =’A’;//内存
printf(“%c\n”, ch);//%c是打印字符格式的数据
return 0
}
(2)打印整型
#define
#include<stdio.h>
int main()
{
int age = 20
printf(“%d\n”,age);//%d 打印整型上进制数据
return 0
}
观察二者共同点:
字符:char ch =‘A’;
printf(“%c\n”,ch);
整型:int age = 20;
printf(“%d\n”,age);
语法:
%c 打印字符
%s 打印字符串
%d 打印整型
%f 打印浮点数字
%lf 打印double类型浮点数字
%2.打印两位小数
2.计算各种数据类型的大小
#include<stdio.h>
int main()
{
printf("%d\n",sizeof(char));
printf("%d\n",sizeof(short));
printf("%d\n",sizeof(long));
printf("%d\n",sizeof(int));
printf("%d\n",sizeof(float));
printf("%d\n",sizeof(double));
return 0;
}
结果:
char 1
short 2
long 4
int 4
float 4
double 8
单位:字节
*知识点:计算机的单位:
Bit 比特位(最小的)
Byte 字节 1字节=8比特位的大小
Kb 1kb=1024字节
Mb 进制往下一直是1024
Gb
Tb
Pb
计算机是硬件—通电
正电1 负电0
一个比特位只能存放一个二进制位(0or1)
所以说如果不需要打印太大的数
可用short int age = 20;//向内存申请2个字节,用来存放20
注意:
Float weight =95.6;//95.6可能会被默认为双精度(double)型,需要在后面加个f
Float weight =95.6f;//float:向内存申请4个·字节存放小数
第二课
- 处理warning:用#define 复制粘贴即可
常量:
(1) 字面常量: int num = 4100 3.14
(2)Const修饰的常变量(const) const int num = 8 (num不能改了)
补充:更好的理解const
int n = 10;
int arr[n] = {0};
//结果出问题了(原因:arr[ ] 中不能是变量,只能是常量
若改成:
int n = 10;
int arr[10] = {0};
结果没有问题
若加个const(使得n具有常属性:
const int n = 10
int arr[n] = {0}
//结果依然有问题。
因为n是个变量 但此时具有常属性,是常变量
但本质上还是个变量 所以在需要常量的地方不能够使用。
但 n 也改不了了
总结:const修饰的常变量能使变量具有常属性(以后改不了了)但因为其本质还是变量,所以不能在需要常量的地方使用。
(3)#define定义的标识符常量
例
#define MAX 10
#include<stdio.h>
int main()
{
int arr[MAX] = {0};
printf(“%d\n”,MAX);
return 0
}
so定义常量的方法:#define 常量 值
(4)枚举常量(一一列举)
eg 性别 男女
三原色 红黄蓝
星期 1234567
枚举关键字
enum Sex
{
MALE,
FEMALE
};//MALE,FEMALE – 枚举常量
int main()
{
//enum Sex s = FEMALE;//s代表一个人
printf(“%d\n”,MALE);//0 是有值的,且不能被改变
printf(“%d\n”,FEMALE);//1
return 0;
}
注意 MALE = 6 不能写 因为MALE是常量 不能改。
- 字符串类型
“logic” “1233333” “ “ 都叫字符串
#include <stdio.h>
int main() {
char arr1[] = "abc";//"abc"--{'a','b','c',0} 0就是'\0',是字符串结束的标志
char arr2[] = {'a', 'b', 'c',};
printf("%s\n", arr1);
printf("%s\n", arr2);
return 0;
}
strlen 字符串长度—string length
转义字符
eg . \n 换行 、
\t 水平制表符
若不想被转义,需加\来破坏转义组合
计算字符长度:转义字符组合起来算作一个字符
so c:\test\32\test.c 长度是13
\t是一个转义字符,\32也是转义字符//一个八进制数字
\ddd 八进制 \xdd 16进制
三、变量
#include<stdio.h>
int num2 = 20;//定义在代码块之外的变量 叫全局变量
int main()
{
int num1 = 30;//在代码块内部 这叫局部变量
return 0;
}
当全局变量和局部变量同时存在 打印出的结果是局部变量
加法:(scanf输入数据 printf输出数据
#include<stdio.h>
int main()
{
int num1 = 0;
int num2 = 0;
int sum = 0;
scanf("%d%d",&num1,&num2);
sum = num1 + num2;
printf("%d",sum); //或写成sum=%d
return 0;
}
声明外部变量:
例如在另一个文件中有:
int g_val = 0;
若在外部文件中使用需要声明:
extern int g_val;
语句
选择语句:
#include <stdio.h>
int main() {
int input = 0;
printf("你要好好学习吗?(0/1)>:");
scanf("%d", &input);
if (input == 1)
printf("offer");
else
printf("nothing");
return 0;
}
条件语句:
#include <stdio.h>
int main() {
int line = 0;
printf("walk into Tencent");
while (line < 20000) {
printf("\n敲一行代码");
line + 1;
printf("%d", &line);
}
printf("\n躺平");
return 0;
}
修改:
#include <stdio.h>
int main() {
int line = 0;
printf("walk into Tencent");
while (line < 2000) {
printf("\n敲一行代码");
line++;
printf("%d", line);
}
if (line >= 2000)
printf("\n躺平");
return 0;
}
经验之谈:
&是地址不是大小;
++才是+1 而不能写+1 或写为a = a + 1
思考:while 和 if 语句的区别 *
Add函数:
sum = Add(a,b);
知识点:函数调用(自定义函数)
#include<stdio.h>
int Add(int x,int y)
{
int z = x+y;
return z;
}
int main()
{
int num1 = 10;
int num2 = 20;
int sum = 0;
int a = 100;
int b = 200;
sum = Add(num1,num2);
sum = Add(a,b);
printf(“sum = %d\n”,sum);
return 0;
}
目的:简化
运算符号:% 取模(除法余数)
移位操作符:<<左移 >>右移
(二进制移位 eg 0000001变成 0000010
位操作符(2进制位):&按位与
赋值:
a += 10 或 a = a + 10 都表示给a加10
a -= 10
单目操作符
双目操作符
- 叫操作符 因为他有左右两个操作数
三目操作符
!:逻辑负操作
四、操作符
1.关系操作符>= <= != == > <
2.逻辑操作符
&& 逻辑与
a&&b 如果ab都为真,则逻辑与为真,如果其中一个为假,则逻辑与为假。
|| 逻辑或
a||b 如果ab中只要有一个为真,则逻辑或为真。
3.条件操作符
exp1 ? exp2 : exp3(三目操作符)
exp是一个表达式,如果exp1这个表达式结果为真,执行exp2,否则执行exp3
4.逗号表达式
exp1,exp2,exp3,
5.下标引用操作符[]
arr[]
6.函数调用操作符()
Add()
计算机知识点*原码、反码、补码
原码 -----------> 反码 -----------> 补码
直接按照正负 原码的符号位不变 反码+1
写出二进制序列 其他位按位取反得到
计算机 存储数据
寄存器
高速缓存
内存 8G/4G/16G
硬盘 500G
从下往上 访问速度越来越快
cpu中央处理器
register int a = 10; //把a变成寄存器变量
int其实是signed int ,是有符号的;
unsigned int 是无符号的;
typedef类型重定义
eg. typedef unsigned int u_int;
static修饰局部变量
使局部变量生命周期变长
extern声明外部变量(用其他源文件的变量)
int* p = &a //指针变量是专门用来存地址的
打印地址 %p
地址空间连续分配,“&”取变量首地址
------------------------------------------------更新日期2024.9.25----------------------------------------
练习——递归函数
例题1.阶乘
#include <stdio.h>
int fun(int a) {
if (a > 1) {
return a * fun(a - 1);
}
}
int main() {
int num1 = 0;
scanf("%d", &num1);
printf("%d", fun(num1));
return 0;
}
更新日期 ——————————————————2024.9.28——————————————————————
/数组+分支问题——查询每月天数/
#include <stdio.h>
int main() {
int year;
printf("please input a year:\n");
scanf("%d", &year);
if (year % 4 != 0) {
int arr[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int num1;
printf("please input a month:\n ");
scanf("%d", &num1);
printf("%d", arr[num1 - 1]);
}
else {
int arr[12] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int num1;
printf("please input a month:\n ");
scanf("%d", &num1);
printf("%d", arr[num1 - 1]);
}
return 0;
}
分支循环(1)
一、分支语句
(一)if语句
1.单分支if
Eg.
#include<stdio.h>
int main(){
int age = 20;
if(age<18)
printf(“未成年”\n);
return 0;
}
2.if-else语句
Eg.
#include<stdio.h>
int main(){
int age = 20;
if(age < 18)
printf(“未成年\n”);
else
printf(“成年\n”);
return 0;
}
eg
#include<stdio.h>
int main(){
int age = 20;
if(age<18)
printf(“未成年\n”);
else if( 18 <= age < 28) //这样写是错误的,应写成(age>=18 && age<28)
printf(“ 青年”\n);
else if(age >= 28 && age < 50);
printf(“壮年\n”);
else if(age >= 50 && age < 90);
printf(“老年\n”);
else
printf(“老不死\n”);
return 0;
}
可能会出现悬空else问题:
当写以下代码
#include<stdio.h>
int main(){
int a = 0;
int b = 2;
if(a == 1)
if(b == 2)
printf(“hehe\n);
else
printf(“haha\n”);
return 0;
}
此时的else会与离它最近的未匹配的if配对。
注意:
1、不要写成一头齐或一行写完的代码风格,注意缩进、回车。
2、注意判断相等用==,=是赋值
总结 if else语句尽量写成如下形式:
if(condition)
{
return x;
}
else
{
return y;
}
exercise:用if else语句输出1-100之间的奇数
#include <stdio.h>
int main(){
int a = 1;
while (a < 100) {
printf("%d\n", a);
a = a + 2;
}
return 0;
}
(二)switch-case语句
什么时候用switch:
eg.
#include<stdio.h>
int main()
{
int day = 0;
scanf(“%d”,&day);
if(1 == day)
printf(“星期1\n”);
else if(2 == day)
printf(“星期2\n”);
else if(3 == day)
printf(“星期3\n”);
用switch语句改写:
#include<stdio.h>
int main()
{
int day = 0;
scanf(“%d”,&day);
switch(day)
{
case 1:
printf(“星期1\n”);
break;
case 2:
printf(“星期2\n”);
break;
case 3:
printf(“星期3\n”);
break;
}
从哪里进去由case决定,从哪里出去由break决定。
因此switch语句适用于多分支情况。
注意,不一定每个case都要跟break,
如以下代码:
#include<stdio.h>
int main()
{
int day = 0;
scanf(“%d”,&day);
switch(day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf(“工作日\n”);
break;
case 6:
case 7:
printf(“休息日\n”);
break;
default:
printf(“输入错误\n”);
break;
}
更新 2024/10/6
编程习惯:在每个switch语句中都放一条default子句是个好习惯,甚至后面可以再加一个break。
练习:
#include<stdio.h>
int main()
{
int n = 1;
int m = 2;
switch(n)
{
case 1:m++;
case 2:n++;
case 3:switch(n){
case 1:n++;
case 2:m++;n++;break;
}
case 4:m++;
break;
default:
break;
}
printf("m = %d,n = %d\n",m,n);
return 0;
问题:最后输出结果为什么
答案:m = 5,n = 3
更新 2024/10/7
二、循环语句
(一)while循环
while循环课上练习
/1——n求和/
#include <stdio.h>
int main()
{
int i = 1;
int n;
int sum = 0;
scanf("%d", &n);
while (i <= n) {
sum = sum + i;
i++;
}
printf("%d", sum);
return 0;
}
/打印三角形/
#include <stdio.h>
int main()
{
int row = 1;
int i = 1;
scanf("%d", &row);
while (i <= row) {
int num = 1;
while (num <= i) {
printf("*");
num++;
}
i++;
printf("\n");
}
return 0;
}
getchar()和putchar()
例题:
7-4 非字母数字计数
现有若干字符,包括大小写字母,数字,空格,其他字符等等。请按输入顺序输出其中的字母及数字以及其他被忽略的字符的个数。
输入格式:
只有一行,为一串任意字符,以’\n’结尾。
输出格式:
共两行,第一行为按输入顺序输出其中的字母和数字;第二行为一个整数,代表被忽略的非字母数字的个数。
测试用例保证输入合法。
输入样例:
gj&*(!@J@1231we../789)
输出样例:
gjJ1231we789
10
Solution:
#include<stdio.h>
int main(){
char ch;
int i=0;
while(1){
ch=getchar();
if(ch =='\n')
break;
if((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){
putchar(ch);}
else{
i++;
}
}
printf("\n%d",i);
return 0;
}
注意ch=getchar 每次读一个字符,因此用了while循环确保这串字符的每个字符都被读到。
注意ch的类型用char就可以,即使后续要和一些字符比较ASC码值,它也能自己转换成int。
2024/11/4
emnzlpofrq
你的才华横溢,让人敬佩。 http://www.55baobei.com/ATCOpUhA6q.html