总目录学习地址
https://bbs.csdn.net/topics/615165403?spm=1001.2014.3001.6376
新星计划导师:凉云生烟凉云生烟的博客_CSDN博客-知识分分享,PTA,刷题领域博主
【C语言】数组(详细讲解+源码展示)_c语言数组_凉云生烟的博客-CSDN博客
一维数组的初始化
我们在定义数组的同时进行赋值,就叫做初始化。如果全局数组不做初始化,那么编译器将其初始赋值为零。但是局部数组如果不进行初始化,那么其内容将为随机值。
#include <stdio.h>
int b[5] ; //定义全局数组
int main()
{
int a[5] = { 1, 2, 3, 4, 5 } ; //定义一个数组并进行初始化
int c[5] ; //定义局部数组
int d[] = {1, 2, 3} ; //如果[]中不定义元素个数,定义时必须初始化
int e[5] = { 0 };//所有的成员都设置为0
return 0;
}
2)字符串初始化赋值
在 C 语言中,字符串一般是指含有字符串结束符 '\0' 的若干个字符的集合。而使用双引号括起来的字符串常量,默认隐含字符串结束符 '\0'。
char a[15] = {"Hello World"}; //注意该数组大小应足够大 不然会报错
为了防止字符个数超出数组空间的现象,我们在采用字符串对字符数组进行初始化时,一般省略一维数组空间的大小,即:
char a[] = {"Hello World"} ;
该数组中除了存储字符串中的 11 个有效字符外,还自动在字符串的结尾存储 '\0' 字符。所以该数组的大小为 12。
二维数组
int a[3][4] ;
元素 a[i][j] 表示第 i+1 行、第 j+1 列的元素。数组 int a[m][n] 最大范围处的元素是 a[m–1][n–1]。
二维数组的初始化
//按行进行初始化
int a[3][4] = {{ 1, 2, 3, 4 },{ 5, 6, 7, 8, },{ 9, 10, 11, 12 }} ;
//连续赋值初始化
int a[3][4] = { 1, 2, 3, 4 , 5, 6, 7, 8, 9, 10, 11, 12 } ;
//部分元素初始化
int a[3][4] = { 1, 2, 3, 4 } ;
//全员赋0初始化
int a[3][4] = {0} ;
//第一维不定义初始化
int a[][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
用内存大小的比值去计算出二维数组行数和列数
//求二维数组行数
printf("i = %d\n", sizeof(a) / sizeof(a[0])) ;
// 求二维数组列数
printf("j = %d\n", sizeof(a[0]) / sizeof(a[0][0])) ;
//求二维数组行*列总数
printf("n = %d\n", sizeof(a) / sizeof(a[0][0])) ;
【C语言】数组的强化训练(详细讲解+源码展示)_凉云生烟的博客-CSDN博客
【C语言】深入浅出理解指针及内存与指针的关系(详细讲解+代码展示)_c语言指针内存奥秘_凉云生烟的博客-CSDN博客
指针
声明一个指针
上面说到指针就是一个变量所以,指针的声明方式与一般的变量声明方式没太大区别:
int *p ; // 声明一个 int 类型的指针 p
char *p ; // 声明一个 char 类型的指针 p
int *arr[10] // 声明一个指针数组,该数组有10个元素,其中每个元素都是一个指针。
int (*arr)[10] // 声明一个数组指针,该指针指向一个 int 类型的一维数组
int **p; // 声明一个指针 p ,该指针指向一个 int 类型的指针,也就是我们的二级指针。
扩展题目的解题思路:
1 . 找一维数组的最值:定义最大值和最小值,从前往后遍历,当前元素比最大值大,就更新最大值。当前元素比最小值小,就更新最小值。
/*
sizeof(a)表示数组a大小, sizeof(a[0]表示数组中一个元素大小
因为一个数组中所有的元素大小均相等,
所有我们用数组大小除以元素大小就可以得到数组长度了
所以 sizeof(a) / sizeof(a[0] 就是数组a的长度了
*/
for (i = 1; i < sizeof(a) / sizeof(a[0]); i++) //从第二个元素向后循环
{
if (a[i] > max) //当元素比最大目标数大的时候
{
max = a[i]; //更新最大目标数
}
if(a[i] < min) //当元素比最小目标数小的时候
{
min = a[i] ; //更新最小目标数
}
}
————————————————
版权声明:本文为CSDN博主「凉云生烟」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_62464995/article/details/126570396
2 . 一维数组逆置:两个变量的初始值就是首尾下标,然后我们利用这两个变量循环,让两个变量从两边向中间移动,每移动一格我们就将两个下标所对应的元素进行交换,这样当两个下标移动到中间时,我们的数组也就逆置完成了。
for(i=0, j=sizeof(a) / sizeof(a[0]) -1; i<j; i++, j--)
3 . 冒泡排序:从前向后进行循环,比较相邻的元素,把大的放到后面。每一轮,会选择出一个最大的元素放到后面。
for (i = 0; i < n-1; i++) //从前向后进行循环
{
for (j = 0; j < n - i -1 ; j++) //内循环的目的是比较相邻的元素,把大的放到后面
{
if (a[j] > a[j + 1]) //比较
{
tmp = a[j];
a[j] = a[j+1];
a[j+1] = tmp;
}
}
}
————————————————
版权声明:本文为CSDN博主「凉云生烟」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_62464995/article/details/126570396
4 . 二维数组——根据里面的分数去计算出平均成绩和不合格人数:
二维数组的行数就代表了我们考试的人数,而二维数组的列数,就代表了我们考试的科目。然后我们从第一位同学的每科成绩开始存起。
如果计算平均成绩的话,我们要保证列不变,也就是二维数组的第二个下标不变化,遍历第一个下标去计算平均值。
判断每科不合格也是先按列不动,遍历行数,判断该科目不合格人数,之后我们改列,然后继续遍历即可。
for (i = 0; i < 3; i++) //i是列
{
for (j = 0; j < 5; j++) //j是行
{
s = s + a[j][i];
if (a[j][i] < 60) //判断不合格人数
{
person_low[i]++;
}
}
lesson_aver[i] = s / 5 ; //计算平均数
s = 0;
}
————————————————
版权声明:本文为CSDN博主「凉云生烟」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_62464995/article/details/126570396
5 . 数字反转之-三位数:给定一个三位数的整数。然后提取百位,十位和个位,反转输出。
#include<iostream>
using namespace std ;
int main()
{
string a ;
cin >> a ;
for(int i=a.size()-1; i>=0; i--)
{
cout << a[i] ;
}
return 0 ;
}
6 . 上下取整:任意给出一个小数,编程求不小于它的最小整数与不大于它的最大整数。
即求出这个小数往下取整与往上取整的值。
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
double num;
cin >> num;
int floor_num = floor(num) ;
int ceil_num = ceil(num) ;
cout << floor_num << endl ;
cout << ceil_num << endl ;
return 0;
}
7 . 输入一个整数, 求它的平方根,输出答案往下取整.
#include<iostream>
#include<cmath>
using namespace std ;
int main()
{
int n, q = 0 ;
cin >> n ;
q = floor(sqrt(n)) ;
cout << q ;
return 0 ;
}
8 . 输入一个浮点数f, 表示华氏温度, 输出对应的摄氏温度c , c=5/9*(f-32)
用到了double强制类型转换
#include<iostream>
using namespace std ;
int main()
{
double n, c ;
cin >> n ;
c = (double)5/9*(n-32) ;
printf("%.3lf", c) ;
return 0 ;
}
9 .新的四舍五入应用于整数,对个位四舍五入,规则如下12345->12350;12399->12400;
#include<iostream>
using namespace std ;
int main()
{
int n , m ;
cin >> n ;
m=(n+5)/10*10 ; //利用int的特性,加5,除以10,再乘10
cout << m ;
}