[黑马程序员]08[C语言]数组部分学习总结
来源:互联网 发布:微信淘宝客发单机器人 编辑:程序博客网 时间:2024/05/29 17:35
------- android培训、java培训、IOS培训、期待与您交流! ----------
1. 数组的基本概念
//int main()
//{
// //intnums[5];
// //表示的涵义是声明了5个int类型的变量,分别是:nums[0],nums[1],nums[2]....
//
// //数组的初始化:
// //1.如果不初始化,会有垃圾数
// //2.和变量的使用一样需要先定义,再初始化,再使用(一般情况)
// //初始化方法:
// //1>定义数组再初始化
// //2>定义同时初始化(可以使用变量作为数组的长度)
// //3>由用户输入数字,确定数组的长度,再使用循环进行初始化(从c99才开始可行),最好用宏定义进行替换
//
// return 0;
//}
//数组练习:
//这种动态分配数据兼容性很好,上面的在早期编译环境下可能无法通过,性能比上面好一点点(可忽略)[更普遍的用法]
//#define LEN 256
//
//int main()
//{
// //使用宏定义定义一个数组
// //需要有一个变量记录一共输入了多少个数字
// //每次输入数字的时候让这个数++
//
// //尝试使用循环初始化数组,如果用户输入的是q表示输入结束,进行统计
// int i =0,num,temp,nums[LEN];
// char ch;
// while (1) {
// temp=scanf("%d",&num);//temp =scanf(%d,&num), temp获取的时scanf函数获取值的个数,只能为0或者1
//
// if (temp==1) {
// nums[i++] =num;
// }else
// {
// scanf("%c",&ch);
// if (ch =='q') {
// break;
// }
// }
// }
//// int n;
////
//// int number = scanf("%d",&n);
////
//// return 0;
// return 0;
//}
//数组练习:打印n的二进制格式
//利用一个数组和一个变量模拟栈结构
//int main()
//{
// int i,nums[10];
//
// nums[i++]=10;
//
// //取数据
// nums[i--];
//
// return 0;
//}
//int main()
//{
// int num =-2,len =0,nums[256],temp;
//
// for (int i=0; i <32; i++) {
// temp = num &1;
// num>>=1;
// nums[len++]= temp;
// }
//
// for (int i =0; i <32; i++) {
// printf("%d",nums[--len]);
// }
// printf("\n");
//
// return 0;
//}
//练习04:用户输入字符,统计字符出现个数
int main()
{
//方法1:
//只需要一个int型数组intnums[256]
//初始全为0;
//把下标与字符一一对应,出现某字符直接在该字符对应的数组元素位置+1
//方法2:
//int nums[256]
//char chs[256]
//两个数组构成一一对应的关系
//用户每次输入一个字符,判断是否子啊字符数组中,不如不在在数组的结尾追加字符
//并在数字数组的结尾追加一个1
//如果字符存在,就在字符数组中找出字符的位置i
//取出数字数组中位置为i的数据自增,即nums[i]++
char chs[256] ={0};
char ch;
//用户一次性输入,回车结束
while (1) {
scanf("%c",&ch);
if (ch =='\n') {
break;
}else
{
chs[ch]++;
}
}
for (int i =0; i<256; i++) {
if (chs[i]>0) {
printf("字符%c出现%d次\n",i,chs[i]);
}
}
return0;
}
2. 数组名作为函数参数
int main()
{
//如果一个函数的参数是一个数组,那么调用函数时,只需要将数组名放到函数参数中即可
//传递的时数组的首地址,可以使用nums[i]来访问数组里面的某一个元素
//int array[10] ={,,,,,,,};
return0;
}
//希望初始化:全为0,全为1,全为-1
void iniWithZero(int nums[10])
{
}
//sizeof可以计算出数组的长度
//sizeof(nums)/sizeof(int);
//一维数组作为函数参数的时候,方括号的数字可以省略,传入的数组长度永远会打印8
//使用数组名作为函数参数的时候,应该附带一个int参数表示数组的长度
//3.数组是一个常量,指针是变量
//int length;
//length表示数组中有几个数据是可以使用的
//当执行nums[length++]=1;
//length标记了数组的长度
//length还可以用来进行循环遍历
//length记录了数组添加元素的下一个位置
3. 数组排序(主要需要掌握冒泡和二分法)
//1.冒泡排序
//不要求成为算法大师,只是需要熟练使用数组下标
//冒泡排序算法规则:
//比较相邻的两个元素,如果一个较大或者较小,就交换两个元素的位置
//#define LENGTH 11
//void bubble_sort(int*array,int length);
//
//int main()
//{
// int nums[LENGTH] ={3,2,5,4,1,-9,89,34,-34,-1,234};
//
// bubble_sort(nums,LENGTH);
//
// for (int i =0; i <LENGTH; i++) {
// printf("%d ",nums[i]);
// }
// printf("\n");
//
// return 0;
//}
//
//void bubble_sort(int*array,int length)
//{
// for (int i =0; i <length-1; i++) {
// for (int j =0; j <length-i-1; j++) {
// if (array[j]>array[j+1]) {
// int temp =array[j];
// array[j] =array[j+1];
// array[j+1]=temp;
// }
// }
// }
//}
//二分查找
#include<stdio.h>
#define LENGTH9
int erFenSort(int *array,int length,int search);
int main()
{
int nums[LENGTH]={1,2,3,4,5,6,7,8,9};
int n =5;
int result =erFenSort(nums,LENGTH,n);
printf("%d\n",result);
return0;
}
int erFenSort(int *array,int length,int search)
{
int lower =0;
int higher =length -1;
int mid;
while (lower <= higher) {
//首先计算中间数字
mid = (lower +higher)/2;
if (search ==array[mid]) {
//找到了
return mid;
break;
}elseif(search >array[mid]){
//去右边找
lower = mid+1;
}else{
higher =mid-1;
}
}
//判断是否找到
return -1;
}
void init(int *array)
{
//创建数组
}
void bubbleSort(int *array,int length)
{
//排序
}
4. 访问二维数组成员
// 难点
// 1>二维数组的成员是什么 int nums[2][3];
// 成员:nums[0][0] 成员:nums[0],nums[1];
// 2>首先讨论数组名的使用 int nums[2][3];
// 此时定义了一个二维数组 1)nums (二维数组首地址) 2)nums[0]将其当做一位数组看,表示这个数组的首地址
// 它们的类型是什么?有什么区别?
// nums+1移动12个字节,nums[0]移动4个字节;因此nums是数组类型,nums[0]是int类型
// 指针变量的类型是几个字节,那么+1运算是,就移动几个字节
// nums[0]是指向int类型的指针
// *(nums[0]) ==nums[0][0]
// nums是指向数组类型的指针
// *(nums) == nums[0]; //nums[0]是数组
// nums[0]就是一维数组的首地址,就是指向int类型的指针
int test()
{
int nums[2][3] = {1,2,3,4,5,6};
for (int i=0; i<6; i++) {
printf("%d ",*(nums[0]+i));
}
printf("\n");
return0;
}
// nums + i在垂直方向移动,表示指向不同的二维数组中得"一维数组"
// nums[i] + j表示在第i行的水平方向移动,指向一个int类型的变量
// nums + i表示指向数组, *(nums + i)表示之指向这个数组的第一个元素
// *(nums + i) + j表示指向这个数组中得第j个元素
// *(*(nums + i) + j)指的是指向的变量
// 3.首先学习一个新的概念
// 指向int类型的指针,int指针,指向一个int数组的指针,数组指针(int数组二维指针)
// 数组指针是一个指向一个数组的指针(区别于指向数组元素的指针)
// 指向二维数组元素的指针
// 数组名就是一个数组指针
// 数组指针定义:
// 类型(*数组指针变量名)[长度]int (*p)[3]
// 初始化:
// 数组指针变量名 =二维数组的名字;p = nums
// 数组指针变量名 =&一维数组的名字; p = &nums[0] ? // p指向nums[0]OK
int main()
{
int nums[2][3] = {1,2,3,4,5,6};
// 声明了一个数组指针
// 这个指针p式指向一个长度为3的int类型的数组
// nums数组
// nums[0]
// nums[1]
int (*p)[3];
p = nums; // p指向nums[0]
// *p == nums[0]
// *(nums[0])
// **p
return0;
}
// 4.可以尝试使用一个指向int类型的指针去访问一个二维数组
// 设立一个int类型的指针,指向二维数组的第一个元素,通过p+i进行访问
//若i起始为1,对应的行号为i/列号,对应的列号为i%列号
- [黑马程序员]08[C语言]数组部分学习总结
- 黑马程序员----- c语言 数组学习
- 黑马程序员--学习C语言数组
- [黑马程序员]09[C语言]循环控制语句部分学习笔记总结
- [黑马程序员]06[C语言]指针部分笔记总结-01
- [黑马程序员]07[C语言]指针部分笔记总结-02
- 黑马程序员------C语言函数部分总结(一)
- 黑马程序员------C语言函数部分总结(二)
- 黑马程序员——C语言基础学习(四)---数组和指针的总结学习
- 黑马程序员_object c学习日记_c语言部分
- 黑马程序员之IOS学习总结——04 C语言中数组与字符串
- 黑马程序员--C语言数组
- 【黑马程序员】【C语言】数组
- 【黑马程序员】C语言数组
- 黑马程序员 - C语言 - 数组
- 黑马程序员----c基础笔记----数组部分
- 【黑马程序员】C语言学习笔记之数组(九)
- 黑马程序员-c语言学习之数组小结
- [黑马程序员]07[C语言]指针部分笔记总结-02
- 拉格朗日反演
- POJ 2081 解题报告
- PHP常用脚本
- C++学习 - 虚表,虚函数,虚函数表指针学习笔记
- [黑马程序员]08[C语言]数组部分学习总结
- 正则表达式口诀
- java编写九九乘法表
- php项目中代码的调试问题
- VS零散笔记
- IG&IC&Pra 安装教程 在线源方式安装 (无需要电脑联接手机)
- Android Fragment 真正的完全解析(上)
- [黑马程序员]09[C语言]循环控制语句部分学习笔记总结
- Android Fragment 真正的完全解析(下)