首页 > 其他分享 >C语言

C语言

时间:2023-07-02 21:25:47浏览次数:36  
标签:10 arr int C语言 ++ printf 表达式

目录

1.数据类型

1.1基本类型

C语言已经定义好的,可以直接用的。

  1. 整型--保存整数

    int

    long int --

    long long --8个字节

    short --2个字节

    前面加unsigned表示无符号类型

    例如

    int a;   //定义了一个有符号整型变量,可以是负数
    
    unsigned int a;  //定义了一个无符号整型变量,保存非负整数
    
  2. 字符数据--保存字符

    char/unsigned char --一个字节

    字符在计算机中是以字符的ASCII码来保存的

  3. 浮点型--保存小数

    float --4个字节

    double --8个字节

    long double --16个字节

1.2构造类型

自己创建的类型

  1. 数组 char arr[] = {};
  2. 结构体 struct
  3. 枚举 enum
  4. 共同体 union

1.3指针类型

带有*标识的: char *p = NULL;

1.4空类型(void)

void main()
{
    *****
    
    return ;
}

int main()
{
    *****
    
    return 0;
}

void *p = NULL;

2.变量和常量

2.1C语言中常量的表示方式

  1. 整型常量

  2. 字符常量

    通常使用单引号 '' 来引用一个字符

    转义字符 '\n' 换行符 '\t' 水平制表符

    普通字符:

    '%'

    'a' --- 97

    以\开头的是八进制表示的字符

    '\101' --- 65 --- 'A'

    以\x开头的是十六进制表示的字符

    '\x41' --- 65

  3. 浮点常量

    浮点数可以带后缀 f/F/l/L

    1.5     //默认为double
    1.5f    //float
    1.5l    //long double
    
  4. 符号常量--宏定义

    #define pi 3.14
    

2.2数据在内存中的存储

2.3C语言中变量的表示方式

变量:在程序运行期间,值可以变化的量。

变量需要定于它才可以使用。

2.3.1变量的定义

//定义变量的语法
变量类型 变量名 {=初始值};  //{}内为可选项
//变量名不能和关键字重名,必须由字母、数字、下划线组成,且不能以数字开头
//定义变量的规范
1.见名知义
2.合理缩写
3.普遍认知

2.3.2变量的含义

变量的本质:

变量的属性:一种表示空间中的值 --右值

​ 一种代表空间 --左值

int a = 10;    //a表示空间,将10这个值保存进a这个空间
int b;
b = a;         //a表示a这个空间中的值

3.整数之间的赋值问题

int a = 100000;
short b = a;
//语法上行得通

3.1长的赋值给短的

会产生溢出,并且溢出的部分会丢弃,高位舍弃,低位保留。

3.2短的赋值给长的

赋值过程中,要先短边长,如果短的是有符号数据,长的高位补符号位;如果短的是无符号数据,长的高位补0。

//练习1
short int a = -6;
int b = a;
printf("%d\n", b);  //-6
printf("%u\n", b);  //2^32 - 6

//练习2
unsigned short int a = -6;
int b = a;
printf("%d\n", b);  //2^16 - 6
printf("%u\n", b);  //2^16 - 6

//练习3
short int a = -6;
printf("%d\n", a);  //-6
printf("%u\n", a);  //2^32 - 6

//练习4
char a = 358;
printf("%c\n", a);  //f
printf("%d\n", a);  //102
//作业
//分析如下代码的输出结果:
printf("%d\n", -1);                     //-1
printf("%u\n", -1);                     //2^32 - 1

printf("%d\n", -1u);                    //-1
printf("%u\n", -1u);                    //2^32 - 1
printf("%d\n", (char)-1u);              //-1
printf("%u\n", (char)-1u);              //2^32 - 1

printf("%d\n", (char)-1);               //-1
printf("%c\n", 359);                    //'g'

printf("%d\n", (unsigned char)-1);      //255
printf("%u\n", (unsigned char)-1);      //255

printf("%d\n", 255);                    //255
printf("%u\n", 255);                    //255
printf("%d\n", (char)255);              //-1
printf("%u\n", (char)255);              //2^32 - 1

4.运算符与表达式

运算符:进行运算的某种符号。

操作数:参与某种运算的数据。

表达式:用运算符连接操作数的式子,每个式子都有一个值,成为表达式的值。

1 > 2
//1  2 :操作数
// >   :运算符
//1 > 2:表达式
// 0   :表达式的值

4.1运算符的分类

  1. 按操作数的个数分:

    单目运算符、双目运算符、三目运算符

  2. 按运算属性分:

    算数运算符、关系运算符、逻辑运算符、位运算符...

4.2算数运算符

用 + - * / ++ -- 进行运算的符号

用算数运算符连接的式子叫做算术表达式。

4.3关系运算符

判断两个数的关系。

4.4逻辑运算符

&& : 逻辑与

|| : 逻辑或

! : 逻辑非

惰性运算:已经知道的结果不需要再进行运算。

//练习
int a,b,c,d,m,n,k;
a = 1; b = 2; c = 3; d = 4; m = 1; n = 1;
k = (m = a > b) && (n = c > d);
printf("m = %d, n = %d, k = %d", m, n, k);
// m = 0, n = 1, k = 0

4.5赋值运算符

赋值符号左右两边的操作数,类型要相同或兼容

int a;				
a = 26;				//类型相同
a = 'a';			//类型不同,但兼容
a = 8.8;			//类型不同,但兼容,只保留整数部分
a = "hello world";	//类型不同且不兼容

复合赋值运算符;

+=  -=    *=    /=    >>=  ...

4.6位运算符

最重要的,常用的,笔试/面试考点

效率高,运算快

4.6.1按位取反

4.6.2按位与

0 & x = 0;
1 & x = x;

4.6.3按位或

0 | x = x;
1 | x = 1;

4.5.4按位左移/右移

  1. 按位左移规则:溢出的丢弃,低位补零
  2. 按位右移规则:
    • 无符号数:溢出的丢弃,高位补零
    • 有符号数:溢出的丢弃,高位补符号位
//练习
//设置一个数的第7位位1,其余位保持不变
x = x | (1<<7);
//将一个数的第8位清0,其余位保持不变
x = x & ~(1<<8);
//将一个数据的bit0-10,设置为1,其余位保持不变
x = x | ~(-1 << 11);
//将一个数据的bit0-10,清除为0,其余位保持不变
x = x & -1 << 11;

4.6.5按位异或

0 ^ x = x;
1 ^ x = ~x;
//练习
//有a、b两个变量,交换他们的值,但是不要借助第三个变量
a = a ^ b;
b = b ^ a;
a = b ^ a;

4.6.6条件运算符

唯一的三目运算符。

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

运算规则:如果表达式1为真,则条件表达式的值为表达式2的值,且不会执行表达式3;

​ 如果表达式1为假,则条件表达式的值为表达式3的值,且不会执行表达式2。

4.6.7逗号运算符

语法:表达式1,表达式2,……,表达式n

运算规则:先算表达式1,再算表达式2,……,整个逗号表达式的值等于表达式n的值。

4.6.8强制类型转换

4.6.9求长度运算符

语法:sizeof(type/value/variable)

返回该类型/值/变量的字节数。

4.6.10其他

*  指针运算符、取值运算符
&  取地址运算符
.  引用成员变量运算符 普通变量
-> 引用成员变量运算符 指针变量
//作业
//请写出相应的表达式满足1,2,3
//1.对于一个4字节的数值,判断其第n位是否为1
x & (1 << n) == (1 << n) ? 1 : 0;
//2.对于一个4字节的数值,将其[n,m](n<m,m<31 m>0)区间内的全部设置为1,其余位保持不变
x = x | ((-1u << (31 - m + n)) >> (31 - m));
//3.对于一个4字节的数值,将其[n,m](n<m,m<31 m>0,n>0)区间内的全部设置为0,其余位保持不变
x = x & ~((-1u << (31 - m + n)) >> (31 - m));

5.C语言的三大结构

顺序结构、选择/分支结构、循环结构

这三个结构可以解决所有的编程问题

5.1顺序结构

C程序的执行顺序都是从main函数开始,依次往下执行。

//第一个C程序:hello world
#include <stdio.h>				//头文件:包含了类型定义,函数、变量声明
                                //std:标准   io:输入输出   声明了printf函数
int main()                      
{
    printf("hello world\n");
    return 0;
}
//main  主函数,所有的c程序有且只有一个main函数
//int   返回值类型
//()内可以设置函数的参数列表
//{}表示一块区域
//printf 标准输出函数
//\n  换行符,表示这是一个行缓冲
//;   C语言语句的结束符
//retrun  函数返回
//0       返回值

5.2分支/选择结构

5.2.1 if语句

语法

if(表达式)
{
	语句块;
}
if(表达式)
{
    语句块1;
}
else
{
    语句块2;
}
if(表达式1)
{
    语句块1;
}
else if(表达式2)
{
    语句块2;
}
......
else if(表达式n-1)
{
    语句块n-1;
}
else
{
	语句块n;
}

练习:

//输入两个数,输出其中的较大值
int a,b;
scanf("%d\t%d\r", &a, &b);
if(a > b)
    printf("%d\n", a);
else
    printf("%d\n", b);
//输入三个数,判断三个数是否可以组成一个三角形
int a, b, c;
scanf("%d\t%d\t%d", &a, &b, &c);
if (a + b > c && a + c > b && b + c > a)
{
    printf("yes\n");
}
else
{
    printf("no\n");
}
//输入一个字符,如果这个字符是小写则转换位大写字符,如果是大写字符就转换位小写字符
char ch;
scanf("%c", &ch);
if (ch >= 'A' && ch <= 'Z')
{
    ch = ch + 32;
    printf("%c\n", ch);
}
else if (ch >= 'a' && ch <= 'z')
{
    ch = ch - 32;
    printf("%c\n", ch);
}
else
{
    printf("error\n");
}
//输入一个学生的考试分数,输出他的成绩等级
/*	[90,100)	A
	[80,90)		B
	[60,80)		C
	[0,60)		D
*/
int score;
scanf("%d", &score);
if (score >= 90 && score < 100)
{
    printf("A\n");
}
else if (score >= 80 && score < 90)
{
    printf("B\n");
}
else if (score >= 60 && score < 80)
{
    printf("C\n");
}
else if (score >= 0 && score < 60)
{
    printf("D\n");
}
else
{
    printf("SSS\n");
}

5.2.2 switch语句

语法

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

练习

//输入'+''-''*''/''%'' 使用switch计算5和3的正确结果
#include <stdio.h>

int main()
{
	char ch;
	int a, b;
	scanf("%d%c%d", &a, &ch, &b);
	switch (ch)
	{
		case '+': printf("%d%c%d=%d\n", a, ch, b, a + b); break;
		case '-': printf("%d%c%d=%d\n", a, ch, b, a - b); break;
		case '*': printf("%d%c%d=%d\n", a, ch, b, a * b); break;
		case '/': printf("%d%c%d=%d\n", a, ch, b, a / b); break;
		case '%': printf("%d%c%d=%d\n", a, ch, b, a % b); break;
		default: printf("error\n");
	}
	return 0;
}
//输入一个学生的考试分数,输出他的等级,使用switch语句
#include <stdio.h>

int main()
{
	int score;
	scanf("%d", &score);
	switch (score/10)
	{
		case 10: printf("SSS\n"); break;
		case 9: printf("A\n"); break;
		case 8: printf("B\n"); break;
		case 7:
		case 6: printf("C\n"); break;
		default: printf("D\n"); break;
	}
	return 0;
}

作业

//输入年月日,输出这天是这一年的第几天
#include <stdio.h>

int runyear[12] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int pingyear[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int main()
{
	int year, month, day, disday = 0;
	printf("请输入年月日\n输入格式:xxxx.xx.xx\n");
	scanf("%d.%d.%d", &year, &month, &day);
	if ((year % 4 == 0 && year %100 != 0) || year % 400 == 0)
	{
		printf("闰年\n");
		for (int i = 0; i < month - 1; i++)
		{
			disday += runyear[i];
		}
		disday += day;
	}
	else
	{
		printf("平年\n");
		for (int i = 0; i < month - 1; i++)
		{
			disday += pingyear[i];
		}
		disday += day;
	}
	printf("这一天是这一年的第%d天\n", disday);
}
//输入出生年月日和现在的年月日,计算你活了多少天
#include <stdio.h>

int runyear[12] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int pingyear[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int PinRun(int year)
{
	if ((year % 4 == 0 && year %100 != 0) || year % 400 == 0)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

int main()
{
	int now_year, now_month, now_day;
	int birth_year, birth_month, birth_day;
	int dis_day = 0;
	printf("请输入你的出生年月日\n格式:xxxx.xx.xx\n");
	scanf("%d.%d.%d", &birth_year, &birth_month, &birth_day);
	printf("请输入当前出生年月日\n格式:xxxx.xx.xx\n");
	scanf("%d.%d.%d", &now_year, &now_month, &now_day);
	if (PinRun(now_year) == 1)
	{
		for (int i = 0; i < now_month - 1; i++)
		{
			dis_day += runyear[i];
		}
		dis_day += now_day;
	}
	else
	{
		for (int i = 0; i < now_month - 1; i++)
		{
			dis_day += pingyear[i];
		}
		dis_day += now_day;
	}
	for (int i = birth_year; i < now_year; i++)
	{
		if (PinRun(i) == 1)
		{
			dis_day += 366;
		}
		else
		{
			dis_day += 365;
		}
	}
	if (PinRun(birth_year) == 1)
	{
		for (int i = 0; i < birth_month - 1; i++)
		{
			dis_day -= runyear[i];
		}
		dis_day -= birth_day;
	}
	else
	{
		for (int i = 0; i < birth_month - 1; i++)
		{
			dis_day -= pingyear[i];
		}
		dis_day -= birth_day;
	}
	printf("你活了%d天\n", dis_day);
}

5.3循环结构

5.3.1 while语句

语法:

while(表达式)
{
    语句块;
}
//当表达式的值为真时,执行语句块,直到表达式为假时,结束循环
//如果表达式的值永远为真,我们称之为死循环

练习:

//求100-200之间偶数的和
#include <stdio.h>

int main()
{
	int i = 100, even = 0;
	while(i <= 200)
	{
		if (i % 2 == 0)
		{
			even += i;
		}
		i ++;
	}
	printf("%d\n", even);
}

5.3.2 do...while语句

语法:

do
{
    语句块;
}while(表达式);
//先执行语句块,再判断表达式的是否为真,直至表达式的值为假
//do...while语句的语句块至少会被执行一次

特殊结构

do
{
    语句块;
}while(0);
//表示强调这里是一个功能整体

5.3.3 for语句

语法:

for(表达式1; 表达式2; 表达式3)
{
    语句块;
}
//规则:先执行表达式1,在判断表达式2是否为真,为真则执行语句块,再执行表达式3,再判断表达式2是否为真,直到表达式2为假退出循环
//for中的三个表达式都可以省略
//如果表达式2没有,默认为真,则为死循环

练习:

//求一个整数的n次方
#include <stdio.h>

int main()
{
	int a, b, p = 1;
	printf("底数:");
	scanf("%d", &a);
	printf("指数:");
	scanf("%d", &b);
	for ( ; b > 0; b--)
	{
		p *= a;
	}
	printf("%d\n", p);

}
//输入一个正整数,逆序输出这个整数的每一位
#include <stdio.h>

int main()
{
	int a, b;
	printf("输入一个正整数:\n");
	scanf("%d", &a);
	if (a == 0)
	{
		printf("%d", a);
	}
	else
	{
		while(a != 0)
		{
			b = a % 10;
			a = a / 10;
			printf("%d", b);
		}
	}
	printf("\n");
}
//输入一个正整数,输出他的阶乘
#include <stdio.h>

int main()
{
	int a, f = 1;
	scanf("%d", &a);
	for (int i = a; i > 0; i --)
	{
		f *= i;
	}
	printf("%d\n", f);
}
//判断一个数是否是质数
#include <stdio.h>

int main()
{
	int a;
	printf("请输入一个数:");
	scanf("%d", &a);
	for (int i = 2; i < a; i++)
	{
		if (a % i == 0)
		{
			printf("不是质数\n");
			return 0;
		}
	}
	printf("是质数\n");
}
//判断一个数是否为水仙花数
#include <stdio.h>

int main()
{
	int num, a, b, c;
	printf("请输入0-999的数\n");
	scanf("%d", &num);
	a = num / 100;
	b = num / 10 % 10;
	c = num % 10;
	if (a * a * a + b * b * b + c * c * c == num)
	{
		printf("%d是水仙花数\n", num);
	}
	else
	{
		printf("%d不是水仙花数\n", num);
	}
}
//输入两个正整数,输出他们的最大公约数,输出他们的最小公倍数
#include <stdio.h>

int max(int a, int b)
{
	if (a > b)
	{
		return a;
	}
	else
	{
		return b;
	}
}

int main()
{
	int a, b;
	printf("输入两个正整数\n请输入第一个正整数\n");
	scanf("%d", &a);
	printf("请输入第二个正整数\n");
	scanf("%d", &b);
	for (int i = max(a, b); i > 0 ; i--)
	{
		if (a % i == 0 && b % i == 0)
		{
			printf("最大公约数是%d\n", i);
			break;
		}
	}
	for (int i = max(a, b); ; i ++)
	{
		
		if (i % a == 0 && i % b == 0)
		{
			printf("最小公倍数是%d\n", i);
			return 0;
		}
	}
}

5.4 break和continue

5.4.1 break

用来跳出当前的循环或分支。

5.4.2 continue

立即结束本次循环。

5.5 goto语句

语法:

goto 标识符;
//标识符:用来标识一行代码。
//跳转至被标识符标识的那一行代码去执行。

goto是无条件跳转,一般是都是配合if使用。

作业:

1.求表达式a + aa + aaa + aaaa + ... + aaaaa....的值

输入: 2 5

输出: 2 + 22 + 222 + 2222 + 22222

#include <stdio.h>

int power(int a, int b)
{
	int p = 1;
	for ( ; b > 0; b--)
	{
		p *= a;
	}
	return p;
}

int main()
{
	int a, n;
	int num, sum = 0;
	scanf("%d\r%d", &a, &n);
	for(int i = n; i >= 0; i--)
	{
		num = 0;
		for(int j = 0; j < i; j++)
		{
			num += a * power(10, j);
		}
		sum += num;
	}
	printf("%d\n", sum);

}

2.求一个整型数中二进制表示中有多少个1

#include <stdio.h>

int main()
{
	int num, sum = 0;
	scanf("%d", &num);
	while(num)
	{
		sum += num % 2;
		num /= 2;
	}
	printf("一共有%d个1\n", sum);
}

3.打印九九乘法表

#include <stdio.h>

int main()
{
	for (int i = 1; i < 10; ++i)
	{
		for (int j = 1; j <= i; ++j)
		{
			printf("%d*%d=%d\t", j, i, i*j);
		}
		printf("\n");
	}
}

4.求连续的正整数之和,一个正整数,有可能表示为n个连续的正整数之和

​ 15 = 1 + 2 + 3 + 4 + 5

​ 15 = 4 + 5 + 6

​ 15 = 7 + 8


5.思考第4题,除了穷举法之外的另一种方法


6.数组

6.1数组的概念

一组具有相同类型,相同含义的数据类型的有序集合

数组不是基本类型,是构造类型。

数组的本质/数组的存储方式:一片地址连续的空间。

6.2一维数组

语法:

元素类型 数组名[整型常量/常量表达式/变量表达式] {={初始值列表}};
元素类型:合法类型即可
数组名  :符合C语言标识符的命名规则即可
    [] :括号内指定数组的元素个数
示例:
int arr[10];

int a = 10;				//按照编译器支持的C标准,如果C标准在C90之前,则不可以这样定义
int arr[a];				//如果在C90之后,则可以这么定义,但这种方式不可以进行初始化

初始化:

在{ }中写入一串初始化值列表,每个初始值用逗号隔开

//示例
//对全部元素的初始化
int a[5] = {1, 2, 3, 4, 5};
//对部分元素的初始化
int a[5] = {1, 2};	//1会被赋值给a[0],2会被赋值给a[1],剩下的采用默认值0
int a[5] = {0};		//将数组中的所有元素初始化为0
//初始化值列表决定数组元素个数
int a[] = {1, 2, 3, 4, 5};//[]中的表达式被省略,这是数组的元素个数等于初始化值列表中值的个数
char str[] = "hello world";

引用数组内元素:

int a[5] = {1, 2, 3, 4, 5};
a[0];//访问数组a中的第0个元素
a[1];//访问数组a中的第1个元素
a[4];//访问数组a中的第4个元素
//访问大于元素个数的元素可能会导致程序混乱

数组的使用:

//定义一个数组,从键盘中输入各个元素的值,并依次打印出来
int a[10];
for(int i=0; i<10; i++)
{
    scanf("%d", &a[i]);
}
for(int i=0; i<10; i++)
{
    printf("%d\t", a[i]);
}
//输出一个数组中所有元素的地址
int a[10];
for(int i=0; i<10; i++)
{
    printf("%p\n", &a[i]);	//%p 输出一个地址
}

练习:

1.求一个数组中所有数组元素的和,数组元素的个数自由设定

#include <stdio.h>

int main()
{
	int arr[5];
	int sum = 0;
	for(int i=0; i<5; i++)
	{
		scanf("%d", &arr[i]);
	}
	for(int i=0; i<5; i++)
	{
		sum += arr[i];
	}
	printf("%d\n", sum);
}

2.定义一个数组(任意长度)输出一个数组中的最大值和最小值

#include <stdio.h>

int main()
{
	int arr[5];
	int max,min;
	for (int i=0; i<5; i++)
	{
		scanf("%d", &arr[i]);
	}
	max = arr[0], min = arr[0];
	for(int i=0; i<5; i++)
	{
		if(arr[i] < min)
			min = arr[i];
		if(arr[i] > max)
			max = arr[i];
	}
	printf("max:%d\nmin:%d\n", max, min);
}

6.3排序问题

将一组数据按照一定的规则进行排序使之有序。

6.3.1插入排序

插入排序是一种简单直观的排序算法。它的原理是将待排序的元素依次插入到已排好序的元素序列中的适当位置,直到所有元素都插入完毕。

6.3.2冒泡排序

#include <stdio.h>

int main()
{
	int arr[10];
	int temp;
	printf("冒泡排序,输入10个整数:\n");
	for(int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
	{
		scanf("%d", &arr[i]);
	}
	for(int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
	{
		for(int j = i; j < sizeof(arr) / sizeof(arr[0]); j++)
		{
			if(arr[i] < arr[j])
			{
				temp = arr[i];
			    arr[i] = arr[j];
			    arr[j] = temp;
			}
		}
	}
	for(int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
	{
		printf("%d ", arr[i]);
	}
}

6.3.3选择排序

#include <stdio.h>

int main()
{
    int arr[10];
	int a, b, c, index, max, temp;
	printf("\n选择排序,输入10个整数\n");
	for(int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
	{
		scanf("%d", &arr[i]);
	}
	for(a = 0; a < 10; a++)
	{
		max = arr[a],index = a;
		for(b = a; b < 10; b++)
		{
			if (arr[b] > max)
			{
				max = arr[b];
				index = b;
			}
		}
		temp = arr[a];
	    arr[a] = arr[index];
	    arr[index] = temp;
	}
	for(int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}

作业:

0.实现冒泡、选择的降序排序代码

#include <stdio.h>

int main()
{
	int arr[10];
	int a, b, c, index, max, temp;
	printf("冒泡排序,输入10个整数:\n");
	for(int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
	{
		scanf("%d", &arr[i]);
	}
	for(int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
	{
		for(int j = i; j < sizeof(arr) / sizeof(arr[0]); j++)
		{
			if(arr[i] < arr[j])
			{
				temp = arr[i];
			    arr[i] = arr[j];
			    arr[j] = temp;
			}
		}
	}
	for(int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n选择排序,输入10个整数\n");
	for(int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
	{
		scanf("%d", &arr[i]);
	}
	for(a = 0; a < 10; a++)
	{
		max = arr[a],index = a;
		for(b = a; b < 10; b++)
		{
			if (arr[b] > max)
			{
				max = arr[b];
				index = b;
			}
		}
		temp = arr[a];
	    arr[a] = arr[index];
	    arr[index] = temp;
	}
	for(int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}

1.逆置数组中的所有元素

#include <stdio.h>

int main()
{
	int arr[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
	int temp;
	for (int i = 0; i < 10/2; ++i)
	{
		temp = arr[i];
		arr[i] = arr[10-i-1];
		arr[10-i-1] = temp;
	}
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}

2.假设有两个有序数组,请将这两个数组中的数据合并到第三个数组中,并且合并之后仍然有序

#include <stdio.h>

int main()
{
	int arr1[5];
	int arr2[5];
	int arr3[10];
	int j, temp;
	printf("输入5个不同的整数\n");
	for(int i = 0; i < 5; i++)
	{
		scanf("%d", &arr1[i]);
	}
	printf("再输入5个不同的整数\n");
	for(int i = 0; i < 5; i++)
	{
		scanf("%d", &arr2[i]);
	}
	for(j = 0; j < 5; j++)
	{
		arr3[j] = arr1[j];
	}
	for( ; j < 10; j++)
	{
		arr3[j] = arr2[j-5];
	}
	printf("数组合并为\n");
	for(int i = 0; i < 10; i++)
	{
		printf("%d ", arr3[i]);
	}
	printf("\n排序\n");
	if(arr3[0] > arr3[1])
	{
		for(int i = 0; i < 10; i++)
		{
			for(int j = i; j < 10; j++)
			{
				if(arr3[i] < arr3[j])
				{
					temp = arr3[i];
				    arr3[i] = arr3[j];
				    arr3[j] = temp;
				}
			}
		}

	}
	else
	{
		for(int i = 0; i < 10; i++)
		{
			for(int j = i; j < 10; j++)
			{
				if(arr3[i] > arr3[j])
				{
					temp = arr3[i];
				    arr3[i] = arr3[j];
				    arr3[j] = temp;
				}
			}
		}
	}
	for(int i = 0; i < 10; i++)
	{
		printf("%d ", arr3[i]);
	}
	printf("\n");
}

3.求最大连续子数组之和

​ 假设有一个数组,数组元素值为:1 2 6 8 9 10 -11 3 4 5

​ 请找出一个连续的片段,并保证这个连续的片段中的数组的和是所有可选片段中的最大值


选作:

1.完成插入排序


2.大数保存法

​ 假设有一个很大位数的数,这个数超过了我们已知的所有基本类型可保存的最大范围,非常大,可能 long long 类型也保存不了,设计一种保存方式,可以使得这样的两个大数相加仍然可以计算结果。


6.4二分查找

假设有一组有序的序列,mid指向中间元素,left指向最左边的元素,right指向最右边的元素,相当于将这个序列一分为二;问题要求是要找到某个元素对应的下标;第一次查找和mid指向的元素进行比较,假设要找的元素比mid指向的元素大,所以mid左边的元素就不需要考虑了;因为元素还没有找到,所以需要继续二分,将left指向(mid+1)所指向的元素,mid重新指向left到right包括的新序列的中间元素,一次类推,直至找到元素。

6.5字符数组

字符数组也是一个数组,只是一般用来保存字符集/字符串

char ch[5] = {'1', '2', 'a', 'b', 'A'};
char ch1[5] = {'1', '2'}  //ch1[2-4] == 0 == '\0'
//输出ch中的元素可以
for(i=0; i<5; i++)
    printf("%c", ch[i]);
//输出ch1中的元素可以
printf("%s\n", ch1);

字符集和字符串的区别

​ 字符集:若干个字符的集合。

​ 字符串:字符集 + '\0' ; '\0'是字符串的停止符

%s:输出字符数组中的字符,直到碰到'\0'停止

​ 字符串的特殊表示:" " 例如"hello world";末尾有一个隐藏的'\0'

6.6二维数组

语法

数据类型 数组名[行大小][列大小];
int a[3][4];  //3行4列

初始化

int a[2][3] = {1, 2, 3, 4, 5, 6};
int a[2][3] = {{1, 2, 3}, {4, 5, 6}};
//{1, 2, 3}赋值给第0行的第0列、第1列、第2列
//{4, 5, 6}赋值给第1行的第0列、第1列、第2列

int a[2][3] = {1, 2, 3};
int a[2][3] = {{1, 2}, {4}};
//部分初始化,其余默认给0

二维数组只能省略行大小,不能省略列大小

int a[][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
//等价于:int a[4][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

给二维数组进行赋值

int a[3][4];
for(int i = 0; i < 3; i++)		//行
{
    for(int j = 0; j < 4; j++)	//列
    {
        scanf("%d", &a[i][j]);
    }
}

标签:10,arr,int,C语言,++,printf,表达式
From: https://www.cnblogs.com/aalynsah/p/17521416.html

相关文章

  • C语言笔记:第10章 数组和指针
    数组:https://www.cnblogs.com/mjios/archive/2013/03/15/2961147.html指针:https://www.cnblogs.com/mjios/archive/2013/03/16/2963645.html ......
  • 浅析C语言之uint8_t / uint16_t / uint32_t /uint64_t
    一、C语言基本数据类型回顾在C语言中有6种基本数据类型:short、int、long、float、double、char1、数值类型1)整型:short、int、long2)浮点型:float、double2、字符类型:char二、typedef回顾typedef用来定义关键字或标识符的别名,例如:typedefdoublewages;typedefwagessal......
  • C语言字节对齐
    C/C++编译器的缺省字节对齐方式为自然对界。即在缺省情况下,编译器为每一个变量或是数据单元按其自然对界条件分配空间。在结构中,编译器为结构的每个成员按其自然对界(alignment)条件分配空间。各个成员按照它们被声明的顺序在内存中顺序存储(成员之间可能有插入的空字节),第一个成员......
  • 小智-c语言
    1.环境搭建2.char&short&int  3.if&switch两种状态if,多种状态switch开关灯if,网络状态switch4.for&whilefor比while代码更紧凑5.static关键字 初始化只在第一次做6.const关键词在C语言中,const是一个关键字,用于声明常量或指定变量为只读。它是C语言......
  • C语言笔记:第8章 字符输入输出
    字符函数getchar()、putchar()与EOF详解:https://www.cnblogs.com/52php/p/5723666.html缓冲区:https://www.cnblogs.com/xkdn/p/14580178.htmlhttps://www.cnblogs.com/buyizhiyou/p/5505280.html ......
  • C语言笔记:第5章 运算符,表达式和语句
    基本运算符算术运算符+加法运算符-减法运算符,或负值运算符*乘法运算符/除法运算符%模运算符,或称取余运算符,要求%两侧均为整型关系运算符<小于运算符<=小于等于运算符>大于运算符>=大于等于运算符==等于运算符!=不等于运算符关系运算的结果成立就为"......
  • C语言笔记:第4章 字符串和格式输入输出
    字符串简介:2123   printf函数和scanf函数printf函数输出格式详解:https://www.cnblogs.com/Ahair/p/5017050.htmlhttps://www.cnblogs.com/wucongzhou/p/12668766.htmlscanf函数输入格式详解:https://www.cnblogs.com/morya/p/6067479.htmlhttps://www.cnblogs.com/wu......
  • C语言笔记:第3章 数据和C
    C语言中,数据类型可以分为基本数据类型、构造数据类型、指针数据类型、空类型四大类: 基本类型介绍如下: 整型数据是指不带小数的数字(int,shortint,longint,unsignedint,unsignedshortint,unsignedlongint):  转义列表: ......
  • 一周课程学习总结1【关于Linux和c语言程序设计】
    前言这周是我正式开始学习嵌入式的第一周,首先学习了c语言环境的安装,简单的了解了Linux,然后学习了c语言程序设计的部分内容。下面是对这周学习内容的一些总结和我的个人理解,如有不对之处还请指出。LinuxLinux优点:1)开放性;2)完全免费;3)多用户;4)多任务;5)良好的用户界面;6)设备独立......
  • C语言实现红黑树
    红黑树Red-blacktree 自平衡二叉查找树,可在O(logn)时间内完成查找,插入和删除。强查找.Linux 进程调度CFSepoll 事件块的管理NginxTimer事件管理性质每个节点是红色的或者黑的根节点是黑的每个叶子节点是黑的如果一个节点是红的,则它的两个儿子都是黑的对每个......