014-C语言复习

014-C语言复习

一、C语言中的基本概念

1)程序:为了控制计算机而编写的指令的集合;
程序=数据结构(做菜中用到的容器)+算法(做菜的步骤);
编写程序的工具:C,C++,PYTHON, JAVA GO,JS,C#;

2)软件:软件=程序+数据+文档
软件分类:
操作系统软件:主要负责系统资源的一个分配和任务的调度;
应用软件:为了实现某一个功能而编写的程序;

3)标识符:在计算机中,可以用作名字的字符集合;
只能包含字母,数组和下划线组成;
不能以数组开头;
不能使用C语言中的关键字;

二、C语言的特点

1)C语言是一门高级的面向过程的编译型语言
2)执行效率比较高
3)可移植性比较强

三、C语言的开发步骤

编辑程序》》编译程序》》执行程序
printf(“hello world”) >>编译>>11010001001

编译程序细分为以下几个步骤:
预处理》》编译》》汇编》》链接》》可执行程序
.i>>.s>>.o

四、开发C程序的工具

linux: vim(它是一个编辑器,负责代码的编写) +gcc (编译器)
code::blocks
windows : dev-c++(不推荐),vs

编写一个程序: vim C语言的源文件名
编译程序: gcc 源文件名 或者 gcc -o mytest 源文件名
执行程序: ./a.out ./mytest

五、变量与常量

变量,常量是构成我们程序的一个最小的单元;
常量:在程序的执行过程中不被改变的量(比如人的性别)
整数类型: 描述年龄
小数类型(浮点类型):描述体温,体重
字符串:描述人的爱好
字符类型
变量:在程序执行过程中可以被改变的量(比如人的年龄,体温)

变量定义: [存储类型] 数据类型 变量名;
存储类型:[static/auto/register/extern]
数据类型:[int/short/long/float/double/char]
变量名:符合标识符的规则

变量的初始化:
两种方式: 定义时直接初始化 int a=10;
先定义后初始化: int a; a=10;

使用变量主要:
1)变量一定要先定义,后使用;
2)变量名的命名做到见名知意;
3)命名变量的时候,一个单词不能表达其意思,可以用多个单词进行描述: getValue ,get_value;
4 )变量命名时候一般要用小写,C语言对大小写是敏感的。
5)多个文件引用的公共全局变量,建议在变量名前加上模块名: GUI_getValue;

六、C语言中的数据类型

  • C语言中的基本数据类型:整数类型(short, int, long),浮点类型又叫实型(float ,double),字符类型(char)C99标准新增:布尔类型bool,(只有两个值true false),包含头文件 “stdbool.h”;
  • 构造类型:数组,结构体,共用体 ,枚举;
  • 指针类型;
  • 空类型 void ,可以用来修饰指针变量,还可以用来修饰函数类型 void *a;
1)整数类型(int)
整数类型: short [int],  int ,   long [int] ,区别在于表示数据的范围不一样;
                        2           4      >=4


	类型修饰符:signed , unsigned  ,通过类型修饰符指定一个变量是否可以表示一个负数
              [signed]    int  a; //定义变量 没有显示的指定类型修饰符,则认为是有符号的
			  unsigned   int a;  
	整形的常量后加上一个大写的L或小写的l用于指定这个常量是一个长整形
				
	分类: 十进制整数:10,8080                     0~9
          八进制: 以0开始    012                 0~7
          十六进制:以0x或者0X开头  0xa           0~9 a~f
          二进制:0b1010                         0~1        部分编译器支持
						   
   	      十进制转换二进制:		依次除2 保留余数, 从下往上    
  	      二进制整数转十进制:  依次程序2的对应位次方,最后依次相加
				
 	      小数转换成二进制:
 	      0.125    对小数部分乘2,取整数放在小数点的后边,只能小数点后是0为止
          0.125 *2==0.250===0
          0.250*2===0.5 ====0
          0.5*2====1.0====1
          1.0*2====x  停止转             0.125=== 二进制小数 0.001  
				
 		  二进制小数转换成十进制小数:从小数点后开始,依次乘以2的负一次方  ,负二次方 依次类推
          二进制小数:0.001
 	      换算为十进制小数位:0*1/2 +0*1/4+1*1/8==0.125
2)浮点类型又叫实型
分两种:float   double

    12.3f 默认写的小数其实是一个double,如果在其后加上一个f则表示未单精度类型
    2signed , unsigned 可以修饰我们的浮点类型(有符号,无符号)
    3float4个字节,double 8个字节
    IEEE 754规则定:(-1^S*M*2^E	  

    float(4byte)5.5   ===101.1
    S        E                 M
    -    --------    ----------------------------
    1bit  表示小数的正负 ===S ,s=0表示是一个正数                0
    8bit  表示指数位                     21.011*2^223bit  有效数据                    1.011
IEEE 754规定了四种表示浮点数值的方式:单精确度(32位)、双精确度(64位)、延伸单精确度(43比特以上,很少使用)与延伸双精确度(79比特以上,通常以80位实现)。 只有32位模式有强制要求,其他都是选择性的。
3)字符类型(char)

本质上来说一个单字节的整数类型;

1# 如果表示一个字符类型 ,用单引号进行包裹 ‘a’ 存放ASCII标准定义的字符
2# 表示范围 -127 ~128 无符号:0~255
3# 字符类型存储的时候,存的是该字符对应的编码值: ‘A’===65
4# 字符类型可以直接和整数类型进行常规的运算 : ‘A’>10

4) 补充:

如何定义一个符号常量:

#define  KY  20   
//符号常量名建议大写   

如何定义一个常变量:

const  数据类型  变量;  //定义一个只读变量

七、类型转换

类型转换:隐式转换,强制类型转换
隐式转换:char>>short>>int>>long>>double
float>>double ‘a’+2.3
两个不同的类型进行运算的时候: ‘a’+10
赋值的时候: int a=‘A’;
参数传递: test(2.3f) ; void test(double f1);

​ int a=2.3;
​ 强制类型转换: (类型名)(表达式)
int a=2; (double)a;

​ 运算符的优先级:表达式在参与运算符,优先根据优先级的顺序执行,如果优先级一样,则按结合方向进行运算

1+2*3/5
*p++===*(p++

八、标准的输入与输出语句

  1. 使用标准输入与输出语句,需要先包含对应的头文件 #include “stdio.h”
  2. 标准输出语句: printf(“格式化字符串”,[参数列表]);采用不定长的参数 stdarg
    格式符串: 普通字符,格式化字符(%d,%s,%c,%f,%p)
    1#参数列表不是必须的,可以省略
    2#格式化字符个数要和参数个数要一致,类型也要一致: printf(“%d–%d”,11.2,22);
    3# 打印一个带%字符,输入两个%%; printf(“%d%%”,20); ====20%
putchar('A')
  1. 标准输入语句: scanf(“格式化字符串”,[参数列表]);
    1# 格式化字符串尽量只包含格式化符,不要包含普通字符
scanf("%d--%d",&a,&b);
printf("%d",a);
getchar()

九、程序结构

程序三大结构:顺序结构,选择结构,循环结构

顺序结构:

​ 程序语句从上往下依次执行。
​ int a=10;
​ int b=3;
​ a=a+b;

选择结构:

​ 根据条件是否满足来确定某个语句块是否被执行
​ int a=x
​ if(a==red)
​ printf(“not pass”);
​ else
​ printf(“pass”);

选择结构: 单分支结构,双分支结构,多分支结构

单分支结构:
if(条件表达式)   
{
	语句块
}

1#条件表达式:可以有1个也可以有多个
2#当有小括号中有多个表达式的时候,一般用逻辑运算符(&&,||,!)进行连接
3# 根据条件表达式计算结构,如果是一个0 表示不成立,如果不是0 就表示是成立
4# 即使语句块只有1条语句,大括号最好加上。

双分支结构:
if(条件表达式)   
{
    语句块   //再嵌套if结构
}
else if(条件表达式)
{
    语句块   //再嵌套if结构
}
多分支结构:

if构建多分支结构, switch构建多分支结构

if(条件表达式)   
{
    语句块   //再嵌套if结构
}
else if(条件表达式)
{
    语句块   //再嵌套if结构
}
else if(条件表达式)
{
    语句块   //再嵌套if结构
}
...
else
{
    语句块   //再嵌套if结构
}
switch(表达式)
{
    case 常量表达式:语句块;break;
    case 常量表达式:语句块;break;
    case 常量表达式:语句块;break;
    case 常量表达式:语句块;break;
    default : 语句块;
}

1# 先对表达式求值,然后依次比较case后的常量,如果相对,则执行对应的语句块
2#执行语句块后没有break,则会将剩余的语句块全部执行完。,注意语句块有break和没有break的指向差别
3#case后边必须是一个常量值或一个常量的表达式,不能时变量
4# case 后的常量都没有匹配上,才会执行defualt后的语句块
5#defualt可以省略
6# switch后的表达式计算结构只能是一个整数或字符型(char)

循环结构:

根据循环条件是否成立来重复执行某一个语句块;

1) for循环
for(初始表达式;条件表达式;更新表达式)
{
    循环体;
}

1# 初始表达式只会被执行一次 ,初始表达式可以有一个,也可以有多个,也可以一个都没有

for(int i=1;i<=120;i++)
{
    printf("学习一天")}

int i=1;
for(;i<=120;i++)  //for(int i,i=0;i<=120;i++)
{
    printf("学习一天")}          

2#条件表达式可以有多个,也可以一个都没有,条件表达式成立则执行循环体,不成立,就会跳出for循环
for(int i=0,y=3;i<=120 && y==30;i++)

3# for循环的执行流程:
初始化表达式》》执行条件语句Y>>循环体》》更新表达式》》执行条件》》循环体。。。。》》条件语句N则跳出循环

4#用for构建死循环: for(;;) ,如果条件表达式被省略,则认为是成立

2) while循环
while(条件表达式)
{
    循环体 
}

while(1)
{
    
}

1#执行流程:先检测条件表达式是否成立,然后再确定是否执行循环体;

int i=1;
while(i<=120)
{
    printf("学习一天");
    i++;
}

2#循环结构的选择: 如果循环次数比较确定的情况下,推荐使用for循环,如果不确定循环次数,推荐使用while(循环);

3) do…while
do
{
    循环体
}
while(条件表达式);

特点:循环体至少被执行一次	
4)goto关键字构建循环

goto是一个无条件转移语句,
语法格式: goto 语句标号;
跳转的标号处: 语句标号:语句块

注意:1)goto只能在一个函数内部进行跳转,不能跨函数进行跳转
2)goto会破坏程序的层次性,所以在程序中尽量少用

int sum=0
for(int i=0;i<=5;i++)
{       
    sum=sum+i;
}
print("%d",sum);

//计算1到5之和  goto向前跳转
int i = 0, sum = 0;
ss: if (i <= 5)
{
    sum = sum + i;
    i++;
    goto ss;
}
printf("%d\n", sum);

//向后跳转
int sum = 0;
for (int i = 0; i <= 5; i++)
{
    if (i >= 3)
    {
        goto ss;
    }
}
ss:printf("%d\n", sum);
printf("end");
小结:

如果我们要结束一个循环:
1)等待条件语句不成立的时候
2)在循环体中使用break这个关键字
3)goto这个关键字可以帮助我们跳出循环
4)return可以结束一个循环
continue:结束本次循环,但是不会跳出;

十、数组

(高级的数据类型,同时它也是一个构造类型)

1)为什么要引入数组:构建一群匿名变量的集合;

2)数组的定义:存放相同数据类型的有序集合;

3)特点:
数组中的每一个元素的类型要相同;
有序的,通过索引对其进行访问;

4)定义数组类型: 类型名称 数组名[常量表达式];
int arr[10];
1#数组名也要符合标识符的规则
2#[]中不能包含变量

5)初始化数组(完全初始化,部分初始化)
完全初始化: int arr[3]={11,22,33};
部分初始化: int arr[4]={11,22} ; //剩余未初始化的将被赋值为0 ;
int arr[4]={0}; //将数组中的所有元素全部初始化为0;

6)访问数组中的元素: 数组名[索引];
//索引只能是一个大于等于0的整数,小于数组的元素个数

7)修改数组中的一个值: 数组名[要修改元素的索引]=新值;
arr[1]=100;

  1. 用printf打印一个数组的时候,它是不会打印出数组中的所有元素,需要通过循环遍历才可以;
for(int i=0;i<4;i++)
{
    printf("%d",arr[i]);
}
#define LEN  10
 int arr[LEN];

9)如果计算数组中 的元素个数: sizeof(数组名)/sizeof(数组名[0]);
在C语言中,数组名代表首元素的地址,也是一个指针常量,

10)二维数组

int arr[3][4]; //代表有3行4列,存放3个一维的数组,第一维数字可以省略 但是最后一维不可以省略
int arr[3][4]={
    11,22,33,
    。。。。
}

11)字符数组
char 数组名[元素的个数];

初始化: char ch[3]={‘a’,‘b’,‘c’};
char ch[3]={“abc”};
char ch[3]=“abc”;

在C语言中,C语言并没有提供字符串类型,它是通过字符数组来表示一个字符串

  char ch[3]={'a','b','\0'};
  printf("%s",ch);
   'a'   "a"

C语言也提供了一些处理字符串的函数:
首先要包含对应的头文件:#include <string.h>

​ 1)获取长度: strlen() 获取字符串中字符的个数 不包括\0
​ 2)拼接字符串: char *strcat( char *str1, const char *str2 );
​ char ch[20] = “yueqian”;
​ printf(“%s”,strcat(ch, “ljs”));
3)比较字符串: int strcmp( const char *str1, const char *str2 );
4)字符串的复制: char *strcpy( char *to, const char *from)
​ char ch1[20] = “yueqian”;
​ char ch2[20] ;
​ strcpy(ch2,ch1)
​ 指定个数进行复制:char *strncpy( char *to, const char *from, size_t count );

5)strstr

#include <ctype.h>
1 int isalnum(int c)
该函数检查所传的字符是否是字母和数字。
2 int isalpha(int c)
该函数检查所传的字符是否是字母。
3 int iscntrl(int c)
该函数检查所传的字符是否是控制字符。
4 int isdigit(int c)
该函数检查所传的字符是否是十进制数字。
5 int isgraph(int c)
该函数检查所传的字符是否有图形表示法。
6 int islower(int c)
该函数检查所传的字符是否是小写字母。
7 int isprint(int c)
该函数检查所传的字符是否是可打印的。
8 int ispunct(int c)
该函数检查所传的字符是否是标点符号字符。
9 int isspace(int c)
该函数检查所传的字符是否是空白字符。
10 int isupper(int c)
该函数检查所传的字符是否是大写字母。
11 int isxdigit(int c)
该函数检查所传的字符是否是十六进制数字。

//编写一个程序,检测我们输入的字符串是否同时包含大写字母,小写字母和特殊符号

#include <stdio.h>
#include <ctype.h>
#include <string.h>

/* int main()
{
	int i=0,sum=0;
	ss:if(i<=5)
	{
		sum+=i;
		i++;
		goto ss;
	}
	printf("%d\n",sum);
	return 0;
} */
int main()
{
	int x=0,y=0,z=0;
	
	char a[20]={0};
	printf("请输入您的密码:");
	scanf("%s",a);
	int i;
	for(i=0;i<strlen(a);i++)
	{
		if(a[i]>=65&&a[i]<=90)
			x=1;
		else if(a[i]>=97&&a[i]<=122)
			y=1;
		else if(!(a[i]>=48&&a[i]<=57))
			z=1;
	}
	if(x==1&&y==1&&z==1)
		printf("密码合法\n");
	else
		printf("密码不合法\n");
	return 0;
}

#include <stdlib.h>
字符串转浮点型或整数类型
atof 字符串类型的值转换成一个 double “2.1”>>2.1
atoi 字符串中的数值转换为一个整数类型 “89”>>89

整数类型或浮点型转换成字符串:

char ch[100] = { 0 };
sprintf(ch, "%d*%d=%d", 10, 20,10*20);
sprintf(ch, "%f", 2.3);
printf("%s", ch);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Three笔记

有用的话赏点吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值