第二周课程学习总结【关于数据类型、运算符、控制流和数组的部分知识】

前言

本周学习了c语言的数据类型、运算符、控制流和数组的部分知识,本文中通过很多程序举例来帮助我们更好的理解知识点。本周学习内容较多,一些点会简述,基本上通过程序举例说明都可以理解,如果有什么疑问或者发现了错误欢迎留言,我会积极回复并改正完善的。

数据类型

类型转换

#include <stdio.h>

int main(int argc, char const *argv[])
{
    /*
    int b = 65;
    char a = (char)b;//强制类型转换,将b转换为字符
    printf("%c\n",a);
    */

    char a = 'a;//隐式类型转换
    int b = 100;
    float c = 3.14;
    char d = a + b + c;// 内存越界
    int e = a + b + c;// 丢精度
    float f = a + b + c;// 正确
    printf("%f\n",f);
    
    return 0;
}
  • 强制类型转换可能会丢精度

数据类型的本质

  • 概念:各种不同的数据类型,本质上是用户与系统对某一刻内存数据解释,不一定有意义

整型数据尺寸

short不可比Int长

long不可比int短

long型数据长度对于系统字长(32位操作系统(232)4字节,64位操作系统占用(264)8字节)

可移植性数据类型

#include <stdio.h>

// 给变量取别名称为可移植数据类型
typedef char int8_t;
typedef unsigned char unit8_t;
typedef short int16_t;
typedef unsigned short uint16_t;
typedef int int32_t;
typedef unsigned int uint32_t;


int main(int argc, char const *argv[])
{
    int8_t a = 'p';
    printf("%c\n",a);

    return 0;
}
  • 有时候我们需要使用int32_t类型变量代替int类型变量的原因是什么?

使用int32_t类型变量代替int类型变量的原因有以下几点:

  1. 平台无关性:int类型在不同平台上的长度可能不同,而int32_t类型是一个固定长度的整数类型,保证了代码在不同平台上的可移植性。
  2. 数据精度:int类型的长度在不同平台上可能不同,可能会导致数据溢出或截断。而int32_t类型是一个32位的整数类型,可以确保数据的精度和范围。
  3. 代码清晰性:使用int32_t类型可以明确表达变量的长度和范围,使代码更加清晰易懂。
  4. 与特定硬件相关的操作:在一些特定的硬件操作中,需要使用特定长度的整数类型,使用int32_t类型可以确保与硬件的兼容性。

总之,使用int32_t类型可以提高代码的可移植性、数据精度和代码清晰性,适用于需要固定长度整数类型的场景。

  • int是系统基本的数据类型,其长度在不同平台下的大小尺寸是有区别的,为了使用同一份代码能够在不同的操作系统下面运行,并且尺寸不发生改变,一般使用类似与int32_t这样的可移植类型来定义数据,这些类型是不同平台下的对基本数据类型的封装,然后统一发布,这些移植的数据类型一般是放在头文件中,比如/usr/include/stdin.h

运算符

目:目标操作数

双目运算符

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char const *argv[])
{	
    int a = 20;
    int b = 5;
    
    int e = b * a;
    printf("sun = %d\n",e);

    int f = b / a; //除
    printf("sum = %d\n",f);

    int g = b % a;// 取余,在限制一个范围内使用的场景较多
    printf("sum = %d\n",g);
    
    return 0;
}

取余的运用场景

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(int argc, char const *argv[])
{  
    //通过时间参数随机因子
    srand(time(NULL));

    //产生一个随机数
    int ret = rand() % 10;// %10:控制在0~9
    printf("%d\n",ret);

    return 0;
}

取余时左右两边操作数必须是整数

单目运算符

int a = 10;
int b = ++a;// 先自加1--》a==11再赋值给b
int c = a++;// 先将a的值赋给c再自加1

在这里插入图片描述

#include <stdio.h>

int main(int argc, char const *argv[])
{
    int a = 10;
    int b = 20;
    int c = ++a;// a先自加再赋值给c
    int d = b++;//b先赋值给d再自加
    printf("%d,%d,%d,%d\n",a,c,b,d);

    int e = 2;
    int x = (e++)+(e++);// 错误的写法,两个单目运算符不能进行双目运算
    printf("x:%d,e:%d\n",x,e);
    int b1 = 2;
    int y = (b1++)+(++b1);//错误的写法
    printf("y:%d,b1:%d\n",y,b1);

    return 0;
}

在这里插入图片描述
在这里插入图片描述

printf("LINE:%d\n",__LINE__);//打印当前行号

关系运算符

运算符功能举例说明
>大于a > b判断a是否大于b
>=大于或等于a >= 5判断a是否大于或等于5
<小于3 < x判断3是否小于x
<=小于或等于x <= (y+1)判断x是否小于或等于y+1
==等于(x+1) == 0判断x+1是否等于0
!=不等于c != ‘\0’判断c是否不等于’\0’
#include <stdio.h>
#include <stdbool.h>

int main(int argc, char const *argv[])
{
    int a = 10, b = 20;
    bool ret = a > b;
    bool ret1 = a < b;
    bool ret2 = a >= b;// a大于或等于b?
    bool ret3 = a <= b;//a小于或等于b?
    bool ret4 = a == b;//a等于b?注意是两个=
    bool ret5 = a != b;// a不等于b?
    printf("%d\n",ret5);

    return 0;
}

=:赋值

==:判断

逻辑运算符

运算符功能说明举例
逻辑反!(x==0)
&&逻辑与x > 0 && x < 10
||逻辑或y < 10 || x > 10
  • 运算规则:
    • 逻辑反:将逻辑真、假翻转,即真变假,假变真
    • 逻辑与:将两个关系表达式串联起来,当且仅当左右两个表达式都为真时,结果为真。
    • 逻辑或:将两个关系表达式并联起来,当且仅当左右两个表达式都为假时,结果为假。
#include <stdio.h>
#include <stdbool.h>

int main(int argc, char const *argv[])
{
    int a = 10, b = 5, c = 6, d = 7;
    //10大于5并且6小于7为真,结果为1
    printf("%d\n",a > b && c < d);
    
    //10小于5或者6小于7为真,结果为1
    Printf("%d\n",a <b || c < d);
    
    //-1为真取反为假,结果为0
    printf("%d\n",!-1);
    
    //c语言为惰性语言,只要表达式1能确定整条预计结果,则表达式2不执行
    printf("%d,%d\n",a < b && a++,a);
    int x = 10,y = 20;
    printf("%d\n",(x<100) || (y = 50),y);// y=20
    
    return 0;
}
	int x = 10,y = 20;
    printf("%d\n",(x > 100) || (y = 50),y);// y=50
    
    int a = 10, b = 20;
    bool ret = a > 5 && b < 25;// 同时为真则真
    ret = a > 5 || b < 25;// 同时为假则假
    ret = !(a > 5 && b < 25);
    printf("%d\n",ret);

算术运算符

运算符功能说明举例
+加法,一目取正a+b
-减法,一目取负a-b
*乘法a*b
/除法a/b
%取模(求余)a%b
++自加1a++, ++b
自减1a–, --b
  • /与%在处理数据的时候可以进行提取低字节或者高字节数据比如0x123%10,或者0x123/10,应用场景比如温湿度的截取

位运算符(重点)

运算符名称举例功能说明
~位逻辑反~a将变量 a 中的每一位取反
&位逻辑与a & b将变量 a 和 b 逐位进行与操作
|位逻辑或a | b将变量 a 和 b 逐位进行或操作
^位逻辑异或a ^ b将变量 a 和 b 逐位进行异或操作
<<左移a << 4将变量 a 中的每一位向左移动4位
>>右移x >> n将变量 x 中的每一位向右移动4位
  • ~ : 按位取反—单目运算符,数据将每一个bit位取反,1变0,0变1

%u:是以补码的方式存放

%d:是以补码还原成原码方式显示

#include <stdio.h>

int main(int argc, char const *argv[])
{
    char a = 0x03;
    printf("%d\n",~a);

    char b = 0x09;
    printf("%d,%d\n",b,~b);

    return 0;
}
/*  char b = 0x09;
    printf("%d,%u\n",~b,~b);//-10,4294967286
*/

在这里插入图片描述

&:按位与,全1为1,有0为0

| :按位或,有1为1,全0为0

^ : 按位异或 ,不同为1,相同为0

#include <stdio.h>

int main(int argc, char const *argv[])
{
    unsigned char a1 = 0x3c;//60
    unsigned char b1 = 0x47;//71
    printf("%d\n",a1^b1);//123

    return 0;
}

无符号左移

#include <stdio.h>

int main(int argc, char const *argv[])
{
    unsigned int a = 3 <<5;
    printf("%d\n",a);//不越界的情况下有公式:3*2^5=96

    return 0;
}

number*2^n

对于正数来说 原码反码补码都是一样的

有符号左移

-3 << 3

1000 0011 原码

1111 1100 反码

1111 1101 补码 移位操作 <<3

1110 1000 移位后的数据,负数显示是以原码的方式显示

1110 0111 -1

10011000 取反

#include <stdio.h>

int main(int argc, char const *argv[])
{
    int a = -9 <<3;
    printf("%d\n",a);//-72

    retun 0;
}

无符号右移

a 右移n位的结果为a/2^n

unsigned char a = 151 >> 5;
printf("%d\n",a);//4

有符号右移

char a = -96 >> 5;
printf("%d\n",a);
  • 注意:
  1. 进行移位运算时,凡是移出去的位都丢弃,凡是空出来的都补0,移位运算是针对的五毒号整数。
  2. 有符号的移位运算,左移时空出来的补0,右移时,空出来的补符号位。

例题

将0x12ff0045第14,15位置为1,22,23位置为0

#include <stdio.h>

int main(int argc, char const *argv[])
{
    unsigned int data = 0x12ff0045;
    //将第14 15位置为1
    data = data | 0x03 << 14;
    //将第22 23 位置为0
    data = data & ~(0x03 <<22);
    printf("%#x\n",data);

    return 0;
}

置1,左移/右移,位或

置0,左移/右移取反,再位与

特殊运算符

下划线开头是系统命名如_a

不能以数字开头

*a表示指针,不能用作变量名,不能int *a

可以用下划线或字母开头定义变量

条件运算符(三目运算符,重点)

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

释义:当表达式1为真时,取表达式2,否则取表达式3

int a = 200;
int b = 100;
int m = (a>b) ? a : b; //如果 a > b 为真,则 m 取 a 的值,否则取 b 的值

sizeof运算符

sizeof(100);//正确的
sizeof(a);//正确的
sizeof 100;//正确的
sizeof a;//正确的
sizeof int;//错误的,正确的sizeof (int);

逗号表达式

int a = 2, b = 3;
//逗号运算符的特点是取最后一个表达式作为结果
int ret = (a>b,a++,b++,a);
printf("%d\n",ret);

运算顺序从左往右,但取最后一个表达式作为结果

优先级与结合性

  • 当表达式出现不同的运算符时,根据优先级来决定谁先执行,比如先乘除后加减
  • 当表达式中出现多个相同优先级的运算符时,更具结合性决定谁先运行,比如从左到右

在这里插入图片描述

控制流

二路分支

if 语句:如果-则

if-else语句:如果-否则

{}是作用域 ()是条件

int main()
{
	if(技术面试通过)
	{
		技术部上班
	}
	else
	{
		其他部门
	}
	
	return 0;
}
#include <stdio.h>

int main(int argc, char const *argv[])
{
    int number;
    scanf("%d",&number);

    printf("%d\n",number%2==0);
    if(number % 2 == 0) // 如果为真就执行以下语句
    {
        printf("偶数\n");
    }
    else // 否则执行以下内容
    {
        printf("奇数\n");
    }

    // 二路分支
    // 如果if条件满足的情况下,只有一条语句,可以不用加{}
    // 多于一条语句需要加{};
    if(number % 2 == 0)
    {
        printf("我是");
        printf("偶数\n");
    }  
    else
        printf("奇数\n");
    
    return 0;
}

多路分支

// 多路分支,互斥关系,如果条件1和条件2成立,则只执行条件1
if(number > 0 && number <= 10)
{
    printf("蛋炒饭\n");
}
else if(number > 10 && number <= 20)
{
    printf("黄焖鸡\n");
}
else if(number > 20 && number <=30)
{
    printf("kfc\n");
}
else
{
    printf("食堂随便吃");
}

嵌套分支

// 嵌套分支
if(number > 400)
{
    int score;
    printf("面试成绩:");
    scanf("%d",&score);
    if(score > 80)
    {
        printf("欢迎来到xxx研究院\n");
    }
    else
    {
        printf("再接再厉\n");
    }
}

练习1:

制作一个简单的打分系统(满分制:100),使用if…else方法,分数需整数

​ 60分以下:评级为D

​ 60-80分 : 评级为C

​ 80-90分 : 评级为B

​ 90-100分: 评级为A

​ 不在0-100范围内:错误

#include <stdio.h>

int main(int argc, char const *argv[])
{
    float score;
    printf("请输入成绩:");
    scanf("%f",&score);

    if(score >=0 && score < 60)
    {
        printf("D\n");
    }
    else if(score >= 60 && score < 80)
    {
        printf("C\n");
    }
    else if(score >= 80 && score <90)
    {
        printf("B\n");
    }
    else if(score >=90 && score < 100)
    {
        printf("A\n");
    }
    else
    {
        printf("错误");
    }

    return 0;
}

多路分支

switch 语句

#include <stdio.h>

int main(int argc, char const *argv[])
{
    switch(4)
    {
        case 1:
            printf("one\n");
            break;
        case 2:
            printf("two\n");
            break;
        case 3:
            printf("three\n");
            break;
        default:// 上面的语句不满足则执行此语句
            printf("other\n");
			break;
    }
    return 0;
#include <stdio.h>

int main(int argc, char const *argv[])
{
    int score;
    scanf("%d",&score);

    switch (score)
    {
    case 0 ... 60:
        printf("D\n");
        break;
    case 61 ... 80:
        printf("C\n");
        break;
    case 81 ... 90:
        printf("B\n");
        break;
    case 91 ... 100:
        printf("A\n");
        break;
    default:
        printf("输入错误,请重新输入\n");
        break;
    }
    return 0;
}

练习2:

计算加盟费

​ 小张加盟一家餐饮企业,在每个季度结束后,小张必须向总部缴纳加盟费,加盟费与营业额的提成关系如下:

​ 营业额 提成系数

​ 0<=n<10w 0.1

​ 10<=n<20w 0.075

​ 20<=n<40w 0.05

​ 40<=n<60w 0.03

​ 60<=n<100w 0.015

​ n >= 100w 0.01

​ 请输入小张的营业额,然后求出它需要的提交的加盟费

/*
*解题思路:
    1.使用二路分支来标记营业额
    2.使用二路分支的标记作为多路分支的条件
*/
#include <stdio.h>

int main(int argc, char const *argv[])
{
    float money; //营业额
    float val; //提成
    int flage; //记录营业额范围
    printf("请输入营业额(万元):");
    scanf("%f",&money);
    //营业额
    if(money < 0)
    {
        printf("找个班上,别开了\n");
    }
    else if(0 <= money && money <=10)
    {
        flage = 1;
    }
    else if(10 < money && money <= 20)
    {
        flage = 2;
    }
    else if(20 < money && money <= 40)
    {
        flage = 3;
    }
    else if(40 < money && money <= 60)
    {
        flage = 4;
    }
    else if(60 < money && money <= 100)
    {
        flage = 5;
    }
    else if(money > 100)
    {
        flage = 6;    
    }

    //提成
    switch(flage)
    {
        case 1:
            val = 0.1;
            break;
        case 2:
            val = 0.075;
            break;
        case 3:
            val = 0.05;
            break;
        case 4:
            val = 0.03;
            break;
        case 5:
            val = 0.015;
            break;
        case 6:
            val = 0.01;
            break;
        default:
            break;
    }
    //输出加盟费
    printf("加盟费:%.2f万元\n",money * val);


    return 0;
}

const

#include <stdio.h>

int main
{
	const int a = 10;
	//a = 20;//a被限制为常量,不可重新赋值
	
	//const修饰变量的时候,必须要先初始化
	//否则无意义
	const int b;//int const b;这样写也可以
	b = 10;
	
	return 0;
}

while循环

#include <stdio.h>

int main(int argc, char const *argv[])
{
    int number = 1;
    int max = 0;
    while (number <= 100)
    {
        max += number;
        printf("%d\n",max);
        number++;
    }

    while(1)
    {
        if(number > 100)
            break;
            max +=number;
            printf("%d\n",max);
            number++;
    }
    return 0;
}
//0~100的偶数
#include <stdio.h>

int main(int argc, char const *argv[])
{
    int number = 101;
    while (number--)
    {
        if(number%2==0)
        {
          printf("偶数%d\n",number);  
        }
    }

    return 0;
}
//0~100偶数求和
#include <stdio.h>

int main(int argc, char const *argv[])
{
    int n = 1;
    int max = 0;
    while(1)
    {
        if(n > 100)
            break;
        
        if(n % 2 == 0)
        {
            max += n;
        }
        n++;
    }
    printf("%d\n",max);
    

    return 0;
}

do while

do之后的语句至少执行一遍

#include <stdio.h>

int main(int argc, char const *argv[])
{
    int n = 0;
    do
    {
        printf("%d\n",++n);//n++到99,++n到100
    } while (n != 100);
    
    return 0;
}
//1~100的和
#include <stdio.h>

int main(int argc, char const *argv[])
{
    int n = 0;
    int max = 0;
    do
    {
        max += n;
        n++;
    } while (n != 101);
    
    printf("%d\n",max);
    return 0;
}

//使用do...while实现1+2+...+100的和
#include <stdio.h>

int main(int argc, char const *argv[])
{
    int a,b;
    int max = 0;
    //scanf("%d%d",&a,&b);
    
    do
    {
        scanf("%d%d",&a,&b);
        if(a > b)
        {
            max = a;
            printf("%d\n",max);
        }
        else if (a < b)
        {
            max = b;
            printf("%d\n",max);
        }
        
        
    } while (a != b);
    
    return 0;
}
//不够严谨,当输入字符时会出错,以下截图为正确参考

在这里插入图片描述

getchar()的使用在上周的总结中有讲解,在写程序时要根据题目要求灵活使用getchar和scanf

for循环

逻辑:与while循环类似,但更加紧凑,for循环将控制循环的变量集中在一行

#include <stdio.h>

{
    int main(int argc, char const *argv[])
    {
        int i = 1;//执行1遍
        while(1)
        {
            if(i > 5)// 判断是否小于5
                break;
            printf("%d\t",i++);//输出i,i自加
        }
        return 0;
    }
    
}
//第一句只执行一遍,第二句判断是否小于5,如果是就执行下面大括号里的语句,第三句i自加,
for(int i = 1;i <= 5;i++ )//不是所有编译器都可以在里面定义,c98编译器会报错
{
    printf("%d\t",i);
}
/*
//还可以这样写
int i = 1;
for(;i <=5;i++)
{
	printf("%d\t",i);
}
//或者
i = 1;
for(;i <= 5;)
{
	printf("%d\t",i++);
}
printf("\n");
i = 1;
for(;;)
{
	if(i <= 5)
	{
		printf("%d\t",i++);
	}
	else
	{
		break;
	}
}
printf("\n");
return 0;

在这里插入图片描述

练习

//求1~100的和
#include <stdio.h>

int main(int argc, char const *argv[])
{
    int sum = 0,i;
    for(i = 1;i <= 100;i++)
    {
        sum = sum + i;
    }
    printf("%d\n",sum);
    return 0;
}
//编写一个程序输出26个小写字母
#include <stdio.h>

int main(int argc, char const *argv[])
{
    char i;
    for(i = 'a';i < 'z';i++)
    {
        printf("%c",i);
    }
    return 0;
}

嵌套循环-for嵌套

int main(int argc, char const *argv[])
{
    for(int i = 0; i < 5; i++)// 外循环
    {
        for(int j = 0; j < 4; j++)// 内循环
        {
            printf("i:%d j:%d\n",i,j);
        }
    }
    return 0;
}

在这里插入图片描述

练习(循环控制)

编写一个程序,在用户输入某个大写字母后,产生一个金字塔图案。
例如输入字母E,则产生如下图案:

    A
   ABA
  ABCBA
 ABCDCBA
ABCDEDCBA
#include <stdio.h>

int main(int argc, char const *argv[])
{
	char ch;
	int i,j,line;

	printf("请输入字母:");
	scanf("%c", &ch);

	if(ch < 'A' || ch > 'Z')
	{
		printf("输入出错,请重新输入大写字母\n");
		return -1;
	}

	//计算总行
 	line = ch - 'A' + 1;

	for(i=1; i<=line; i++)
	{
		for(j=0; j<line-i; j++)// 输出空格
		{
			printf(" ");
		}
 
		for(j=0; j<i; j++)//升序
		{
			printf("%c", 'A'+j);
		}
 
		for(j-=2; j>=0; j--)//降序
		{
			printf("%c", 'A'+j);
		}
		printf("\n");
	
	}
    return 0;
}

在这里插入图片描述

goto语句

#include <stdio.h>

int main(int argc, char const *argv[])
{
    // 输出当前行号
    printf("__%d__\n",__LINE__);
    //跳转到定义的标签处
    goto Label;
    printf("__%d__\n",__LINE__);

    //goto标签
Label:
    printf("__%d__\n",__LINE__);

    return 0;
}

goto运用场景

#include <stdio.h>

int main(int argc, char const *argv[])
{
    printf("请输入分子与分母:");
    int a, b;
    scanf("%d/%d",&a,&b);
    if(b == 0)
    {
        goto error;
    }
    printf("ret = %d\n",a/b);
    error:
    printf("process exit\n");
    return 0;
}

练习(循环控制、多路分支)

编写一个程序,接收用户的输入信息,当用户输入完成后(#代表输入完成),自动统计用户输入的空格数、大小写字母数和其他字符数。

#include <stdio.h>

int main(int argc, char const *argv[])
{
    char s;
    int a=0,b=0,c=0,d=0;
    printf("输入信息,输入完成后输入#\n");
    while((s = getchar()) != '#')
    {
        if (s == ' ')
        {
            a++;
            continue;
        }
        if(s >= 'A' && s <= 'Z')
        {
            b++;
            continue;
        }
        if(s >= 'a' && s <= 'z')
        {
            c++;
            continue;
        }
            d++;
    }
        printf("空格数:%d\t",a);
        printf("大写字母数:%d\t",b);
        printf("小写字母数:%d\t",c);
        printf("其他字符数:%d\t",d);
    return 0;
}

数组

从内存的角度思考问题(上周总结中变量的定义部分有对int a含义的相关解释)

#include <stdio.h>

int main(int argc, char const *argv[])
{
    //申请4块连续的ch空间存放"ABC\0"
    //把这4块空间称为数组
    char ch[4] = "ABC";
    printf("c[0]=%c\n",ch[0]);//将ch第0块空间的额内容输出
    printf("c[1]=%c\n",ch[1]);//将ch第1块空间的额内容输出
    printf("c[2]=%c\n",ch[2]);//将ch第2块空间的额内容输出
    
    //将数组ch的第二块内存的数据给c
    char c = ch[2];
    printf("%c\n",c);

    char buf[5];
    //%p为输出地址
    printf("buf addr : %p\n",buf);
    buf[0] = 'r';
    buf[1] = 'o';
    buf[2] = 's';
    buf[3] = 'e';
    buf[4] = '\0';
    // %s是输出字符串
    printf("%s\n",buf);//%s贪婪模式,从里面找直到\0结束

    return 0;
}

在这里插入图片描述

在这里插入图片描述

buf是部分【0】的地址,是整个数组的基地址

部分【0】是一块基地址空间,里面存了‘r’

buf == &buf[0]

总结:数组名相当于整个数组的首地址

数组的空间地址问题

#include <stdio.h>

int main(int argc, char const *argv[])
{
    char c1[5] = "loki";
    printf("%d\n",sizeof(c1));

    //数组名是这个数组的首元素地址
    printf("ca adde %p\n",c1);
    printf("c1[0] addr %p\n",&c1[0]);
    printf("c1[1] addr %p\n",&c1[1]);
    printf("c1[2] addr %p\n",&c1[2]);
    
    //*表示获取地址里面的内容,*表示解引用
    printf("%c\n",*(c1+0));//&c1[0]==c1+0 ==> c1[0] == *(c1+0)
    printf("%c\n",*(c1+1));//&c1[1]==c1+1 ==> c1[1] == *(c1+1)
    printf("%c\n",*(c1+2));//&c1[2]==c1+2 ==> c1[2] == *(c1+2)
    printf("%c\n",*(c1+3));//&c1[3]==c1+3 ==> c1[3] == *(c1+3)

    return 0;
}

在这里插入图片描述

整型数组的定义并初始化(变长数组赋值清空等):

#include <stdio.h>

int main(int argc, char const *argv[])
{
    //定义数组
    int a[10];
    int size = 10;
    //变长数组
    int a1[size];

    //初始化数组
    int a2[5] = {1,2,3,4,5};
    printf("%d\n",a2[2]);

    //溢出
    //int a3[3] = {1,2,3,4};
    //初始化单位时候[]内容可以为空
    int a3[] = {1,2,3,4};
    printf("%d\n",sizeof(a3));
    //int a3[];//错误的,不知道分配多大的空间

    //使用变长数组,定义的时候初始化,会报错
    //int a3[size] = {1,2,3,4};

    //将数据赋值到数组
    a[0] = 1;
    a[1] = 2;
    for(int i =0;i <10;i++)
        a[i] = i;

    //变长数组赋值
    a1[0] = 10;
    a1[1] = 11;
    //输出数组内容
    for(int i = 0;i< 10;i++)
    printf("%d\t",a[i]);

    //数组清空
    int a4[100] = {0};
    for(int i = 0;i<100;i++)
        printf("%d\n",a4[i]);
    
    //计算数组的总大小
    int a6[10];
    printf("a6 size : %ld\n",sizeof(a6));
    //计算数组元素个数
    int a7[] = {1,2,3,4,5,6};
    int num = sizeof(a7) / sizeof(a7[0]);
    printf("%d\n",num);

    return 0;
}

练习:十进制转十六进制(笔试题常见题)

#include <stdio.h>

int main(int argc, char const *argv[])
{
    int n,count = 0;

    char buf[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
    scanf("%d",&n);
    int index[16] = {0};
    
    while(n != 0)
    {
        index[count++] = n % 16;
        n = n / 16;
    }
    for(count = 15;count >= 0;count--)
    printf("%c",buf[index[count]]);
    
    return 0;
}

在这里插入图片描述

//完善的程序

#include <stdio.h>

int main(int argc, char const *argv[])
{
    char ch[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
    
    //存放取余的空间
    int index[16] = {0};

    //输入
    int data,count = 0;
    printf("请输入十进制整数: ");
    scanf("%d",&data);

    while(1)
    {
        index[count++] = data % 16;
        data /= 16;
        if(data==0)
            break;
    }

    for(int i = count - 1; i >= 0; i --)
    {
        printf("%c",ch[index[i]]);//B
    }
    printf("\n");

    return 0;
}

以上就是我本周学习内容的总结,经过本周的学习明显感觉到自己的薄弱点,对程序的分析、解题思路不是很清晰,对一些较长运算或较多循环的语句判断不明确,对于一些细节之处不够细心会被绕进去。这周也做了很多相关的试题练习,通过不断地练习总结完善,情况正在慢慢好转,一份努力一份收获,坚持!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值