2023.4.12汇总

#2023.3.27

一,数据类型

  char          //字符数据类型

  short         //短整型

  int           //整形

  long         //长整型

  float         //单精度浮点型    %f

  double       //双精度浮点型     %lf”

char ch=’A’

printf(“%c\n”,ch);   //以字符的形式打印ch

 //%d 打印整型十进制数据

// short int 短整型

//Char-字符类型

//%d-打印整型

//%c-打印字符

//%s打印字符串

//%f-打印浮点数字-打小数

//%p-以地址的形式打印   &

//%x-打印16进制数字

//%o-打印8进制数

float fufu=5.0;

printf(“%f”);

double fufu=3.14;

printf(“%lf”);

所占内存大小不一样

                                  字节

二,字节 计算机中的单位

Bit 比特位

Byte-字节   1byte=8bit

Kb         1kb=1024byte

Mb         1024 

Gb          1024

Tb

pb

2进制   0 1              逢二进一   

010=0*2^0+0*2^1+0*2^0=2

8进制   0 1 2 3 4 5 6 7

10进制  0 1 2 3 4 5 6 7 8 9  逢十进一

egShort age=20//向内存申请2个字节16比特,用来存放20

三,变量的分类

     局部变量(名字相同时优先)and全局变量

     

#include<stdio.h>

int fufuu = 400; //全局变量

int main(void)

{

  int fufu = 120;//局部变量

  return 0;

}

//&是取地址符号

&a是取出a的地址printf("%p\n", &a);

{

   int number_1 = 0;

   {

      printf("number_1=%d\n",number_1 );

   }

  

   return 0;

}

作用域:限定名字可用性的代码范围

四,常量

1,Const – 修饰的常变量 -常属性 放到前面固定值

const int n =120//n是变量又有常属性,所以n为常变量

Int arr[10]={0};创建数组

2#define 定义的标识符常量

#define MAX 10                      【打印出来是10

int main(void)             宏定义命令,预处理命令

{

int arr[MAX] = { 0 };

   printf("%d\n", MAX);

   return 0;

}

3,枚举常量

 枚举是可以一一列举的 ,枚举常量不可改

枚举关键-enum

  1. 枚举性别

enum Sex

{

    MALE,

   FEMALE,

   SECRET

};

int main(void)

{

   printf("%d\n",MALE);

   printf("%d\n",FEMALE);

   printf("%d\n",SECRET);

   return 0;

}

  1. 枚举颜色

   enum Color

{

   RED,

   YELLOW,

   BLUE

};

int main(void)

{

   enum Color color = BLUE;

  

   return 0;

}

4,字面常量

303.14

五,字符串

“由双引号引起的东西”

打印字符串用%s%c是打印单个字符

注:字符串的结束标志是一个\0的转义字符,不算作字符串内容

转义字符:转变原来的意思

1#include<stdio.h>

int main(void)

{

  

   char arr1[] = "abc";

   //"abc"--'a''b''c''\0'---\0是字符串的结束标志

   char arr2[] = { 'a','b','c' , ‘\0’};

//a=97,‘A=65----------ASCII

   printf("%s\n", arr1);

   printf("%s\n", arr2);

   return 0;

}

2.#include<stdio.h>          【打印出来第一个是3,第二个是随机值】

int main(void)

{

  

   char arr1[ ] = "abc";

   char arr2[ ] = { 'a','b','c' };

   printf("%d\n", strlen(arr1));

   //strlen-string length-计算字符串长度的

   printf("%d\n", strlen(arr2));

   return 0;

}

计算机上是以二进制存储数据

\t是水平制表符号

#20233.29

六,转义字符

#include<stdio.h>                         【打印出来是 est

int main(void)                              要使打印正常 \\t

{                                            则多加一个斜杠

   printf("\test\t");

   return 0;

}

//用于表示一个反斜杠,防止被解释为一个转义字符

printf("%c\n",'\'');

printf("%s\n"," \" ");

//strlen-string length-计算字符串长度的

#include<string.h>

Printf(“%d\n”,strlen(“c:\text\32\text.c”));

C   :   \t  e x  t  \32  \t  e  x  t  .  c  13个】

\32作为8进制代表的那个十进制数字,作为ASCII码值,对应的字符

//32—十进制转换3*8^1+2*8^0=24+2=26—作为ASCII码值代表的字符

\ddd表示1~3个八进制的数字

printf("%c", '\132');

//132—1*8^2+3*8^1+2*8^0=64+24+2=90

\xdd表示2个十六进制数字

printf("%c", '\x61'); 【是一个字符】

//61—6*16^1+1*16^0=97

#include<stdio.h>

int main(void)

{

int input = 0;d

   printf("懿酱你来接我吗?(1/0)>:");

   scanf_s("%d",&input);

   if (input == 1)     //两个等号来判断相等不相等

      printf("好,来接你。");

   else

      printf("……");

   return 0;

}

#2023.3.30

七.C语言中如何实现循环?

1while循环:

条件表达式的执行次数总是比循环体的执行次数多一次。

 原因:对于while(条件表达式){循环体},我们先判断,

若满足条件表达式则执行循环体

若不满足,则退出循环。

      当不满足条件时,我们执行了条件表达式,并没有执行循环体。

故,条件表达式的执行次数总是比循环体的执行次数多一次。

2do while循环:

   条件表达式的执行次数与循环体的执行次数一样。

原因:对于do{循环体} while(条件表达式),我们是

先执行循环体,再执行条件表达式进行判断,

若满足条件表达式则继续执行循环体;

若不满足则退出循环。

故,条件表达式的执行次数和循环体的执行次数一样。

  1. switch-case循环中,如果case语句没有break终止,则会继续往下进行,直到末尾。
  2. break语句:是跳出当前循环,只在循环语句和判断语句使用。
  3. continue语句:是跳过当次循环,进入下次循环。
  4. do while循环后有分号
  5. do whilewhile语句中的表达式都是其值为0时结束循环

#2023.4.5

  1. while语句

while(表达式)后面无符号表达式为真则执行

循环语句

Crtl+z是输入文件终止符:crtl+c是结束进程

ctrl+c ctrl+z 的区别

ctrl+cctrl+z都是中断命令,但是他们的作用却不一样.

ctrl+c是强制中断程序的执行,

ctrl+z的是将任务中断,但是此任务并没有结束,他仍然在进程中他只是维持挂起的状态,用户可以使用fg/bg操作继续前台或后台的任务,fg命令重新启动前台被中断的任务,bg命令把被中断的任务放在后台执行.

A #include<stdio.h>

int main(void)

{

   int line = 0;

   while (line < 20000)

   {

printf("懿酱:%d\n",line);

           line++;

   }

   if (line >= 20000)

   printf("酱酱酱\n");

return 0;

}

Bbreak

int i = 1;                【到5就停止了,只打印出1234

   while (i<=10)

   {

      if (i == 5)

         break;//停止 直接终止循环

   printf("%d ", i);

   i++;

   }

Ccontinue

int i = 1;

   while (i <= 10)

   {

if (i == 5)  //5死循环

         continue;//终止循环中本次循环continue后面的代码,

直接跳到while语句的判断部分,

进行下一次循环的入口判断

      printf("%d ", i);

      i++;

   }

Dint ch = 0;

   while ((ch = getchar()) != EOF)//getchar获取字符

   putchar(ch);

   int ch = getchar();

   putchar(ch);

   printf("%c\n", ch);

   return 0;

Eint main(void)

{

   int ch = 0;

   //crtl+z

   //EOF-end of file-值为负1- 文件结束标志

   while ((ch = getchar()) != EOF)//getchar获取字符

   {

      putchar(ch);

    }

   return 0;

}

F#include<stdio.h>

int main(void)

{ //只会输出数字

   int ch = 0;

   while ((ch = getchar()) != EOF)

   {

      if (ch < '0' || ch>'9')

         continue;

      putchar(ch);

   }

   return 0;

}

  1. for语句

 for(表达式1;表达式2;表达式3

     初始化部分;条件判断部分;调整部分

     循环语句:

建议1.不可在for循环体内修改循环变量,防止for循环失去控制  = =

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

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

int main(void)          

{  

   int i = 0;

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

   {

      if (i == 5)

         continue;//没有死循环

      printf("%d ", i);

  }

注:对比for循环和while循环中continue变化

【打印出来是1,2,3,4, 6,7,8,9,10                   1,2,3,4】

//变种1    for (; ; )    【一直不停打印】

            {

                printf("hehe\n");

        }

  1. For循环的初始化,调整,判断 都可以省略

但是:

For循环的额 判断部分如果被省略,那判断条件就是:恒为真

  1. 如果不是很熟练,建议不要随便省略

int i = 0;

int j = 0;

for (; i < 10; i++)

{

                for (; j < 10; j++)  

     {

      printf("hehe\n");

     }

}

解读:先黄色这一部分,j0一直到10,j=10<10时,变到绿色这部分循环中。

绿色中i先等于0,再到下面黄色部分j=10,又j=10<10,条件不再成立,循环停止。i上去再等于1,再到下面黄色部分j=10,又j=10<10,条件不再成立,循环停止。

//变种2int x, y;   【打印出两个hehe】用了两个循环变量

           for (x = 0,y = 0; x < 2 && y < 5;++x,y++ )

        {

           printf("hehe\n");

         }

//下面的代码循环要循环多少次?

#include<stdio.h>

int main(void)

{

   int i = 0;

   int k = 0;

   for (i = 0, k = 0; k = 0; i++, k++)

      k++;

      return 0;

}

答:k = 0;k0是假,所以循环压根不进行。循环0

  若让代码结果为非0,则永远是死循环。

  1. do……while )语句

do语句的语法:

      do

            循环语句;

     while(表达式);

 #打印1~10
#include<stdio.h>

int main(void)

{

   int i = 1;

   do

   {

      printf("%d ", i);

      i++;

   }

   while (i <= 10);

      return 0;

}

八.Add函数相加

F(x,y)=x+y;

Add                 

int Add(int x, int y)

   {

      int z = x + y;

      return z;

   }

int main(void)

{

int num1 = 10;

   int num2 = 20;

   int sum = 0;

   int fufu = 100;

   int didi = 200;

   sum = Add(num1, num2);

   printf("sum=%d\n",sum);

}

1,函数:分为库函数和自定义函数

2,数组:一组相同类型元素的集合

数组的定义:

   Int arr[10]={12345678910}

        数组的下标 0   1  2  3  4  5  6   7  8  9

打印一个元素printf("%d\n", arr[4]);  【打印出来是5

打印一组元素int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };

                     printf("%d\n", arr[4]);

                     int i = 0;

                     while (i < 10)

   {

                  printf("%d\n",arr[i]);

                     i++;

                     }

     //用下标的方式访问元素

//定义一个整型数组,最多放10个元素

       char ch[20];

       float arr2[5];

九,操作符

  1. 取模操作符:%

   i%2==0

2.移(2进制)位操作符:<<左移

>>右移

           Int fufu=1

0000000000001

           a <<1//a向左移动一位【左边丢弃,右边补零

全部拿起来向左移

0000000000010

           //整型14个字节—32个比特位

int main(void)

{

   int fyfy = 1;

   int fifi = fyfy << 1;

   printf("%d\n", fifi);

    return 0 ;

}

3.(二进制)位操作      0为假,非0为真。

按位与 -        上下同真则真

|   按位或          1就是1

按位异或        对应的二进制位相同则为0

相异为1.

二进制:1 1 1 1

1*2^3+1*2^2+1*2^1+1*2^0

8      4    2     1

int main(void)

{

   int a = 3;       //011

   int b = 5;       //101

   int c = a & b;   //001

   printf("%d", c);

    return 0 ;

}

int main(void)

{

   int a = 3;       //011

   int b = 5;       //101

   int c = a |b;    //111

   printf("%d", c);

    return 0 ;

}

int main(void)

{

   int a = 3;       //011

   int b = 5;       //101

   int c = a ^ b;   //110

   printf("%d", c);

    return 0 ;

}

  1. (复合)赋值操作符

=  +=  -=  *=  /=  &=  ^=  |=  >>=  <<=

= 是赋值,== 是判断相等

a = a+10;a +=10;相等等价

a =a-2

  1. 单目操作符:1  逻辑反操作(真变假假变真)

                 int main(void【打印出来a10,!a0

{                        

                             int a = 10;     

  

                             printf("%d\n", a);

                             printf("%d\n", !a);

                              return 0 ;

}

2 .           -负值    int a = -10;

3+        正值

4.&        取地址

5.sizeof    操作数的类型长度(字节为单位)

           计算变量或类型所占空间大小

printf("%d\n", sizeof(a));

   printf("%d\n", sizeof(int));

int arr[10] = { 0 };

   printf("%d\n", sizeof (arr));

//int main(void)

{  

   int arr[10] = { 0 };

   int sz = 0;

   //计算数组的元素大小

   //计算数组元素个数=数组总大小/第一个元素的大小0

   sz = sizeof(arr) / sizeof(arr[0]);

   printf("%d\n",sz);

return 0 ;

int main(void)

{  

   int a = 10;

   int arr[] = { 1,2,3,4,5,6 };

   printf("%d\n", sizeof(a));   //4

   printf("%d\n", sizeof(int));

    return 0 ;

}

  #2023.4.2     6.--

int a = 10;    //a=9,b=10

int b = a--;//后置-- 先使用,再--

printf("a=%d b=%d\n", a, b);

int a = 10;    //a=9,b=9

int b = --a;//前置--,先--,再使用

printf("a=%d b=%d\n", a, b);

              7.++

int a = 10;    //a = 11b = 10

int b = a++;//后置++:先使用,再自增++

int c = ++a;//前置++:先++,再使用

printf("a=%d b=%d c=%d\n", a, b,c);

8.~    对一个数的二进制按位取反

     int fufu = 0;//4个字节32bit位。320

          int didi = ~fufu;//didi是有符号的整型

          printf("%d\n", didi);//使用的打印的是这个数的原码

        //~ 按位取反:1001    0101>1010

        //原码(符号不变,按位取反)——反码(加1)——补码

           直接按照正负写出的二进制序列

        //补码减1得到反码,反码按位取反得到原码

        // 111111111111111111(补码

        // 111111111111111110(反码

        // 000000000000000001(原码

         //最高位是符号位

        //负数在内存中存储的是二进制补码

//0开头的是正数,1开头的是负数【01负】

//只要是整数,内存中存储的都是二进制的补码

//正数的原码,反码,补码 相同

//负数存补码

9.*

10.(类型) 强制类型转换

int a = (int)3.14;  //3.14double类型的,

                    //要强制转换成int就在前面加()

  1. 双目操作符:+

 //EOF—end of file—文件结束标志

‘\q’是转义字符吗?

数组如果初始化,可以不指定数组的大小。

求两个数的较大值:

第一种int main(void)

{  

   int num1 = 10;

   int num2 = 20;

   if (num1 > num2)

      printf("较大值是:%d", num1);

   else

      printf("较大值是:%d", num2);

    return 0 ;

}

第二种#include<stdio.h>

int Max(int x, int y)

   {

   if (x > y)

      return x;

   else

      return y;

   }

int main(void)

{  

   int num1 = 10;

   int num2 = 20;

   int max = 0;

   max = Max(num1, num2);

   printf("max=%d\n", max);

  

    return 0 ;

}

#2023.4.2

  1. 关系操作符

>

>=

<

<=

!=        用于测试“不相等”

==       用于测试“相等”

8.逻辑操作符

  &&  逻辑与(并且) 同真则真&&左右的真假

#include<stdio.h>   【打印出c=1

int main(void)

{

   int a = 3;

   int b = 5;

   int c = a && b;

   printf("c=%d\n", c);

   return 0;

}

||    逻辑或     有真就是真

int a = 3;         【打印出c1

   int b = 0;

   int c = a ||b;

printf("c=%d\n", c);

#2023.4.3

  1. 条件操作符(三目操作符)

exp1 ? exp2 : exp3    //exp是表达式

exp1为真,则执行exp2,否则执行exp3

int a = 30;

   int b = 20;

   int max = 0;

   max = (a > b ? a : b);//如果a>b为真,则执行a,否则执行b

                         //三目操作符

  printf("max=%d\n", max);

8.逗号表达式

逗号可隔开表达式exp1exp2exp3,……

9.下标引用[ ],函数调用( ),结构成员

.   ->   &   *

int arr[10] = {0};

   arr[4];//[]--下标引用操作符

   int a = 10;

   int b = 20;

int sum =Add(a,b);//()--函数调用操作符

10,常见关键字

auto int a = 1;//局部变量--自动变量

一般在代码块中定义的变量,即局部变量,默认都是auto修饰的,auto一般只用来修饰局部变量

auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union void volatile while

//计算机 存储数据

寄存器   register 

register int a = 10;//建议把a定义成寄存器变量

高速缓存

内存

硬盘

//int定义的变量是有符号的

//signed int(有符号的)

 unsigned (无符号的)

struct—结构体关键字

union—联合体/共用体

关键字 typedef—类型定义类型重定义

typedef unsigned int u_int;//unsigned int重定义为u_int

   unsigned int num = 20;

u_int num2 = 20;

关键字static—

#2023.4.4

  

   //1,static修饰局部变量

   //局部变量的生命周期变长

   //2.static修饰全局变量

   // 改变了变量的作用域,

   //让静态的全局变量只能在源文件内部使用,出了源文件就没法使用

   //3.static修饰函数

   // 也是改变了函数的作用域--不准确

   //static修饰函数改变了函数的链接属性

   //外部链接属性   变成->  内部链接属性

#include<stdio.h>

void test()

{   

   static int a = 1;//a是一个静态的局部变量

   a++;

   printf("a=%d\n", a);

}

int main(void)

{

   int i = 0;

   while (i < 5)

   {

      test();

      i++;

   }

   return 0;

}

在源文件的另一个项目里写变量

int g_val = 2020;//全局变量

在原来的项目里写,可以用

加了static int g_val = 2020;就用不了了

int main(void)

{

   //extern-声明外部符号

   extern int g_val;

   printf("%d", g_val);

  

return 0;

}

 

           声明外部函数

extern int Add(int, int);      三个位置都可以放

int main(void)

{

 extern int Add(int, int);

   int a = 10;

   int b = 20;

 extern int Add(int, int);

   int sum = Add(a, b);

   printf("sum=%d\n", sum);

   return 0;

}

11.#define定义常量和宏

#include<stdio.h>

//#define定义标识符常量

#define MAX 100

//#define可定义宏-带参数

//函数的实现

Max(int x, int y)

{

   if (x > y)

      return x;

   else

      return y;

}

//宏的定义方式

#define MAX(X,Y) (X>Y?X:Y)

int main(void)

{

   //int a=MAX;

   int a = 10;

   int b = 20;

   //函数

   int max = Max(a, b);

   printf("max=%d\n", max);

   //宏的方式

   max = MAX(a, b);//max=(a>b?a:b);

   printf("max=%d\n", max);

   return 0;

}

12.指针--是一种用来存放地址的变量

内存是电脑上重要的存储器,计算机上所有程序都是在内存中完成的

一个内存单元是1个字节byte

如何产生地址->空间(房间)

32位:32根地址线/数据线

       正电1;负电0

000000000000000000000000000000000——0

000000000000000000000000000000001——1

000000000000000000000000000000010——2

……

111111111111111111111111111111111——2^32bit

       232次方个编号(从0开始012……)

64

bit/8.byte/1024kb/1024mb/1024gbtbpb

计算器上bin——binary       二进制

        oct——octal         八进制

dec——decimal      十进制

        hex——hexadecimal  十六进制

   int a = 10;//四个字节

int*p = &a;//p是一种变量是用来存放地址的--指针变量.

int*是一种类型   *告诉p是一个指针变量

   printf("%p\n", &a);

   printf("%p\n", p);

   *p=20;//*-解引用操作符/间接访问操作符

   printf("a=%d\n", &a);

   return 0;

//&是取地址符号

&a是取出a的地址printf("%p\n", &a);

int main(void)

{

   char ch = 'w';

   char* pc = &ch;

   *pc = 'a';

   printf("%c\n", &ch);

   return 0;

}

 printf("%d\n", sizeof(pc));

指针变量的大小:指针大小在32位平台上是32bit=4个字节;64位平台是8个字节

int main(void)

{

   double d = 3.14;

   double* pd = &d;

   *pd = 5.5;

   printf("%lf\n",d);

   return 0;

}

13.结构体

描述复杂对象-自己创造出来的一种类型

struct

struct Book

   {

      char name[20];//c语言

      short price;//55

   };

int main(void)

{

   //利用结构体类型创建一个该类型的结构体变量

   struct Book b1 = { "C语言程序设计",55 };

struct Book*pb = &b1;//pb打出我的书名和价格

   printf("%s\n",;  printf("%s\n", pb->name);

//pb指向b1name成员

    printf("%d\n", (*pb).price); printf("%d\n", pb->price);

  

printf("书名:%s\n",b1.name);      //.应用到结构体变量.成员

   printf("价格:%d\n", b1.price);    //结构体指针->成员

b1.price = 15;

   printf("修改后的价格:%d\n", b1.price);

   return 0;

}

#include<string.h>

int main(void)

{

   struct Book b1 = { "C语言程序设计",55 };

   strcpy_s(b1.name , "C++");//name是数组名

   //strcpy-string copy-字符串拷贝

    printf("书名:%s\n",b1.name);

   return 0;

}

#2023.4.5

一、分支和循环

C语言是结构化的。顺序,循环,选择

;//是语句-空语句

1,分支语句

  1. if语句else和最近的if匹配)

a.单分支

if(表达式)//表达式计算结果如果为真(非0),语句则被执行

     语句;

int age = 20;

   if (age < 18)

     printf("未成年\n");

b.双分支

if(表达式)     //if语句只能执行一次

         语句1

else

          语句2

int age = 20;

   if (age < 18)

      printf("未成年\n");

   else

      printf("成年\n");

  

c.多分支

if(表达式)

语句1

else if(表达式2

        语句2

else

        语句3

int main(void)

{

   int age = 188;

   if (age < 18)

      printf("未成年\n");

   else if (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;

}

如果条件成立,要执行多条语句,怎样使用代码块?

int main(void)

{

   int age = 1;

   if (age < 18)

   {

      printf("未成年\n");

     printf("不能练练\n");

   }

   else

   {

          printf("老老\n");

   } 

    return 0;

}

d.悬空else

//else和最近的if匹配

int main(void)

{

   int a = 0;

   int b = 2;

   if (a == 1)//先看这里a=0,所有下面语句为假,不输出打印

      if (b == 2)

         printf("hehe\n");

       else

         printf("haha\n");

    return 0;

}

这里的{ }就是一个代码块

//加一个代码块就可以实现第一个if和最后的else配对

int main(void)

{

   int a = 0;

   int b = 2;

   if (a == 1)

   {

      if (b == 2)

         printf("hehe\n");

   }

      else

         printf("haha\n");

   return 0;

}

e. if书写语句的对比

问:能否打印出hehe

int num = 4;     

   if (num = 5)//=是赋值,==是判断相不相等

   {

      printf("hehe\n");

   }

    return 0;

答:可以,因为赋值了num=5

最优解写if ( 5 == num)

  1. 练习:写一个代码输出1~100之间的奇数

1for语句循环

int i;

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

             {

                if ( i % 2 ==1)

                printf("%d\n", i);

      }

2while语句循环

  1.   int i = 1;

             while (i <= 100)

             {

                   if (i % 2 == 1)  或者   if (i % 2 != 0)

                    printf("%d\n", i);

                 i++;  

      }

b. int i = 1;

         while (i <= 100)

   {

         printf("%d\n", i);

         i+=2;

   }

  1. switch语句{用来实现多分支

  好习惯:在每个switch语句后加default子句,

           甚至在后面加一个break

Switch(整型表达式)//int

{

              语句项;//case语句

                    case 整型常量表达式://冒号

                      语句;

}

A#include<stdio.h>

int main(void)

{

   int day = 0;

   scanf_s("%d", &day);//3

   switch(day)

   {

   case 1:

      printf("星期1\n");

      break;//中止,跳出switch语句.case后的break不一定要有

   case 2:

      printf("星期2\n");

      break;

   case 3:

      printf("星期3\n");

      break;

   case 4:

      printf("星期4\n");

      break;

   case 5:

      printf("星期5\n");

      break;

   case 6:

      printf("星期6\n");

      break;

   case 7:

      printf("星期天\n");

      break;

   }

     return 0;

}

B#include<stdio.h>

int main(void)

{

   int day = 0;

   scanf_s("%d", &day);//3

   switch(day)

   {

default://默认的意思

      printf("输入错误\n");       defaultcase没有顺序之分

      break;                        //上下都可以放

   case 1: 

   case 2: 

   case 3: 

   case 4: 

   case 5:

      printf("工作日\n");

      break;   

   case 6:    

   case 7:

      printf("休息日\n");

      break;

default://默认的意思

      printf("输入错误\n");

      break;

   }

     return 0;

}

Ccase 1: 

      if (n == 1)

      printf("hehe\n");

D#include<stdio.h> //逐级向下计算

int main(void)

{

   int n= 1;

   int m= 2;

   switch(n)

   {

   case 1:  m++;

   case 2:  n++; 

   case 3: 

      switch (n)//switch允许嵌套使用

      {

      case 1:n++;

      case 2:m++; n++; break;

      }

   case 4:  m++; 

   default://默认的意思

      break;

   }

   printf("m=%d,n=%d\n",m,n);//m=5,n=3

     return 0;

}

#include<stdio.h>

int main(void)

{

   int ch = 0;

   int ret = 0;

   char password[20] = { 0 };

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

   scanf_s("%s", password,sizeof(password));//输入密码,存放在password数组中

   //缓冲区还剩一个'\n'

   //读取一下'\n'

   while ((ch = getchar()) != '\n')

   {

      ;//输入密码有间隔空格时

   }

   getchar();

   printf("请确认(Y/N)>:");//数组名可看作地址

   ret = getchar();//passwordgetchar是输入函数

   if (ret == 'Y')

   {

      printf("确认成功\n");

   }

   else

   {

      printf("放弃确认\n");

   }

   return 0;

}

练习#2023.4.6

  1. n的阶乘

AFor循环

#include<stdio.h>

int main(void)

{

int i ,n;

int ret = 1;//ret不能为0.因为如果为0,后面的结果都是0了。

scanf_s("%d", &n);//可以自己输入值的意思

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

   {

      ret *= i;

}

   printf("ret=%d\n", ret);  //for语句的外面

   return 0;

}

Bwhile循环

#include<stdio.h>

int main(void)

{

   int n;

   scanf_s("%d", &n);

   int ret = 1;

   int i = 1;

   while (i <= n)

   {

      ret *= i;

      i++;

   }

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

      return 0;

}

  1. 计算1+2+3+4+5+6+7+8+9+10=

  #include<stdio.h>

int main(void)

{

   int i = 0;

   int n = 0;

   scanf_s("%d", &n);

   int ret = 1;

int sum = 0;

   for(n=1;n<10;n++)

   {

         ret = 1;

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

      {

      ret *= i;

      }

   }

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

   return 0;

}

可优化为:

#include<stdio.h>

int main(void)

{

   int n = 0;

   scanf_s("%d", &n);

   int ret = 1;

   int sum = 0;

   for(n=1;n<=3;n++)

   {

      ret *= n;

      sum = sum + ret;

   }

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

   return 0;

}

个人理解:

n=1时,ret=ret*n=1*1=1

        sum=sum+ret=0+1=1

n=2时,ret=ret*n=1*2=2

        sum=sum+ret=1+2=3

n=3时,ret=ret*n=2*3=6

        sum=sum+ret=3+6=9

所以1+2+3!=9

  1. 在一个有序数组中查找具体的某个数字n。编写int bincearch(int x,int v[],int n);功能:在v[0]<=v[1]<=v[2]<=……<=v[n-1]的数组中查找x

#折半查找算法/二分查找算法:找一半去掉一半

#include<stdio.h>

int main(void)

{

   int arr[] = { 0,1,2,3,4,5,6,7,8,9,10 };

   int k = 7;//可以在这里直接改数值,也可以scanf_s("%d",&k)

               //然后在输出项目中输入数字

   int sz = sizeof(arr) / sizeof(arr[0]);

   int left = 0;//左下标

   int right = sz - 1;//右下标

   while (left <= right)

   {

      int mid = (left + right) / 2;//中间元素

      if (arr[mid] > k)

      {

         right = mid - 1;

      }

      else if (arr[mid] < k)

      {

         left = mid + 1;

      }

      else

      {

         printf("找到了,下标是:%d\n", mid);

         break;

      }

   }

   if (left > right)

   {

      printf("找不到\n");

   }

   return 0;

}

  1. 编写代码,演示多个字符从两端移动,向中间汇聚。

// int right = sizeof(arr1)/sizeof(arr1[0])-2;

  Char arr1[]=”abc”;

   [a b c \0]

0 1 2  3

要求c的下标是用4-2得到c的下标2

#include<stdio.h>

#include<string.h>

#include<windows.h>

#include<stdlib.h>

int main(void)

{

   char arr1[] = "welcome to bit!!!!!!";//是字符串

   char arr2[] = "####################";

   int left = 0;

   //int right = sizeof(arr1)/sizeof(arr1[0])-2;

   int right = strlen(arr1)-1;

   while (left<=right)

   {

      arr2[left] = arr1[left];

      arr2[right] = arr1[right];

      printf("%s\n", arr2);

Sleep(1000);//休息1000毫秒  //输出项目时会停留几秒然后输出下一个

                          //引用sleep函数要加头文件

                           //#include<windows.h>

      system("cls");//system是执行系统命令的一个函数

                    //要引头文件#include<stdlib.h>

                    //cls是清空屏幕

right--;

left++; 

}

   return 0;

}

输出结果为:

w##################!

we################!!

wel##############!!!

welc############!!!!

welco##########!!!!!

welcom########!!!!!!

welcome######t!!!!!!

welcome ####it!!!!!!

welcome t##bit!!!!!!

welcome to bit!!!!!!

  1. 编写代码实现,模拟用户登录情景,并且只能登陆三次。(只允许输入三次密码,如果密码正确则登录成,如果三次均输入错误,则退出程序。)

#2023.4.7

 Strcmp函数:比较字符串str1和str2是否相同,

             相同则返回0,

不相同:前者大于后者时,返回1

       否则返回-1

语法:int strcmp(char*str1,char*str2)

#include<stdio.h>

int main(void)

{

   int i = 0;

   char password[20] = { 0 };

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

   {

      printf("请输入密码:>");    这两句在for语句里面

      scanf_s("%s",password,sizeof(password));

      if (strcmp(password , "123456")==0)   这后面没有分号;

//==不能判断两个字符串是否相等

                              //应该使用一个库函数-

   {

         printf("登录成功\n");

         break;

        }

else

      {

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

      }

   }

   if (i == 3)

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

   return 0;

}

  1. 下列代码的结果是多少?

  #include<stdio.h>

int sum(int a)

   int c = 0;

   static int b = 3;

   c += 1;

   b += 2;

   return (a + b + c);

   }

int main(void)

{

   int i;

   int a = 2;

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

   {

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

   }

      return 0;

}

答:810121416

  1. if (i = 5)死循环打印5
  2. func(1)=?

 int func(int a);

   {

      int b;

      switch (a)

      {

      case 1:b = 30;

      case 2:b = 20;

      case 3:b = 16;

      defult:b = 0;

      }

      return b;

}

答:0.因为没有break,停不下来。

9.求下列函数的输出值

(x%2),判断x是否为奇数。 偶数对2取余为0,为false;奇数对2取余为1,为true。

#include<stdio.h>

int main(void)

   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;

}

答案:hellothird

10.写代码让三个数从大到小输出

    #include<stdio.h>

int main(void)

   int a, b, c;

   scanf_s("%d %d %d", &a, &b, &c);//2,1,3

   if (a < b)

   {

      int tmp = a;

      a = b;

      b = tmp;

   }

   if (a < c)

   {

      int tmp = a;

      a = c;

      c = tmp;

   }

   if (b < c)

   {

      int tmp = b;

      b = c;

      c = tmp;

   }

   printf("%d %d %d\n", a, b, c);

   return 0;

}

11.打印3的倍数的数

    #include<stdio.h>

int main(void)

   int n = 1;

   for(n=1;n<100;n++)

   {

      if(n%3==0)

      printf("%d ", n);   

   }

   return 0;

}

12.给定两个数,求这两个数的最大公约数

     辗转相除法

#include<stdio.h>     【打印出来是6

int main(void)

   int m=24;

   int n=18;

   int r;

scanf_s("%d %d", &m, &n);

   while (r =m % n)

   {

      m = n;

      n = r;

   }

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

   return 0;

}

13.打印1000年到2000年之间的闰年

闰年:

1)四年一闰百年不闰:即如果year能够被4整除,但是不能被100整除,则year是闰年。(2)每四百年再一闰:如果year能够被400整除,则year是闰年。  

 A #include<stdio.h>

int main(void)

   int year = 0;

int count = 0;

   for (year = 1000; year <= 2000; year++)

   {

      if (year % 4 == 0 && year % 100 != 0)

      {

         printf("%d ", year);

count++;

      }

      else if (year % 400 == 0)

      {

         printf("%d ", year);

count++;

      }

printf("\ncount=%d\n", count);

   }

   return 0;

}

B#include<stdio.h>

int main(void)

{

   int year = 0;

   int count = 0;

   for (year = 1000; year <= 2000; year++)

   {

      if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))

      {

         printf("%d ", year);

         count++;

      }

   }

   printf("\ncount=%d\n", count);

   return 0;

}                           

14.打印100~200之间的素数

#2023.4.11

素数:只有1和它本身两个因数的自然数。  

试除法  13 2~12//产生2~i-1

#include<stdio.h>

int main(void)

{

   int i = 0;

   int count = 0;

   for (i = 100; i <= 200; i++)

   {

      int j = 0;

      for (j = 2; j < i; j++)//2~i-1

      {

         if (i % j == 0)

         {

            break;//break语句可一次跳到for语句最后         

         }

      }

      if (j == i)

      {

         printf("%d ", i);

         count++;

      }

   }

   printf("\ncount=%d\n", count);

   return 0;

}

代码优化:

     1) i=a*b;

      16=2*8=4*4

      所以ab中至少有1个数字<=i开平方

  1. 因为偶数绝对不可能是素数,所以在奇数里找素数。

i=101i+=2;

//sqrt -开平方的库函数,需要头文件#include<math.h>

     #include<stdio.h>

#include<math.h>

int main(void)

{

   int i = 0;

   int count = 0;

   for (i = 101; i <= 200; i+=2)

   {

      int j = 0;

      for (j = 2; j < sqrt(i); j++)//sqrt-开平方的库函数

      {

         if (i % j == 0)

         {

            break;

         }

      }

      if (j >sqrt(i))

      {

         printf("%d ", i);

         count++;

      }

   }

   printf("\ncount=%d\n", count);

   return 0;

}

“《求素数的n种境界》”

15.  关于while(条件表达式)循环体:

       条件表达式的执行次数总是比循环体的执行次数多一次

16.求下列代码结果

 #include<stdio.h>

int main(void)

{

   int a = 0,b=0;

   for (a = 1, b = 1; a <= 100; a++)

   {

      if (b >= 20)break;

      if (b % 3 == 1)

      {

         b = b + 3;

         continue;

      }

          b = b - 5;

   }

   printf("%d\n", a);

   return 0;

}

答:a=8b依次是4713161921.

17.编写程序数一下1~100的所以整数中出现多少个数字9

  #include<stdio.h>

int main(void)

{

   int i = 0;

   int count = 0;

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

   {    

      if (i % 10 == 9)//说明个位为9

         count++;

      if (i / 10 == 9)//商为9,说明十位为9

         count++;

   }

   printf("\ncount=%d\n", count);

   return 0;

}

答:20

18.分数求和

计算1/1-1/2+1/3-1/4+1/5……+1/99-1/100的值,打印出结果

//计算机上1/1+1/2+1/3

      1/2是正数1除以整数2是商00

 所以结果是1+0+0=1

想要小数就  1/2改成1.0/2

              double i=0.0

              printf(“%lf\n”);

#include<stdio.h>

int main(void)

{   int i = 0;

    double sum=0.0;

   int flag = 1;

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

   {

      sum += flag*1.0/i;

      flag = -flag;

   } 

   printf("%lf\n", sum);

   return 0;

}

19.求最大值:求10个正数中的最大值

     #include<stdio.h>

int main(void)

{  

      int arr[] = { 1,2,3,4,5,6,7,8,9,10};

      int max =arr[0]; //max是最大值,所有元素跟max比,出来的就是最大

      int i = 0;

      int sz = sizeof(arr) / sizeof(arr[0]);

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

   {

      if (arr[i] > max)

      {

         max = arr[i];

      }

   }

      printf("max=%d\n", max);

      return 0;

}

20.乘法口诀表:再屏幕上输出9*9乘法口诀表,

   #include<stdio.h>

#include<windows.h>

int main(void)

{  

   int i = 0; 

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

   {//打印一行

      int j = 1;

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

      {

         printf("%d*%d=%2d ", i, j, i * j);

//%2d指打印两位数,如果不够就补空格(这个是在后对齐2*1= 2

解决了打印出的乘法表没对齐的问题

//%-2d(是在数字前面对齐4*2=8  4*3=12

      }

      Sleep(1000);//为了好看自己加的

      printf("\n");

   }

   return 0;

}

21.二分查找:编写代码在一个整型有序数组中查找具体的某个数【要求】找到了就打印数字所在下标,找不到则输出:找不到。

   是最上面第三个题

Sizeofstrlen的区别

  1. sizeof是求取‘变量’或‘类型’所占内存空间的大小(单位:字节)

 int sz = sizeof(arr) / sizeof(arr[0]);是计算个数的

  1. strlen函数是一个库函数,是专门用来计算‘字符串’长度的,调用前要包含头文件<string.h>

22.猜数字游戏实现

1

#include<stdio.h>

#include<stdlib.h>

#include<time.h>

void menu()//菜单

{

   printf("************************\n");

   printf("***  1.play  0.exit  ***\n");

   printf("************************\n");

}

void game()

{

   /*time的头文件是<time.h>

    *NULL是空指针

    *强制类型转换成unsigned int

     Srand函数是随机数发生器的初始化函数

        原型:void srand(unsigned int seed);

         Srandrand()配合生产伪随机数列。

    *时间--是当前计算机的时间减去计算机的起始时间

    *              1970.01.01.00:00=(xxxx)

    * 拿时间戳来设置随机数的生成起始点

    */

   int ret=rand();//是生成随机数的

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

}

int main(void)

{  

   int input = 0;

   srand((unsigned int)time(NULL));//只在这里调用一次就行

   do

   {

      menu();

      printf("请选择>:");

      scanf_s("%d", &input);

      switch (input)

      {

      case 1:

         game();

         break;

      case 0:

         printf("退出游戏\n");

         break;

      default:

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

      }

   } while (input);

   return 0;

}

2

#include<stdio.h>

#include<stdlib.h>

#include<time.h>

void menu()//菜单

{

   printf("**************************************\n");

   printf("***  1.和仲达玩猜数字  0.卧床不起  ***\n");

   printf("**************************************\n");

}

void game()

{

   int ret = rand() % 100 + 1;//生成1~100之间的随机数

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

   int guess = 0;//接收猜的数字

   while (1)

   {

      printf("小虫子,来猜数字:>\n");

      scanf_s("%d", &guess);

      if (guess > ret)

      {

         printf("猜大了,蠢货。\n\n");

      }

      else if (guess < ret)

      {

         printf("蠢货,猜小了。\n\n");

      }

      else

      {

         printf("真是恭喜~,猜对了。\n\n");

         break;

      }

   }

}

int main(void)

{  

   int input = 0;

   srand((unsigned int)time(NULL));//只在这里调用一次就行

   do

   {

      menu();

      printf("打出你选择(敢选0就打洗你)/阴险脸>:\n");

      scanf_s("%d", &input);

      switch (input)

      {

      case 1:

         game();

         break;

      case 0:

         printf("不和仲达玩了吗?那退出吧。\n\n");

         break;

      default:

         printf("笨蛋,10都能选错?给我重新选!\n\n");

      }

   } while (input);

   return 0;

}

  1. go to语句(尽量少使用)

 终止程序在某些深度嵌套的结构的处理过程。

例如:一次跳出两层或多层循环。

goto语句真正适合的场景如下:

 for(...)

      for (...)

      {

         for (...)

         {

            if (disaster)

               goto error;

         }

      }

   ...

      error:

           if(disaster)

           //处理错误情况

#include<stdio.h>

int main(void)

{

again:

   printf("hello!懿酱!\n");//循环打印

   goto again;

   return 0;

}

printf("hello!懿酱!\n");

   goto again;//从这里跳到---

   printf("hello!\n");

   again://---跳到这里

   printf("懿酱!\n");

cmd---command命令行

电脑倒计时关机 程序

1}

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

int main(void)

{

/*#include<stdlib.h>//system的头文件

 *#include<string.h>//strcmp的头文件

 */

   //shoudown -s -t 60

   //system()-执行系统命令

   char input[20] = { 0 };

   system("shoudown -s -t 60");

again:

   printf("请注意你的电脑将在1分钟之内关机,如果输入:我是猪,就取消关机\n请输入>:");

   scanf_s("%s", input);//数组本来就是一个地址,不用&

   if (strcmp(input, "我是猪" == 0))

   {

      sysytem("shoudown -a");

   }

   else

   {

      goto again;

   }

   return 0;

}

2}

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

int main(void)

{

   char input[20] = { 0 };

   system("shoudown -s -t 60"); 

   while (1)

   {

      printf("请注意你的电脑将在1分钟之内关机,如果输入:我是猪,就取消关机\n请输入>:");

      scanf_s("%s", input);//数组本来就是一个地址,不用&

       if (strcmp(input, "我是猪" == 0))

      {

         sysytem("shoudown -a");

         break;

      }

   }

   return 0;

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值