1.一维数组
int scores[5];//数组的声明
#define LENGTH 5
int scores1[LENGTH];//使用宏定义声明
scores[0]=10;//一维数组的访问,使用下标索引,下标从0开始
//arr[5]=100;X//数组下标越界。可能得到非期望值
int i;
i=arr[1];//使用第二个元素进行赋值
//数组初始化为0
int arr1[5]={1,2,3,4,5};
char codes[5]={'A','b','c','D','e'};
double pices[3]={1.2,2.4,3.6};
//数组初始化必须在数组声明时
//数组声明时可以省略数组长度,但是需要初始化数据来决定长度
int arr1[ ]; //代码错误,数组长度不可知
int codes[ ] = {1, 2, 3, 4, 5}; //代码正确
//数组初始化时的初始化数据个数可以不跟数组长度匹配
int arr1[5] = {1, 2, 3}; //数组前三个元素被初始化
int codes[3] = {1, 2, 3, 4, 5}; //最后两个值被丢弃
2.冒泡排序法、折半查找法
//冒泡排序法
//例:使用数组进行冒泡排序,要求结果从大到小排列,并且输出排序后的结果
/*
void func3(int a[]);
int main(int argc, const char * argv[]) {
int scores[5]={88,77,66,100,99};
func3(scores);
return 0;
}
void func3(int a[]){ //传参传递的是数组的地址
for (int i=0; i<4; i++) { //进行比较趟数
for (int j=0; j<4-i; j++) { //每趟比较次数
if (a[j]<a[j+1]) { //将较小的值存入scores[j],较大的数值存入scores[j+1]
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
for (int i=0; i<5; i++) {
printf("%d ",a[i]);
}
}
//使用数组进行折半查找(二分查找)
void func4(int x);
int zheban(int n);
int main(int argc, const char * argv[]) {
int x;
printf("请输入你要找的数据(12,15,18,88,99)\n");
scanf("%d",&x);
func4(x);
printf("----------------------------\n");
printf("请输入你要找的数据(12,15,18,88,99,100)\n");
int location=zheban(x);
printf("%d是数组中下标为%d的值\n",x,location);
return 0;
}
void func4(int x){ //我做的 =.=只适应n为偶数,求各位大神指点
int arr[]={12,15,18,88,99};
int n=4;
for (int i=0; i<3; i++) {
if (x>arr[n/2]) {
n=n+n/2;
}else if (x<arr[n/2]) {
n=n-n/2;
}else{
printf("执行%d次后,找到下标%d的元素%d\n",i+1,n/2,arr[n/2]);
break;
}
}
}
int zheban(int n){ //老师答案
int scores[6]={12,15,18,88,99,100};
int left=0;
int right=5;
while (left<=right) {
int mid=(left+right)/2;
if (scores[mid]==n) {
return mid;
}
if (scores[mid]>n) {
right=mid-1;
}else{
left=mid+1;
}
}
return -1;
}
3.数组作为函数参数
1.传递给函数的数组是一个地址
2.只需要将数组首元素的地址传入即可//与指针作为参数的效果一样,会改变主函数中的数组值
3.在函数的参数声明时只需要将参数定义为数组形式即可,而无须定义长度
eg:void printArray(int arr[ ]); //函数声明
*中括号不能省略
<span style="font-size:10px;">eg.
//输入一个字符串,然后将其中的单词个数统计出来并打印
void funcdc(char str[]);
int main(int argc, const char * argv[]) {
char str[100];
printf("请输入一个字符串\n");
gets(str);
funcdc(str);
return 0;
}
void funcdc(char str[]){
int i=0;
int sum=0;
if (str[0]!=' ') { //字符串首字母为非空格(=1)时,单词总数+1
sum=1;
}
do {
//当前字符为空格且下一个字符为非空格时,单词总数+1
if (str[i]==' '&&str[i+1]!=' ') {
sum+=1;
}
i++;
} while (str[i]!='\0');
printf("字符串:%s\n一共有%d个单词\n",str,sum);
}</span>
<span style="font-size:10px;">eg.
//输入一个字符串,然后将其中的单词个数统计出来并打印
void funcdc(char str[]);
int main(int argc, const char * argv[]) {
char str[100];
printf("请输入一个字符串\n");
gets(str);
funcdc(str);
return 0;
}
void funcdc(char str[]){
int i=0;
int sum=0;
if (str[0]!=' ') { //字符串首字母为非空格(=1)时,单词总数+1
sum=1;
}
do {
//当前字符为空格且下一个字符为非空格时,单词总数+1
if (str[i]==' '&&str[i+1]!=' ') {
sum+=1;
}
i++;
} while (str[i]!='\0');
printf("字符串:%s\n一共有%d个单词\n",str,sum);
}</span>
4.字符串
字符串存储在字符数组中,结尾加上NULL(’\0’)作为字符串末端标志
字符串初始化:
char str[7] = "Hello!";//默认自动添加'\0'
char str[ ] = "Hello!";//默认自动添加'\0'
char str[7] = {'H', 'e', 'l', 'l', 'o', '!', '\0'};
char str[ ] = {'H', 'e', 'l', 'l', 'o', '!', '\0'};
//后面两种需要手动添加'\0'
字符串的输入和输出
-
使用getchar( )函数输入
char ch1=getcar();//(单)字符输入函数。当按回车键时,把第一个值赋给ch1。*只接收第一个字符,不管输入多少字符,按几次回车键。
-
使用putchar( )函数输出
getchar(c1);//(单)字符输出函数,将一个字符输出到标准输出设备。c1=字符变量、整型变量、整型常量,其值为字符的ASCII值
-
使用scanf( )函数输入
scanf("%s",str); //默认以空格分割
-
使用printf( )函数输出
printf("%d-格式控制字符串",i-输出参数表);//格式输出函数。数据项的个数、类型、顺序应与格式控制符对应一致
-
使用gets( )函数输入
gets(str);//输入到指定字符数组
-
使用puts( )函数输出
puts(str);//字符数组输出到标准输出设备--控制台
eg.
void func11(){ //声明字符串数组接受控制台输入的字符串 char str[100]; printf("请输入一个字符串\n"); //scanf("%s",str); //默认以空格分割 gets(str);//输入到指定字符数组 printf("您输入的字符串是:%s",str); puts(str);//输出到标准输出设备--控制台 } void func22(){ //声明字符数组接受控制台输入的字符串 char str[100]; char c; int i=0; //从控制台上获取输入的字符 //!=‘\n’ 判断字符是否回车 printf("请输入一个字符串\n"); while ((c=getchar())!='\n') { str[i]=c; //将获取到的字符存储到字符数组中 i++; } str[i]='\0'; printf("你输入的字符串是:%s",str); } int main(int argc, const char * argv[]) { func11(); func22(); return 0; }
字符串的相关库函数
包含string.h头文件 strcpy(str1,str2)
字符串复制函数,将str2的内容复制到str1中。
strcat(str1,str2)
字符串连接函数,将str2连接到str1之后
strlen(str)
获取字符串长度函数,不包括末端字符
strcmp(str1,str2)
字符串比较函数,str1大于str2返回正数,相等返回0,str1小于str2返回负数
字符的相关库函数
包含ctype.h头文件 常见的有以下几个函数
isalpha(chr)//该字符是否为字母 isupper(chr)//该字符是否为大写字母 islower(chr)//该字符是否为小写字母 isdigit(chr)//该字符是否为数字 …… toupper(chr)//小写字母转换为大写字母 tolower(chr)//大写字母转换为小写字母
字符串数字转换库函数
包含stdlib.h头文件
atoi(str)
将字符串转为整型数字函数
atof(str)
将字符串转为浮点型数字函数
字符串格式化
使用控制字符串进行字符串的输入和输出
控制字符串
%s代表字符串,默认左对齐,%-s代表右对齐
%10s代表输出占据10个字长,如果不足则按照对齐方式对其进行空格的填充以补齐占据长度
%10.3s代表输出占据10个字长,从格式化之前取3个长度字符串
sprintf(str1,format,str2)
将str2按format格式化的结果存入str1中
sscanf(str,format,变量1,变量2……)
从str按照format进行扫描,存入相应变量中
二维数组
二维数组的声明:
int values[3][4];
double prices[3][6];
char messages[4][100];
二维数组元素的访问
values[0][0] = 10; //第1行第1个元素
values[1][3] = 30; //第2行第4个元素
printf(“%d”,values[2][2]); //访问第3行第3个元素
sum = 0;
for(i = 0;i < 3;i++){
for(j = 0;j < 4;j++){
sum += values[i][j];
}
}
二维数组的初始化
int values[3][4] ={{81,16,11,34},{23,45,33,55},{12,32,45,53}};//指定行列个数
int values[3][4] = {8,1,11,34,23,45,33,55,12,32,45,53};//不用明显指出行,由系统自动分配
int values[ ][4] = {81,16,11,34,23,45,33,55,12,32,45,53};//初始化可以省略行数,列数不能省略
随堂笔记为个人学习笔记,若有错误,望指出,谢谢!!