C语言程序考试注意点

C语言程序考试注意点

一、概念考点

1、一个程序只能有一个main函数
2、程序都是从main函数开始和在main函数结束的
3、C语言是一种高级语言
C语言是一种结构化语言
面向过程
面向机器
面向对象 错错错错错!
//面向机器指能做一些位的操作,就是有机器语言的一些特点;
//面向过程指解决问题的一个个步骤;
//面向对象指有class之类的集合了很多功能,解决问题是面向一个个地对象有点像头文件,但是又不是头文件,你细品细品;
4、一个程序由一个或多个源程序文件组成 !!!一个源文件就是a.c这样的一个文件;
一个源文件必须有一个main函数 错!
5、C语言本身不提供输入输出语句 !像用到是printf、scanf都是<stdio.h>里面包含的
6、在每个数据声明和语句的最后必须有一个分号 对!

包括在自己写程序的时候千万别忘记;号了;
(1);常丢失在:
printf()(哇好高兴哦,要写出来了~~~,编译,灯灯~找半天没找出来,我去,这里少了个分号。。。);
scanf()
(2);还会经常出现在它不该在的地方:
for(); 错!
if(): 错!
while();错!
switch();错!
为什么?自己想;

7、所有函数的定义分为两部分:函数说明和函数体 对!!
int main(参数)是函数说明,{}里面的就是函数体;

二、预编译考点

预编译包括:
(1)#include<>导入你需要用到的头文件
常用的头文件有:
stdio.h
stdlib.h
string.h
math.h(这里面的.h是头文件的后缀,和a.c是类似的,系统在预编译的时候就通过这些文件的标识符来include)
另外:还可以include<a.c>,比如一个程序由多个源文件组成,在预编译的时候在文件1中include<a.c>就可以把a.c这个文件中的函数为文件1所用。
举个栗子:在a.c中由输出函数print,那么在文件1中include<a.c>,可以在文件1中使用print函数;
(2)宏命令
如#define M 20
在预编译的时候,程序里面出现了M,都会让20代替;
注意:在所有的预编译指令中,都不能带;号
三、标识符
标识符就是名字(函数的名字、变量的名字、常量的名字);
由字母、数字、下划线构成;
注意:不能用预留字,就是那些在C语言系统里面已经由含义的:
如:define,include,if, else ,default通通都是错的!;
预留字大全:
auto break case char const continue default
do double else enum extern float for goto if
(这里如果if变成If,就是变成大写了,就不是预留字,可以作为标识符,因为C语言是可以不区分大小写的,大小写是两种不一样的东西)
int long register return short signed static
sizeof struct switch typedef union unsigned ;
void volatile while auto
3_a 错 不能从数字开始;
_a 对 可以从下划线开始;

三、数据类型

基本知识:
一个字节(byte)是8位(bit),1KB=1024byte,1MB=1024KB=1024*1024bit;
1、整型(int short long)、浮点型、字符(整型的近亲)超级重点;
数据长度:int(要看编译器,vc++6.0是2个字节)
short(2个字节);
long(8个字节);
long long (16字节);
float(4个字节);
double(8个字节);
double double(16字节);
char(1个字节)(和ASCII有关的都是1一个字节);
ASCII(美国的标准编码转换信息American Standard Code for Information Interchange))码就是由一个字节(8bit 00000000)构成的机器码转具体字符的汇编表,总共有255(0~255)个,也就是2的8次方,千万要记住,计算机是从0开始的);
整型和浮点型(余码、补码、科学计数法)是怎么组成的,请翻阅计算机导论有关篇章;
这里有一题关于数据溢出的:

#include<stdio.h>
void main()
{
char a=255;
printf("%d\n",++a);
}

运行的结果是0,具体原因是因为数据溢出,在ASCII码里面,有8位,也就是有256个数,0~255,255的二进制表示是11111111,在加00000001的话,就是10000000,这里面的1是第9位,导致数据溢出,1被截断,剩下00000000,运行结果就为0了。

强制类型转换
(int)(a+b)和(int)a+b是不一样的
前面是将a+b的值强制转换成整型
后面是将 a的值转换后 和 b 相加

字符常量和字符串常量
技巧,看“”还是‘’,““里面可以字符串,‘’里面只能放字符
字符串和字符的区别就在于‘\0’

四、选择结构和运算知识

运算符知识:
(1)写在前面:C语言里面,0代表假,非0就是真,比如无限循环while(1){};
(2)逻辑运算符 按照运算优先级排列:!(非) &&(且) ^ (异或) ||(或)
运算的结果是1或0;

异或就是只有或才能是1 ;
自加:i++ ++i,(i++)是先使用后加,(++i)是先加再使用
求余:%后面一定要整型

a>b?假的,m=0,后面就不会再判断了,应为&&要求两边都要真,所以n还是1,
选②

选择结构
if的:
嵌套: if
else if
else if

多段式:if()
if()
if()
都是一个意思
switch的:
ch=表达式;
switch(ch)
{
case常量1 :超级重点(这里是冒号:不是分号)
case常量2 :
case常量3 :break;(如果不加break,ch跳进来后,会一直执行后面的语句)
case常量4 :
default (可有可无,不加的意义在于如果 没有和case匹配的项,则表示什么也不干)
}

五、循环结构

while(){} 先判断,再执行
do {}while();先执行,再判断
第一次的判断条件不满足,则它们的结果不一样
第一次的判断条件满足,则输出结果一样

如:

#include<stdio.h>
int main()
{   
int i,n=1;
while(n<3)
{  
    i++;
    n++;
}
printf("i=%d",i);
}

结果i=2

#include<stdio.h>
int main()
{   
int i,n=1;
do 
{  
    i++;
    n++;
}while(n<3);
printf("i=%d",i);
}

结果也是i=2
条件改成:

#include<stdio.h>
int main()
{   
int i=0,n=1;
while(n>3)
{  
    i++;
    n++;
}
printf("i=%d",i);
}

结果是i=0;

#include<stdio.h>
int main()
{   
int i=0,n=1;
do
{  
    i++;
    n++;
}while(n>3);
printf("i=%d",i);
}

结果是i=1;
for循环:
要关注循环多少次,比如:
for(i=0;i<10;i++)10次
for(i=1;i<=10;i++)10次
for(i=0;i<=10;i++)11次

六、数组、指针

这个是行指针的一个用法:

#include<stdio.h>
int main()
{
    int a[10]={1,2,3,4};
    int (*p)[10];//指向一行有10个元素的行指针
        p=a;
    int i;
    for(i=0;i<10;i++)
        printf("%d ",a[i]);
    printf("\n");
    for(i=0;i<10;i++)
        printf("%d ",(*p)[i]);
    return 0;
}

运行结果

一维数组:
定义和初始化
int a[10];或者int a[10]={1,2,3,4}(其余位数自动补为0)
注意:int a[10];则其元素的值是随机的, int a[10]={}则元素都是0

二维数组:
定义和初始化
int a[4][4]; 对
int a[][4]; 对
int a[][]; 错(第二维不能省略)
int a[4][]; 错(第二维不能省略)

指针变量:指针的名字,即标识符
指针变量的值:地址
指针的基类型:定义时候的声明 如:int p,int为指针变量p的基类型
多重指针:指针的指针,如**pp,pp=&p,p=&a,pp存放的是p的地址,p存放的是a的地址,三个变量,a ,p,pp都是不同的地址,但是p和pp都可以通过间接索引输出a的值,这样的话,pp的值其实也是地址

  • 取内容符
    & 取地址符
    *&a得到的是a的值,*p得到的是p指向的内容,&a得到的是a的地址

地址法表示数组元素:
概念:
行指针:指向行的指针
列指针:指向列的指针
行指针加变成列指针
列指针加
变成元素

#include<stdio.h>
int main()
{
    int a[4][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
    printf("%d ",a);
    printf("%d ",*a);
    printf("%d ",**a);
}

在这里插入图片描述

(1)行指针的形式:a,a+1,*(a+1)
(2)列指针的形式:a[0],*a+1
结合前面的去看下面的栗子:

  printf("%d ",a[0]+1);	//a[0]是列指针,+1是加4,这里int是4个字节
  printf("%d ",a+1);//a是行指针,+1是加16
  printf("%d ",*a+1);//*a是列指针,第1行,第2个元素的地址
  printf("%d ",*(a+1));//和a[1]等价,是列指针,但是在括号里面加的是行指针

在这里插入图片描述

总结:
//务必记住*(a+i)和a[i]是等价的
//行指针加了*,(),[ ]就变成列指针
//行指针+1,加一行的长度
//列指针+1,加一个元素的长度
//元素+1,就是加1
//一定要区分好是行还是列还是元素,再确定加多少

七、函数

函数的基本知识
形参:参照物,你们要按照我的形式把东西给我,不占内存
实参:实际存在的东西,占有内存
值传递:不可以改变实参
地址传递:可以改变实参(数组名,指针,形参加了&)

栗子:

#include<stdio.h>
void fun(int a)
{
    a=1;
}
int main()
{
    int a=0;
    fun(a);
    printf("%d",a);
}

输出结果是0

#include<stdio.h>
void fun(int a[])
{
    a[0]=1;
}
int main()
{
    int a[1]={};
    fun(a);
    printf("%d",a[0]);
}

输出结果是1

常用函数的使用注意事项
scanf函数的用法:
格式化输入:
超级重点
在这里插入图片描述
答案:③
注:如果是整型数据,比如加&
如果是字符数据,不用加&

printf用法
格式化输出:
%5d 占5列,在第5列输出该整型
%5.1f 占5列,保留一位小数输出该浮点型
其他常用格式化符号:
%o 八进制
%c 字符
%s 字符串
%ld long型
%lf double型
%e 以科学计数法输出浮点型
输出栗子:512e-10,512乘以10的负10次方,e后面必须是整型

字符串处理函数:
puts() 被printf(“%s”)代替了
gets() 形参放字符数组名
strcmp() 两个参数,前面>后面,返回正,否则返回负,相等返回0
strlen() 形参放字符数组名 已除去‘\0’
strcat() 两个参数,将后面的参数连接放到前一个参数的后面
strcpy() 两个参数,将后面的参数连接放到前一个参数的后面
strncpy() 同上
strlwr() 全部变小写
strupr() 全部变大写

八、结构体、链表、枚举、共用体、typedef、

关键字:
结构体:struct
枚举:enum在定义的时候没有等号如:enum {mon,tue,wed,Thur,Fri}
共用体:union
自定义类型:typedef
链表:其实就是成员里面由指针变量的结构体,且这个指针变量指向另外一个结构体变量
结构体知识:
定义和初始化:
struct Student{
int a;
int b;
};student={1,2};
错 画蛇添;应该把;去掉

struct Student{
int a;
int b;
};
Student a={1,2} ;
错 前面要加struct

结构体成员三种表示方法:
如果p指向一个结构体变量stu:
①stu.name
②(*p).name
③p->name

结构体数组
struct Student{
int a;
int b;
}a[2]={1,2,3,4};
printf(“%d %d”,a[1].a,a[0] .b);
结果:3,2

链表知识:
静态:

#include<stdio.h>
struct Student
{
    int num;
    float score;
    struct Student *next;
};

int main()
{
    struct Student a,b,c,*head,*p;
    a.num=1; a.score=90.0;
    b.num=2; b.score=89.9;
    c.num=3; c.score=77.8;
    head=&a;
    a.next=&b;
    b.next=&c;
    c.next=NULL;
    p=head;
    do
    {
        printf("%ld %5.1f\n",p->num,p->score);
        p=p->next;
    }while(p!=NULL);
    return 0;    
}

动态:开辟空间
p=(struct Student *)malloc(sizeof (struct Student));
malloc函数返回的是一个NULL指针(空指针),没有类型,所以要进行强制类型转换,这里知识malloc函数在链表中的一个应用

共用体:多个数据公用一段内存地址,按照最后一个输入的为准

枚举:
enum{Mon,Tue,Wed,Thu,Fri,Sat,Sun}
Mon=0,Tue=1后面以此类推,系统自动分配
enum workday=Mon相当于 enum workday=1;

typedef:
//这是一种声明,声明之后可以用其类型名定义变量,是前面几种类型的综合:
如:
typedef struct
{
int month;
int day;
int year;
}Data;

Date birthday //定义一个Data类型的变量bithday

typedef int Num[150];
Num a; //a为一个长度为150的整型一维数组

超级重点:
在这里插入图片描述
选②
union长度选最长,是int k[5],5个int的长度,int取2,所以是10
sizeof(struct date)是2+10+8=20
sizeof(max)是10
加起来就是30

九、文件操作

在进行文件操作的时候需要用到头文件

#include<stdlib.h>

打开和关闭文件:fopen(),fclose()
fgetc()
fputc()
fgets()
fputs()
putchar()
getchar()

#include<stdio.h>
#include<stdlib.h>
int main()
{
    FILE *fp;
    if((fp=fopen("file1","r"))==NULL)//fopen()是常用函数,包含两个参数
    {
        printf("cannot open this file\n");
        exit(0);
}

    
    fclose(fp);
}
  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值