暑期培训总结日记#NO.2

C语言:开始

一、C语言简介

AD1970~1973间诞生,出自肯·汤普逊&丹尼斯·里奇*的编写,在贝尔实验室,America
BCPL--new B -- C --UNIX系统--Minix--Linux                   ps:丹更6一点 更符合 C语言之父

C语言专门用于编写操作系统而产生发明的一个编程语言,所以天生适合硬件编程,也以运行速度快而著称,也非常适合实现数据结构和算法。

缺点:由于出现的时间过早,有很多缺陷,也存在着很多的陷阱,但是我们的前辈给总结了一些避免陷阱的经验教训,《C陷阱与缺陷》一本书可看。

C语言的语法很自由,但是也意味着危险。自由源于自律。C语言语法标准:

1.C89语法标准,默认是gcc编译器的语法标准

2.C99语法标准,对C语言的扩展和增强,ubuntu 16.04默认C99 -std=gnu99 指定为C99语法标准

3.C11语法标准,全新的升级

二、第一个C语言程序

                     首先一本书 《C程序设计语言》(丹尼斯·里奇)可看

Hello world

创建源文件:vim 01hello.c 创建C源文件          编写代码后保存退出

编译源文件:gcc 01hello.c 成功后得到a.out可执行文件             运行文件:./a.out 运行可执行文件

gcc 01hello.c && ./a.out 编译并执行

1 #include <stdio.h> 程序员所编写的代码大部分不是标准C代码,需要一段程序把它翻译成标准C 代码,负责翻译的程序叫预处理器,翻译的过程叫预处理,需要被翻译的代码叫预处理指令,以#开头的代码叫预处理指令#include 导入头文件 <stdio.h> 和 “stdio.h”区别是:<>从系统指定路径查找头文件并导入,””先从当前工作路径查找头文件,如果找不到再从系统指定路径查找并导入。<>多为系统头文件,””为自己头文件(规范性)

stdio.h为头文件,.h结尾均称头文件,存放辅助性代码,绝大多数是函数的说明

2

3 int main(int argc,const char* argv[])

C语言中以函数为单位来管理代码(C语言管理代码最小单位是函数),一个函数就是一段具有某项功能的代码段

main函数:是整个程序的执行入口,必须有且只能有一个,其调用者是操作系统,它的返回值给了操作系统(echo $?可查看),它的值能反应出程序是如何结束的,一般有三类:0,表示一切正常;正数:出现异常;负数:出现错误(别人的错误叫异常,自己的错误叫错误)

int是一种数据类型,表示main函数的执行结果是一个整数

4 {

5     printf("Hello world !\n");

printf&scanf 标准库中函数,输出输入数据。转义字符:键盘上一些无法直接打印显示的符号,用一些特殊的字符组合来表示,即转义字符,如:

        \n   换行

        \r    Linux中回到行首(光标)

        \t    制表符,相当于Tab,用于输出格式对齐

        \b   退格键,backspace

        \a   铃响

        \\    表示一个\

        %%  表示一个%

6     return 0;

return功能有两个:1.结束函数的执行2.返回一个结果给函数的调用者

7 }

一个中文字符为两到三个英文字符,因此中文;和英文;报错数目

C语言中以分号作为一行代码的结束,用大括号划分区域

三、编译器

        负责把人能看得懂的记录着代码的文件,翻译成计算机能看得懂的二进制文件,由预处理器、编译器、链接器组成。

gcc是由GNU社区为了编译Linux内核代码而开发的一款免费的编译器,gcc常用的编译参数:

        -E 只显示预处理的结果到终端

        -std=gnu99 设置C99语法标准

        -c 只编译不链接

        -o 指定编译结果的名字     -oname==-o name

        -S 生成汇编代码

        -I(this is big i) 指定头文件的加载路径    -I 加载路径         (最高优先级)

        -Wall 尽可能多地产生警告(严格检查)

        -Werror 把警告当错误处理

        -l (this is small L) 指定要加载的代码库                   -lm 数学库

四、C代码变成可执行文件的详细过程:

  1. 预处理:把源文件翻译成预处理文件 gcc -E xxx.c 显示预处理结果,未生成文件到终端,gcc-E xxx.c -o new.i 可生成以.i结尾的预处理文件,-o功能。
  2. 编译:把预处理文件翻译成汇编文件 gcc -S new.i 生成new.s .s文件后缀小写 汇编文件
  3. 汇编:把汇编文件翻译成二进制的目标文件 gcc -c new.s 生成 new.o .o结尾目标文件
  4. 链接:把若干个目标文件合并成可执行文件 gcc a.o b.o c.o…默认生成a.out可执行文件

五、C语言的文件类型:

.c 源文件

.h 头文件

编译结果文件.h.gch,它会被优先使用

.i 预处理文件

.s 汇编文件

.o 目标文件

.a 静态库文件

.so 共享库文件

六、存储空间的单位:

Bit 比特,1比特存一二进制位,只能存储0或1,计算机中存储数据的最小单位

字节byte 8bit=1byte 八位一字节,计算机存储器描述存储容量的基本单位

KB 1KB=1024byte MB、GB、TB、PB……

七、数据类型:

        为什么对数据进行分类:现实生活中的数据本身就自带类别属性;对数据进行分类,可以节约存储空间,提高运行速度

C语言中数据分类为两大类,自建(程序员自己设计的类型、结构、联合、类);内建(C语言自带的类型)                                      注意运算符 sizeof 可以计算类型、变量的字节数

整型:signed 有符号:

signed char 1B -128~127

signed short 2B -32768~32767

signed int 4B ±20亿

signed long 4/8B取决于操作系统位数

signed long long 8B ±9开头的19位整数

unsigned 无符号 同上 signed变为unsigned

char 0~255

short 0~65535

int 0~40亿

long long 0~1开头的20位整数

(首位正负)不加signed =加 ;unsigned必须加,可缩短用(由于定义无符号整型时比较麻烦,C标准库中把这些类型重定义成一些新的简单的类型名——需要导入头文件<stdint.h>:uint8_t uint16_t uint32_t uint64_t 数字代表位 有符号的:int8_t int16_t int32_t int64_t)

浮点型:有小数部分的类型

float 4B 单精度

double 8B 双精度

long double 12/16B  

注意:小数点后六位有效,由于采用一定的算法对真实的浮点型数据到二进制数据进行转换,这个过程非常耗时间比存储、读取整型要慢得多,建议编程时尽量选用整型数据

Doubule num

If(num < 0.000001 && num>-0.000001) --0值

模拟型:

1.字符型:char 字符就是符号或图案,在内存中存储的依然是整数,需要显示出字符时,根据ASCII表中对应的关系显示出对应的字符或图案 ’0’ ASCII 48 | ‘\0’ ASCII 0 特殊字符

2.布尔型:bool C语言中没有真正的布尔型,先有的C语言后有的布尔型,在头文件stdbool.h中对布尔类型进行了模拟,加了头文件才可用bool false true

八、变量与常量:                https://unbug.github.io/codelf/变量名取名网站

什么是变量:程序运行期间数值可以发生变化的叫做变量,相当于一个存储数据的盒子。

定义: 类型名 变量名; int num;

变量名取名规则:

1.必须由字母数字下划线__组成

2.不能以数字开头

3.不能与C语言32关键字重名,要求要能默写32关键字

数据类型相关:
    内建类型:
        char  short  int  long  void  float  double     7
    自建类型:
        struct  union  enum  sizeof                     4
    类型限定符:
        auto  const  static volatile register typedef extern signed unsigned                          9
流程控制相关:
    分支:
        if   else    switch  case  default               5
    循环:
        for  while  do                                  3
    跳转:
        break   continue   goto   return                4

4.见名知意include功能&类型&作用范围……取名尽量高级(好好学英语)

使用:

1.赋值——变量名 = 数值;“=”是赋值,非等于

2.参与运算——(变量名*10)+2;C语言中变量的初始值是随机值,为了安全起见,一般在定义时初始化为0 类型名 变量名 = Number //初始化而非赋值。

变量的输入与输出:

int printf(const char *format,...);功能:输出数据,format用双引号””包含的提示信息以及占位符;...:变量名列表;返回值:输出字符个数

类型占位符:C语言中通过类型占位符来传递变量的类型:signed %hhd %hd %d %ld %lld

unsigned %hhu %hu %u %lu %llu 整型;float %f  double %lf  long double%Lf 浮点型;char %c  字符型。

练习1:定义各种类型的变量并初始化,使用Printf显示值

 

int scanf(const char *format,...);输入数据 format(“双引号包含的占位符”);,,,:变量地址列表

返回值:成功输入的变量的个数。注意,scanf中需要提供变量的地址--&变量名 = 变量地址

&取地址符

练习2:定义各种类型的变量并初始化为0,使用scanf输入,使用Printf显示值

#include <stdio.h>
#include<stdint.h>
int main(int argc,const char* argv[])
{
    char n1 = 0;
    short n2 = 0;
    int n3 = 0;
    long n4 =0; 
    long long n5 =0; 
    unsigned char n6 = 0;
    unsigned short n7 = 0;
    unsigned int n8 = 0;
    unsigned long n9 =0; 
    unsigned long long n10 = 0;
    float n11 = 0;
    double n12 = 0;
    long double n13 = 0;
    printf("input n1 n2 n3 n4 n5 n6 n7 n8 n9 n10 n11 n12 n13 n14\n");
    scanf("%hhd%hd%d%ld%lld%hhu%hu%u%lu%llu%f%lf%Lf%c",&n1,&n2,&n3,&n4,&n5,&n6,&n7,&n8,&n9,&n10,&n11,&n12,&n13,&n14);
    printf("%hhd %hd %d %ld %lld %hhu %hu %u %lu %llu %f %lf %Lf %c",n1,n2,n3,n4,n5,n6,n7,n8,n9,n10,n11,n12,n13);
    return 0;
}
     

常量:程序运行期间数值不能改变的叫做常量

100默认int 类型    100l long类型    100ll long long类型    100u unsigned int类型

100lu unsigned long类型

3.14默认double类型 3.14f float类型 3.14l long double 类型

九、格式化输入输出:

%nd  n显示n个字符宽度,不够则左边补充空格,右对齐;-n同,右边补充空格,左对齐

%0nd n显示n个字符宽度,不够补0,右对齐;无后面补0

%n.mf 显示n个字符宽度包括小数点,不够补空格,m为小数点后显示多少位,超出则四舍五入

%g 省略(不显示)小数点后多余的0

十、运算符:

 

1.自变运算符:++\-- 使变量值自动+1/-1

前自变++n --n 立即生效           后自变n++ n-- 下一行语句才生效

不要在一行代码中多次使用自变运算符

2.算术运算符:+-*/ %取余 整数相除结果一定为整数,只保留整数部分  /%除数不能为0,否则就会浮点数例外、核心已转储(用这个数才会),这是个运行报错,一旦产生程序立即停止,后面不再执行

3.关系运算符:>  <  >=  <=  ==  != 比较的结果有1和0,比较的结果可以继续参与后续的运算,注意与日常数学运算规则差别。==时变量放后常量放左易免错

4.逻辑运算符:逻辑与&& 逻辑或|| 逻辑非! 先把运算对象转换成逻辑值,0转换为逻辑假,非零转换为真,A && B 一假为假       A || B 一真即真          !A 求反

&& 和 ||短路特性:当左边部分结果值可以确定整个表达式的结果时,右边部分不执行

5.三目运算符:运算的对象有三个部分,A?B:C 判断A为正则执行B,否则执行C

6.赋值运算符:=  +=  -=  *=  /=  %=

7.位运算符:按位与& 按位或| 按位非~   等

单目优先级最高,其次双目,最后三目,赋值很后面,大概顺序1~7

十一、分支语句:

If (表达式){            //单分支

//表达式为真执行此处代码

}

If ……

Else{    //双分支

  // 前部分表达式为假则执行此处代码

}

If……

Else if ……

//哪处为正执行哪处代码,否则执行else代码,else可无

Else //多分支

作业:

1.输入三个整数,从小到大显示

#include <stdio.h>

int main(int argc,const char* argv[])
{
    int num1 = 0,num2 = 0,num3 = 0,exchange = 0;
    printf("Please input three different numbers:");
    scanf("%d%d%d",&num1,&num2,&num3);
    if(num1>num2)
    {   
        exchange=num1;
        num1=num2;
        num2=exchange;
    }   
    if(num1>num3)
    {   
        exchange=num1;
        num1=num3;
        num3=exchange;
    }   
    if(num2>num3)
    {   
        exchange=num2;
        num2=num3;
        num3=exchange;
    }   
    printf("%d %d %d",num1,num2,num3);
    return 0;
}

2.输入一个年份判断是否是润年(能被4整除,不能被100整除,能被400整除)

#include <stdio.h>

int main(int argc,const char* argv[])
{
    printf("Please input a year:");
    int year=0;
    scanf("%d",&year);
    if (year%4==0 && year%100!=0)
    {   
        printf("this year is a leap year");
    }   
    else if (year%400==0)
    {   
        printf("this year is a leap year");
    }   
    else 
    {   
        printf("this year is not a leap year");
    }   
    return 0;
}

3.输入一个年份和月份,判断该月有多少天

#include <stdio.h>

int main(int argc,const char* argv[])
{
    int year=0,month=0,t=0;
    printf("Please input a year:");
    scanf("%d",&year);
    if (year%4==0 && year%100!=0)
    {   
        printf("this year is a leap year");
        t=1;
    }
    else if (year%400==0)
    {   
        printf("this year is a leap year\n");
        t=1;
    }
    else 
    {   
        printf("this year is not a leap year\n");
    }
    printf("Please input a month:");
    scanf("%d",&month);
    switch(month)
    {   
        case 1:printf("this month has 31 days");break;
        case 2:printf("this month has %d days",t==1?29:28);break;
        case 3:printf("this month has 31 days");break;
        case 4:printf("this month has 30 days");break;
        case 5:printf("this month has 31 days");break;
        case 6:printf("this month has 30 days");break;
        case 7:printf("this month has 31 days");break;
        case 8:printf("this month has 31 days");break;
        case 9:printf("this month has 30 days");break;
        case 10:printf("this month has 31 days");break;
        case 11:printf("this month has 30 days");break;
        case 12:printf("this month has 31 days");break;
        default:printf("Please input correct month");
    }
    return 0;
}

4.输入一个成绩(0~100),判断等级(>=90 A;>=80 B;>=70 C;>=60 D;<60 E;other 成绩有误)

#include <stdio.h>

int main(int argc,const char* argv[])
{
    float grade=0;
    printf("Please input grade:\n");
    scanf("%f",&grade);
    if(grade>100)
    {   
        printf("the grade your input is wrong");return 0;
    }   
    if (grade>=90)
    {   
        printf("A");
    }   
    else if (grade>=80)
    {   
        printf("B");
    }   
    else if (grade>=70)
    {   
        printf("C");
    }   
    else if (grade>=60)
    {   
        printf("D");
    }   
    else if (grade<60&&grade>=0)
    {   
        printf("E");
    }   
    else 
    {   
        printf("the grade your input is wrong");
    }   
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

河马天上飞

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值