C语言 学习笔记

前言:为更好地学习数据结构,粗略的自学了C语言,以下为相关笔记整理。

一、C语言基本语句

1.固定格式

由头文件和主函数组成

#include
int main()
{
     
	...
	return 0;
}

2.printf语句

格式:

printf("xxxx");

\n换行(最后一个默认有) \t空格

3.数据类型:int,float,double,char

int——整数型

int a = 3;

float——小数型(小数点后位数较少)

float a = 3.14;

double——小数型(小数点后位数较多)

double a = 3.14;

char——字符型

char a = 'A';

例题:请编程序将hello加密,加密规律是:用原来的字母后面第一个字母代替原来的字母。

 #include
int main()
{
     
  char c1='h',c2='e',c3=c4='l',c5='o';
  c1 = c1+1;
  c2 = c2+1;
  c3 = c3+1;
  c4 = c4+1;
  c5 = c5+1;
  printf("加密后是%c%c%c%c\n",c1,c2,c3,c4,c5);
  return 0;
}

运行结果:ifmmp

4.printf语句输出int,float,double,char

eg:

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

%d——整数,%f——小数,%c——字符、

5.scanf语句输入int,float,double,char

ps:此处的scanf与python中的input类似

eg:

int a,b;
scanf("%d,%d"&a,&b)

int——%d

float——%f

double——%lf

char——%c

例题:编写程序求两个数的平均数。

#include
int main()
{
     
	int a,b,s;
	scanf("%d,%d",&a,&b);
	s = (a+b)/2
	printf("%d与%d的平均数为%d\n",a,b,s);
	return 0;
}

运行结果:(键盘输入)23,45——23与45的平均数为34

6.putchar(),getchar()语句

ps:类似于python中的input,print(针对于字符型)。

例题:编写程序将AB转换为小写

#include
int main()
{
     
	char a,b;
	a = getchar();
	b = getchar();
	a = a+32;
	b = b+32;
	putchar(a);
	putchar(b);
	return 0;
}

运行结果:(键盘输入)AB——ab

7.数学运算

  1. abs(x)——整数x的绝对值
  2. fabs(x)——求x的绝对值
  3. sin(x),cos(x),tan(x)——求sinx,cosx,tanx
  4. exp(x)——求e的x次方
  5. pow(x,y)——求x的y次方
  6. sqrt(x)——求根号下x
  7. log(x)——求lnx
  8. log10(x)——求lgx

三个小知识点

1.%m.nf (m为占位格,nf为保留n为小数,小数点也占一格,m为正时空格加前面,为负时空格加后面)

2.%e (科学计数法,eg:123.456——1,234560e+002 = 123.456*10的二次方)

3.(int)(表达式) (将表达式结果强制转成整形,即抹去表达式结果中的小数点)

二、选择语句

1.if语句

if(表达式)//注意:if和else后面没有分号
{
     
  ...
}
else if(表达式)
{
     
  ...
}
else
{
     
  ...
}

嵌套式:

if(表达式)
{
     
  ...
}
else
{
     
  if(表达式)
   ...;//只有一个条件时可以不用大括号
  else
   ...;
}

例题:输入两个实数a,b,按数值由小到大的顺序输出这两个数

#include
int main()
{
     
	double a,b,t;
	scanf("%lf,%lf",&a,&b);
	if(a>b)
	{
     
      t=a;
      a=b;
      b=t;
	}
	printf("%f,%f\n",a,b);
    return 0;
}

2.常见运算符号

1.算术运算符
C语言 学习笔记_第1张图片

2.自增自减运算符
在这里插入图片描述

3.关系运算符
C语言 学习笔记_第2张图片

4.逻辑运算符
在这里插入图片描述

5.三目运算符

表达式1?表达式2:表达式3

先判断表达式1的值是否为真,若真执行表达式2;若假执行表达式3.

6.运算符优先级比较
C语言 学习笔记_第3张图片

例题:输入一个字符,判断它是否为大写字母,若是则将其转换成小写字母,若不是则不转换,然后输出最后得到的字符。

#include
int main()
{
     
  char ch;
  scanf("%c,&ch");
  if(ch>='A'&&ch<='Z')
  	ch=ch+32;
  printf("%c\n",ch)
  return 0; 
}

3.switch语句

switch(整型变量或字符型变量)
{
     
  case常量1:语句1;break;
  case常量2:语句2;break;
  .
  .
  default:语句;break;//可省略该子语句
}

例题:某课成绩原为A,B,C三个等级,现要将其转成百分制分数段,规则是:A等,B等转成70~100,C等转成<70。请编写一程序,等级由键盘输入,输出分数段。

#include
int main()
{
     
  char dengji;
  scanf("%c",dengji);
  switch(dengji)
  {
     
    case'A':
    case'B':printf("该生分数为70~100\n");break;//相同可省略
    case'C':printf("该生分数为<70\n");break;
    default:printf("该生的等级输的不对!\n");break;
  }
  return 0;
}

三、循环语句

1.while语句

while(表达式)
{
     
  执行代码块
}

ps:表达式一般为关系表达式或逻辑表达式,当表达式的值为假时不执行循环体,反之则循环体一直执行。

2.do-while语句

do
{
     
  执行代码块
}
while(表达式);//注意:这里有分号

ps:do-while语句与while语句不同之处在于,前者至少要循环一次语句再判断条件,后者先判断。

3.for语句

for(表达式1;表达式2;表达式3)
{
     
  执行代码块
}

ps:可以省略表达式1或表达式3,但是两个分号不可以省略(;表达式2;)

1.执行表达式1(多为赋值语句),对循环变量做初始化;

2.判断表达式2(关系表达式),若真,则执行代码块,然后向下执行;若假,则结束循环;

3.执行表达式3(循环变量的步进值),(i++)等对于循环变量进行操作的语句;

4.执行for循环中执行代码块后执行第二步;第一步初始化只会执行一次;

5.循环结束,程序继续向下执行。

总结

在知道循环次数的情况下更适合使用for循环

在不知道循环次数的情况下应考虑使用while循环或do-while循环:

  • 如果有可能一次都不循环应考虑使用while循环
  • 如果至少循环一次应考虑使用do-while循环

本质上讲三者可以相互转换的

例题:打印三角形星星堆

#include 
int main()
{
     
    int i, j, k;
    for(i=1; i<5; i++)//i++为自加1
    {
     
        /* 观察每行的空格数量,补全循环条件 */
        for(j=i; j<5; j++)  
        {
     
            printf(" ");    //输出空格
        }
        /* 观察每行*号的数量,补全循环条件 */
        for( k=0;k<2*i-1;k++) 
        {
     
            printf("*");   //每行输出的*号
        }
        printf("\n");     //每次循环换行
    }
    return 0;
}

4.结束语句之break语句

在多层循环中,一个break语句只跳出当前整个循环

5.结束语句之continue语句

结束本次循环开始执行下一次循环

四、数组

1.数组

数组:连续的,大小固定并且里面的数据类型一致的内存空间

声明: 数据类型 数组名称[长度]

初始化:

  1. 数据类型 数组名称[长度n] = {元素1,元素2…元素n};
  2. 数据类型 数组名称[] = {元素1,元素2…元素n};
  3. 数据类型 数组名称[长度n];数组名称[0] = 元素1;数组名称[1] = 元素2;数组名称[n-1] = 元素n;

ps:下标均以0开始,初始化时数组内元素的个数不能大于声明的数组长度

2.一维数组

数据类型 数组名称[长度n]

eg:

int a[5] = {
     1,2,3,4};//可以少于长度,不写默认为0

3.二维数组

数据类型 数组名称【行】【列】

eg:

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

4.输出字符数组

1.挨个输出printf(‘’%c‘’,数组名称[i])

2.整体输出printf(‘’%s‘’,数组名称)或者puts(数组名称)

例题:输出一个三行*组成的菱形图案。

#include 
int main()
{
     
  char c[3][3] = {
     {
     ' ','*',' '},{
     '*',' ','*'},{
     '*','*','*'}};
  int i,j;
  for(i=0;i<=2;i++)
  {
     
    for(j=0;j<=2;j++)
     printf("%c",c[i][j]);
    printf("\n");
  }
  return 0;
}

5.输入字符数组

1.挨个单词输入scanf(“%s%s…”, )

2.整句输入gets()

6.数组的遍历

采用循环的方式将每个元素遍历出来

int a[3] = {
     1,2,3};
int i;
for(i=0;i<3;i++)
{
     
  printf("%d\n",a[i]);
}

五、函数

1.函数的定义

[数据类型说明] 函数名称([参数]{
     
	执行代码块;
	return(表达式);
}

ps:自定义函数尽量放在主函数之前,如果要放在主函数之后需要在主函数之前先声明自定义函数。声明格式为:[数据类型说明] 函数名称([参数]);

2.函数的调用

一般形式为:函数名([参数]);

[]中可以是常数,变量或其他构造类型数据及表达式,多个参数之间用逗号分隔。

3.函数的递归

递归就是一个函数在它的函数体内调用它自身。(注意递归函数必须有结束条件)

例题:猴子第一天摘下N个桃子,当时就吃了一半,还不过瘾,就又多吃了一个。第二天又将剩下的桃子吃掉一半,又多吃了一个。以后每天都吃前一天剩下的一半零一个。到第10天在想吃的时候就剩一个桃子了,问第一天共摘下来多少个桃子?并反向打印每天所剩桃子数。

#include 
int getPeachNumber(int n)  
{
     
    int num;    
    if(n==10)
    {
     
       return 1;      
    } 
    else
    {
     
        num = (getPeachNumber(n+1)+1)*2;  
        printf("第%d天所剩桃子%d个\n", n, num); 
    }
    return num;
}
int main()
{
     
    int num = getPeachNumber(1);
    printf("猴子第一天摘了:%d个桃子。\n", num);
    return 0;
}

六、指针

指针的定义:指针是一个变量,用来存放地址的变量

指针的类型:基本类型(int,float,double,char),数组指针,函数指针

指针的引用:指针引用后得到的是该地址所对应的变量的值

1.指针变量与普通变量

指针=&变量(关联)

*指针=指针指定的变量的值

例题:输入两个整数,按先大后小的顺序输出这两个数,请用指针来编程。

#include 
int main()
{
     
  int a,b,*p,*q,*r;
  printf("请输入两个整数:\n");
  scanf("%d,%d",&a,&b);
  p=&a;
  q=&b;
  if(a<b)
  {
     
    r=p;
    p=q;
    q=r;
  }
  printf("较大数为%d 较小数为%d\n",*p,*q);  
  return 0;
}

2.指针变量与一维数组

指针=&数组名[某数]

指针+i=&数组名[某数+i]

*指针=指针指定的变量的值

&数组名[某数]=数组名+某数

数组名[某数]=*(数组名+某数)

eg:

int*p,*q,a[3]={
     5,10,15};
p=&a[0];
q=&a[1];

因为q指向a[1]=10,则q-1=a[1-1]=a[0]=5

例题:一个整型数组里的5个元素由键盘输入,将每个元素变为原来的两倍后再依次输出。

非指针型:

#include 
int main()
{
     
  int a[5];
  int i;
  printf("请输入5个整数:\n");
  for(i=0;i<=4;i++)
  {
     
    scanf("%d",&a[i]);
    a[i]=a[i]*2}
  printf("加倍后的各整数为:\n");
  for(i=0;i<=4;i++)
  	printf("%d\t",a[i]);
  printf("\n");
  return 0;
}

指针型:

#include 
int main()
{
  int a[5];
  int i,*p;
  p=&a[0];
  printf("请输入5个整数:\n");
  for(i=0;i<=4;i++)
  {
    scanf("%d",p+i);
    *(p+i)=*(p+i)*2;
  }
  printf("加倍后的各整数为:\n");
  for(i=0;i<=4;i++)
  	printf("%d\t",*(p+i));
  printf("\n");
  return 0;
}

3.指针变量与一维数组相关函数

函数声明:数组名[]——*p

函数解释:数组名[i]——*(p+i)

函数使用:数组名——q(使用前需先关联)

例题:有两个小组,分别有5名学生和10名学生。编程输入这些学生的成绩,并调用一个aver函数求这两个小组的平均分。

非指针型:

#include 
int main()
{
     
  float aver(float a[],int n);
  float zu1[5],zu2[10];
  int i;
  printf("请输入第一组的学生成绩:\n");
  for(i=0;i<=4;i++)
  	scanf("%f",&zu1[i]);
  printf("请输入第二组的学生成绩:\n");
  for(i=0;i<=9;i++)
  	scanf("%f",&zu2[i]);
  printf("第一组平均分是%f\n",aver(zu1,5));
  printf("第二组平均分是%f\n",aver(zu2,10));
  return 0;
}
float aver(float a[],int n)
{
     
  float sum=a[0],pingjunshu;
  int i;
  for(i=1;i<n;i++)
    sum=sum+a[i];
  pingjunshu=sum/n;
  return(pingjunshu);
}

指针型:

#include 
int main()
{
     
  float aver(float *p,int n);
  float zu1[5],zu2[10];
  int i,*q,*r;
  q=&zu1[0];
  r=&zu2[0];
  printf("请输入第一组的学生成绩:\n");
  for(i=0;i<=4;i++)
  	scanf("%f",q+i);
  printf("请输入第二组的学生成绩:\n");
  for(i=0;i<=9;i++)
  	scanf("%f",r+i);
  printf("第一组平均分是%f\n",aver(q,5));
  printf("第二组平均分是%f\n",aver(r,10));
  return 0;
}
float aver(float *p,int n)
{
     
  float sum=*p,pingjunshu;
  int i;
  for(i=1;i<n;i++)
    sum=sum+*(p+i);
  pingjunshu=sum/n;
  return(pingjunshu);
}

4.指针变量与二维数组

指针=&数组名[a],[b]

*指针=指针指定的变量的值

指针+i=&(数组名[a],[b]后面第一个元素)
&数组名【数a】【数b】=数组名【数a】+数b=数组名【0】+a列数+b
数组名【数a】【数b】=
(数组名【数a】+【数b】)

例题:已知整型二维数组a[3][4]={1,2,3,4,5,6,6,5,4,3,2,1}.请用指针变量输出二维数组各元素的值。

#include
int main()
{
     
	int a[3][4]={
     1,2,3,4,5,6,6,5,4,3,2,1};
	int *p;
	for(p=a[0];p<=a[0]+11;p++)
	{
     
		if(p-a[0]%4==0)
			printf("\n");
		printf("%d\t"*p);
	}
	printf("\n")
return 0;
}

5.指针变量与二维数组相关函数

6.指针变量指向二维数组的行变量

7.用指向二维数组行变量的指针变量做形参

8.指针变量与字符串

9.指针变量与字符串相关函数

10.指针变量与函数

11.返回指针值的函数

12.指针与一维二维数组的数值关系

&a[i]=a+i
a[i]+*(a+i)

指针=&值
一维数组

p=&a[0]
q=&c[1]
p=a+0=a
q=c+1

二维数组

p=&a[0][0]
q=&c[1][2]
p=a[0]+0=a[0]=*(a+0)=*a
q=c[1]+2=*(c+1)+2

*值=指针
一维数组

a[0]=*p
c[1]=*q
*a=*p
*(c+1=*q

二维数组

a[0][0]=*p
c[1][2]=*q
*a[0]=*p
*(c[1]+2)=*(*c+1)+2)=*q

七、结构体

1.定义结构体

struct为保留字

struct student
{
     
int xuehao;
char name[30];
char xingbie;
float chengji;
};
struct student a={
     001,"haha",'G',99};
|
|
a.xuehao=001;
a.name="haha";
a.xingbie='G';
a.chengji=99;
#include 
int main()
{
     
  return 0;
}

2.结构体数组

struct student
{
     
int xuehao;
char name[30];
char xingbie;
float chengji;
}xuesheng[3]={
     {
     001,"haha",99},{
     002,"hehe",20},{
     003,"xixi",90}};
|
|
xuesheng[0].xuehao=001;xuesheng[0].name="haha";xuesheng[0].chengji=99;
xuesheng[1].xuehao=002;xuesheng[1].name="hehe";xuesheng[1].chengji=20;
xuesheng[2].xuehao=003;xuesheng[2].name="xixi";xuesheng[2].chengji=90;

3.使用结构体变量做函数参数

4.结构体变量与指针变量

声明:部分资料源自网络,如有侵权,请联系我删除!
文中如存在谬误、混淆等不足,欢迎批评指正!

你可能感兴趣的:(C语言,c语言)