大一萌新写的c语言都能看懂版(一)

目录

c语言的框架

变量

数据类型

格式化输出语句

符号

语句

条件语句

循环语句

小语句

函数

数组

指针

指针与函数

指针与数组

c语言的框架

简单来说,c语言的主要组成部分为头文件和主函数构成,头文件为#include,主函数是int类型的函数:int main

变量

变量在c语言的地位很高,类似于我们一段话的文字,通过c语言的语法共同构成c语言

当然变量即为可变的量,我们都应该给它取一个名字(标识符)标识符只需要自己认清即可,所以我们在使用变量的过程中,我们应该进行定义。变量有三部分构成:变量名,变量值和存储单元(地址)

我们在定义过程中格式非常简单:数据类型 标识符;

变量赋值的过程中可以先定义变量1再赋值,也可以边赋值边定义(常用for)

int a;
for(a=1;a<10;a++)
for(int a=1;a<10;a++)

数据类型

在变量定义和函数定义的过程中,都不能缺少定义过程中的数据类型

æ°æ®ç±»ååç±»

最常用的就是基本类型

  • 整形:int,用于存储整数 

æ´å

  • 字符型:char,用于存储字符
  • 浮点数:单:float:用与存储一位小数
  • 浮点数:多:double:用于存储一位以上的小数

格式化输出语句

在不同的数据类型,输出语句的符号也有所不同

%d :十进制整数 int对应

%lld :长整形整数 longlong对应

%c :字符 char对应

%s :字符串(c语言中,一个位置就是一个字符)char数组对应

%f :小数 float对应

%lf :小数 double对应

 printf("普通字符输出格式符", 输出项); 

再c语言中,我们可以通过一个标识符号作为一个常量

#define 标识符 常量值 (书写格式)其实是和const int 标识符=常量的效果是一样的

符号


有些符号是为了计算,其实符号的主要作用是简化

1.算术运算符中比较简单但需要注意几点

符号主要包括:加减乘除取余,自增自减

  • 如果相除的两个数都是整数的话,则结果也为整数,小数自动省略
  • 若除法中,其中一个数字为小数,那么结果也是小数
  • 在取余的操作中,只允许两个整数取余
  • 取负数的时候一定要加括号
  • c语言不存在乘方
  • 再自增自减符号当中++或者--,放变量前面就是先运算再取值,后面就是先取值再运算
  • 怎么获得一个数的百位,十位和个位

  • 百位数:num/100 可以获得,因为 int 是整数型,小数部分会省略。比如 765/100 的结果是7
  • 十位数:num%100/10 。比如765%100先得到6565/10得到6
  • 个位数:num%10765%10得到5

2.赋值运算符

其实赋值运算符就是从最简单的赋值=开始的

+=、-=、*=、/=、%=

这些演变过来的赋值运算符,其实就是在赋值过程中的省略,因为赋值的过程是右边赋值到左边,所以前面符号的操作就是左边的变量值与右边的变量值进行运算再通过等于赋值到左边

3.关系运算符

关系运算符最大的作用就是进行判断

å³ç³»è¿ç®ç¬¦

在判断过程中需要注意的时候,那些在判断的过程中省略的操作就是用1,0进行判断真假

4.逻辑运算符

逻辑就是与,或,非

与:&&(数学中为且)

或:||

非:!

语句

语句主要分为条件语句和循环语句

条件语句

条件语句的核心为if-else

if(判断语句){

   判断执行的地方
}else{
    判断执行的地方
}

语义:如果表达式的值为真,则执行代码块1,否则执行代码块2;

if嵌套的语句中,语义为:如果表达式为真,则执行,否则继续判断,直到判断出来为止;

循环语句

循环总共有三种循环:

while循环;do-while循环;for循环。

while()
{
   执行操作
}

while循环可以理解为:当(进行判断)真就循环,否则输出;

do-while循环可以理解为:先进行一步操作,当(进行判断),若真就进行循环,否则不循环;

for循环分为三步操作(进行的变量的初始化之后进行判断,若真则进行循环,然后对变量进行递增或者递减,知道判断语句为假的时候输出语句

多重循环

在循环嵌套里

我们首先应该考虑父循环和子循环或者还有孙子循环,最大的循环做一步,相邻小一步的循环就要全部完成

在循环嵌套中,我们最容易完成的事情是图形打印,可以使得嵌套式循环更加直观

例1:矩形

#include<stdio.h>
int main()
{
// 3行4列的矩形
//  外循环控制行数
for (int i = 0; i < 3; i++) {
//        内循环控制列数
    for (int j = 0; j < 4; j++) {
        printf("*");
    }
    printf("\n");
}return 0;
}

运行如下

例2:三角形:内循环的条件表达式随着外循环的i值变化

#include<stdio.h>
int main()
{
/*
最多打印5行
最多打印5列
由于:列数<=行数
*/
for(int i = 0; i< 5; i++) {
    for(int j = 0; j <= i; j++) {
        printf("*");
    }
    printf("\n");
}return 0;
}

运行结果:

若是将三角形到过来:内循环的初始化表达式随着外循环的i值变化

初始值是0,循环五次,1循环四次,所以初始值随着i变化

#include <stdio.h>

int main() {
	for (int i = 0; i < 5; i++) {
		for (int j = i; j < 5; j++) {
			printf("*");
		}
		printf("\n");
	}
	return 0;
}

 运行结果

 冒泡排序

#include <stdio.h>

int a[10];
int cont = 0;
int main() {

//数组的初始化
	for (int i = 0; i < 10; i++) {
		printf("请输入第%d位数:", i);
		scanf("%d", &a[i]);
	}
//进行排序
	for (int i = 10; i > 0; i--) { //第一层循环只是为了控制次数
		for (int j = 0; j < i - 1; j++) {
			if (a[j] > a[j + 1]) {
				cont = a[j];
				a[j] = a[j + 1];
				a[j + 1] = cont;
			}
		}
	}
	for (int i = 0; i < 10; i++) {
		printf("%d ", a[i]);
	}
}

冒泡排序需要注意的是双循环之后有一个操作就是赋值排序操作利用变量作为中介进行大小排序

进行赋值操作。

小语句

1.break

break的作用为跳出当前循环,所以首先break必须存在于循环当中,然后当前循环的意思是,在嵌套式的语句中,只能跳出break当中的一个小循环

2.continue

continue的作用是结束当前循环进行下一个循环

break是跳出当前整个循环,continue是结束本次循环开始下一次循环。

3.swich-case

switch(表达式){
    case 常量表达式1:
        语句1;
        break;
    case 常量表达式2:
        语句2; 
        break;
    case 常量表达式n:
        语句n;
        break;
    default:
        语句n+1;
        break;
}

例子:

#include <stdio.h>

int main() {

    int num = 3;
    switch(num){
    case 1:
        printf("星期一\n");
        break;
    case 2:
        printf("星期二\n");
        break;
    case 3:
        printf("星期三\n");
        break;
    case 4:
        printf("星期四\n");
        break;
    case 5:
        printf("星期五\n");
        break;
    case 6:
        printf("星期六\n");
        break;
    case 7:
        printf("星期日\n");
        break;
    default:
        printf("回火星去\n");
        break;
    }
}

注意:default可以省略,但是break不能省略!!

if和swich的区别:if的针对范围比较强,swich对于特殊值的针对性比较强

函数

在此之前,我们所有的操作都是在主函数当中进行,输入输出,循环判断等等操作,我们是否可以自己搭建一个函数,来完成简化主函数当中的重复操作呢

函数的自创:

数据类型 函数名称(形参)

{

     执行代码;

return 表达式;

}

最需要注意的是return:执行函数体中的程序段所取得的并返回给主调函数的值。

return后面跟的可以是一个表达式进行计算,也可以是变量返回。

例子,前100的和递归

#include <stdio.h>

int sum(int n) {
    if(n==1){
	return n ;
    }return n + sum(n - 1);
}

int main() {
	printf("%d", sum(100));
	return 0;
}

数组

数组是一种存储空间,数组内部存储数据,这个空间就是数据的地址

一个数组是从0开始,首先掌握的应该是数组的初始化操作和输出

#include <stdio.h>

int main() {
	int i, a[10];
	for (i = 0; i <= 9; i++)
		a[i] = i;
	for (i = 9; i >= 0; i--)
		printf("%d", a[i]);
	return 0;
}

这是常规的0123456789的逆输出

我们还可以对数组进行赋值输出

int a[10];
	for (int i = 0; i < 10; i++) {
		printf("请输入第%d位数:", i);
		scanf("%d", &a[i]);
	}
for (int i = 0; i < 10; i++) {
		printf("%d ", a[i]);
	}

这个操作就是将数组的每一项进行输入,然后根据你所写的内容进行输出

注意:在数组定义的过程中,需要注意的是,数组长度过长所以用longlong定义数组

二维数组

二维叔祖和一维数组类似,需要两个循环进行定义

例1:若自己定义一个二维数组,且输入x,y即可找出数组的位置(因为数组默认是从0开始,则数组的值减去1为元素的位置

#include<stdio.h>
int a[10][10];
int main()
{
   int n,m;
printf("每行每列控制为:");
   scanf("%d,%d",&n,&m);
     printf("该二维数组为:\n");
   for(int i=0;i<n;i++){
    for(int j=0;j<m;j++)
      {
        scanf("%d",&a[i][j]);
       }    
    }
    int x,y;
    printf("想知道的:\n");
    scanf("%d,%d",&x,&y);
    printf("这个元素为");
    printf("%d",a[x-1][y-1]);
    //数组 int a[m][n] 最大范围处的元素是 a[m–1][n–1]。
    return 0;
}

这串代码先输入一个二维数组(自己创造了一个数组),找见了这个数组中任意一项的位置

指针

其实刚刚接触指针的时候,我们一直奇怪的一个点是指针是什么,它到底想要做什么,让我们慢慢揭开指针神秘的面纱吧!

在我们刚刚接触c语言的时候,其实指针已经显现出来,变量,变量由三种组成部分:变量名,变量值和存储单元(地址),那么,什么是指针

  • 在计算机中所有数据都存储在内存单元中,而每个内存单元都有一个对应的地址, 只要通过这个地址就能找到对应单元中存储的数据.

  • 由于通过地址能找到所需的变量单元,所以我们说该地址指向了该变量单元。将地址形象化的称为“指针”

内存单元的指针(地址)和内存单元的内容是两个不同的概念。

但是,地址就是我们平常使用的指针吗?

其实我们在使用指针的过程中,指针也是需要定义的——指针变量,它和大多数的变量是一样的,就是一种变量,但是在我们运用指针的过程中,我们所说的是这个指针指向什么什么(什么意思),其实指针变量所指向的是变量值,变量所存储的是指向这个变量值所存在的地址

指针变量的定义:所指向的数据类型 * 标识符

int *p

但是在写程序的过程中,问题又又又来了

*和&

我们可以这么理解,*是指针变量的一部分,表指向

                                   取值符号(代表访问指针所指向存储空间)

                                 &是取地址符号

int a = 5;
int *p = &a;
printf("a = %d", *p); // 访问指针变量

我们在使用的过程中,一定要对于指针变量进行赋值,哪怕是Null

int a = 5;
int *p;
p=&a;
int *p=NULL;
int *q=0;

一定要注意的是,指针变量只可以存储地址,不能存储其他(所以说我们在scanf过程中缺少&是不会报错的,因为会把&的后面当作地址)

指针与函数

函数指针,其本质是一个指针变量,该指针指向这个函数。总结来说,函数指针就是指向函数的指针。

int (*fun)(int x,int y);

 (我也不大会)

 指针变量最为函数参数

int swap(int *p1,int *p2)
#include <stdio.h>

void swap(int *p1, int *p2) {
	int p;
	p = *p1;
	*p1 = *p2;
	*p2 = p;
}

int main() {
	int a, b;
	int *c, *d;
	scanf("%d,%d", &a, &b);
	c = &a;
	d = &b;
	if (a < b) {
		swap(c, d);
	}

	printf("%d,%d", a, b);
	return 0;
}

指针与数组

我们学习数组的时候我们其实不难想象:在定义数组的时候,我们也把数组当成一个变量,数组我们其实一直把它当作一个数据库来装数据,其实并不难联想到指针。

那数组怎么用指针表示呢?

我们先分析一下数组和指针:int a[i] (定义a为包含十个整型数组数据的数组)

                                                int *p     (定义p为指向整型变量的指针变量)

                                       若p=&a[0]就是将a[0]元素的地址给p(这有什么用呢?)其实编译器在定义数组的时候a就是第一个元素的地址

                                              所以p=a。就是数组对指针的转换。

数组的面纱揭开,那我们定义数组的时候是不是又多了一种方法:

          我们可以这样理解:我们将a作为第一个变量的地址,i作为偏移的地址所以

int a[i];
//有的编译器不让这样命名,[]内只能写常量

int *(a+i);

(你不需要知道,只需要记住)a和i挪下来,a=p

最后一点,数组和指针完全一样吗?即使他们都所指向地址,但数组还是一串数所指向是稳定的,但指针是一个变量,是随时可以变化的。

操作一下指针打印数组吧!

#include <stdio.h>

int main() {
	int a[10];
	int i;
	int *p;
	for (i = 0; i < 10; i++) {
		scanf("%d", &a[i]);

	}
	printf("\n");
	for (p = a; p < (a + 10); p++) {
		printf("%d", *p);
	}
	return 0;
}

肝不动了(打游戏了)。。。明天继续!!!

因为内容太过简单,希望大佬能够指点一fan、、

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

雪碧有白泡泡

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

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

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

打赏作者

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

抵扣说明:

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

余额充值