C programming language learning(更新ing)



自学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个·字节存放小数

第二课

  1. 处理warning:用#define 复制粘贴即可
  2. 常量:
    (1) 字面常量: int num = 4

             100
              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是常量 不能改。

  1. 字符串类型
    “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循环


expr是expression表达式;
非0为真,等0为假;

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

声明:Logic & Superegos ' House|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - C programming language learning(更新ing)


Be water,my friend.