C语言初学笔记

计算机中数据的存储:

内存,硬盘,高速缓存,寄存器,网盘云端

内存大小:网盘(不限制)>硬盘(硬件设定)>内存(8-16G)>高速缓存(几十MB)>寄存器(更小)

大量被频繁使用的数据会放入寄存器中,提高使用效率

 

Signed:有符号的

Unsigned:无符号的

Static:静态的,修饰局部变量,改变了局部变量的生命周期(本质上是改变了变量的存储类型)

Union:联合体(共用体)

Void:空

Volatile:防止编译器对代码进行优化(特征修饰符(type specifier).volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。

Define与include不是关键字,属于预处理指令

#typedef:类型重定义

栈区:局部变量,函数的参数

堆区:动态内存的分配

静态区:全局变量,static修饰的静态变量

全局变量具有外部链接属性,被static修饰后,变成了内部链接属性,其他源文件就不能链接到这个静态的全局变量了

指针就是地址

内存是电脑上重要的存储器,计算机中所有程序的运行都是在内存中进行的。

所以为了有效地使用内存,就把内存划分成了一个个小内存单元,每个内存单元大小为1个字节,为了能够有效的访问到内存的每个单元,就给了内存单元进行了编号,这些编号就是地址

32位与64位指的就是地址线

最终一个内存单元是一个字节,然后分配地址

%p专门用来打印地址

*用来修饰指针变量

Int*说明指针变量执行的对象是int类型

指针的大小是相同的,因为指针是用来存放地址的,指针所占空间取决于地址的存储所占空间

32位电脑一个地址4个字节

64位电脑一个地址8个字节

结构体

描述复杂对象

*ps.相当于ps->

->用法:结构体指针->成员变量名

& * . ->

分支语句

Ifelse语句不加{},只会默认执行一条语句

Else和最近的if匹配

Switch语句中,case决定入口,break决定出口

Case后面要求是整型常量表达式

最后一个case的break也尽量加上

Default不规定位置,用于处理异常

Switch允许嵌套使用

循环语句

1、 While

Breakwhile中用于永久终止循环

Continue是直接跳过本次循环continue后面的代码,直接跳去判断部分,看是否进行下一次循环

 Getchar函数用法:从键盘获取字符,返回的类型是int

EOF意为end of file –文件结束标志

Putchar函数用法:输出一个字符

Ctrl+z就相当于让键盘读入一个EOF

数组的数组名本身就是一个地址

问题一:Getchar读取\n

解决方法:再加个getchar();拿走换行

问题二:getchar只消耗缓冲区里一个字符,如果有很多,处理不掉

解决方法:

使用while循环清理多个字符

2、 do while

基本格式:

Do

          循环语句;

While(表达式);

3、 for

格式:

表达式1:初始化,表达式2:判断,表达式3:调整

For(表达式1;表达式2;表达式3)

          循环语句;

不可在for循环体内修改循环变量,防止for循环失去控制

建议for语句的循环控制变量的取值采用“前闭后开区间”写法

 判断语句省略恒为真是语法规定

REP函数是用于创建重复序列的函数,其能将某一向量重复若干次

练习:在一个有序数组中查找具体数字n

 

练习:阶乘类

//计算任意数阶乘

    //for循环

    /*int i = 0;

    int j = 0;

    int sum = 1;

    printf("计算n!,n=");

    scanf("%d", &i);

    for (j = 1; j <= i; j++)

    {

         sum = sum * j;

    }

    printf("%d %d %d", i,j, sum);*/

 

    //while循环

    /*int i = 0;

    int j = 1;

    int sum = 1;

    printf("计算n!,n=");

    scanf("%d", &i);

    while (j<=i)

    {

         sum = sum * j;

         j++;

    }

    printf("%d", sum);*/

 

    //do while循环

    /*int i = 0;

    int j = 1;

    int sum = 1;

    printf("计算n!,n=");

    scanf("%d", &i);

    do

    {

         sum = sum * j;

         j++;

    } while(j <= i);

    printf("%d", sum);*/

 

    //测试

    //不使用j

    //int i = 0;

    //int j = 0;

    //int sum = 1;

    //printf("计算n!,n=");

    //scanf("%d", &i);

    //for (i; (i-1)>0; i--)

    //{

    //  sum = sum * i;//sum *= i;

    //}

    //printf("%d", sum);

 

    //计算1!+2!+3!+...+n!

    //int i = 0;

    //int j = 0;

    //int sum1 = 1;

    //int sum2 = 0;

    //printf("1!加到n!,n=");

    //scanf("%d", &i);

 

    //for (i; (i - 1) > 0; i--)

    //  {

    //       sum1 = sum1 * i;//sum *= i;

    //       sum2 = sum2 + sum1;

    //  }

    //printf("%d %d", sum1, sum2);

 

    //int i = 0;

    //int j = 0;

    //int sum = 1;

    //int num = 0;

    //printf("计算n!,n=");

    //scanf("%d", &i);

    //for (j = 1; j <= i; j++)

    //{

    //  sum = sum * j;

    //  num += sum;

    //}

    //printf("%d %d %d ", i, j, sum);

//printf("%d",num);

演示多个字符从两端向中间汇聚

 

Sleep(number);//表示程序暂停运行number毫秒。S要大写

system("cls");//清空屏幕

char arr[] = “abc”;

[a b c \0]

两个字符串比较不能用==,应该使用strcmp

比较ASCII码值

 

    //登陆程序,登录三次

    int i = 0;

    //假设正确密码是字符串“123456”

    char password[20] = { 0 };

    for (i = 0; i < 3; i++)

    {

         printf("请输入密码:>");

         scanf("%s", password);

         //if (password == "123456")--两个字符串比较不能用==,应该使用strcmp

         if(strcmp(password,"123456")==0)

         {

             printf("密码正确\n");

             break;

         }

         else

         {

             printf("密码错误\n");

         }

    }

    //密码三次错误

    if (i == 3)

         printf("三次密码错误,程序退出");

rand:产生一个伪随机数,需要引入头文件stdlib

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>

#include<string.h>

#include<windows.h>

#include<stdlib.h>

#include<time.h>

    //猜数字游戏

    //需求:

    //1、自动产生一个1-100的随机数

    //2、猜数字,猜对了,就游戏结束,猜错了,告诉玩家猜大了还是猜小了,知道猜对为止

    //3、游戏可以一直玩,知道退出游戏

 

//打印一个简易菜单

void menu()

{

    printf("=================================\n");

    printf("============ 1、play ============\n");

    printf("============ 0、exit ============\n");

    printf("=================================\n");

}

//猜数字游戏实现

void game()

{

    //1.先生成随机数

    //rand函数返回一个0-32767之间的数字

    //srand()需要括号里是随机值才能生成随机数

    //时间 - 时间戳

    //%100的余数是0-99,然后+1,最后范围就是1-100.

    int ret = rand()%100+1;//需要引入头文件stdlib

    //printf("%d\n", ret);

    //2.猜数字

    while (1)

    {

         int guess = 0;

         printf("请猜数字:>");

         scanf("%d", &guess);

         if (guess < ret)

         {

             printf("猜小了\n");

         }

         else if (guess > ret)

         {

             printf("猜大了\n");

         }

         else {

             printf("猜对了\n");

             break;

         }

    }

}

int main()

{

    int input = 0;

    srand((unsigned int)time(NULL));

    do

    {

         menu();//打印菜单

         printf("请选择:>");

         scanf("%d", &input);

         switch (input)

         {

         case 1:

             game();

             break;

         case 0:

             printf("退出\n");

             break;

         default:

             printf("选择错误\n");

             break;

 

         }

    } while (input);

    return 0;

}

F11 – 逐语句

F10 – 逐过程

int func(int a)

{

    int b;

    switch (a)

    {

    case 1:b = 30;

    case 2:b = 20;

    case 3:b = 16;

    default:b = 0;

    }

    return b;//求func(1)

}

    int  main() {

         printf("%d\n", func(1));

         return 0;

}

练习

int main()

{

    int x = 3;

    int y = 3;

    switch (x % 2)

    {

    case 1:

         switch (y)

         {

         case 0:

             printf("first");

         case 1:

             printf("second");

             break;

         default:

             printf("hello ");

         }

    case 2:

         printf("third");

    }

    return 0;

}

// 从大到小排位

//int main()

//{

//  int x = 0;

//  int y = 0;

//  int z = 0;

//  //输入

//  printf("输入三个数:");

//  scanf("%d %d %d", &x, &y, &z);

//  //调整数据

// 

//  if (x > y && x > z)

//  {

//       if (y > z)

//       {

//           printf("%d %d %d", x, y, z);

//

//       }

//       else

//       {

//           printf("%d %d %d", x, z, y);

//       }

//  }

//  else if (y > x && y > z)

//  {

//       if (x > z)

//       {

//           printf("%d %d %d", y, x, z);

//       }

//       else

//       {

//           printf("%d %d %d", y, z, x);

//       }

//  }

//  else if (z > x && z > y)

//  {

//       if (x > y)

//       {

//           printf("%d %d %d", z, x, y);

//       }

//       else

//       {

//           printf("%d %d %d", z, y, x);

//       }

//  }

// 

// 

//  return 0;

//}

另一种

//int main()

//{

//  int x = 0;

//  int y = 0;

//  int z = 0;

//  //输入

//  printf("输入三个数:");

//  scanf("%d %d %d", &x, &y, &z);

//  //调整数据

//  if (x < y)

//  {

//       int tmp = x;

//       x = y;

//       y = tmp;

//  }

//  if (x < z)

//  {

//       int tmp = x;

//       x = z;

//       z = tmp;

//  }

// if (y < z)

//  {

//       int tmp = y;

//       y = z;

//       z = tmp;

//  }

//  printf("%d %d %d", x, y, z);

//  return 0;

//}

//求1-100之间所有3的倍数

 

全部公约数

 

 

 

求最大公约数

int main()

{

         int x = 0;

         int y = 0;

         int i = 0;

         printf("请输入两个数:");

         scanf("%d %d", &x, &y);

         //设最大公约数是xy中较小值

         if (x > y)

         {

             i = y;

         }

         else

         {

             i = x;

         }

         while (1)

         {

             if (x % i == 0 && y % i == 0)

             {

                  printf("最大公约数为:%d", i);

                  break;

             }

             i--;

         }

         return 0;

}

 

 

posted @ 2021-11-15 15:28  风乎舞鱼  阅读(121)  评论(0)    收藏  举报