//
// main.c
// C_04
//
// Created by ibokan on 15/11/30.
// Copyright © 2015年 aishuo. All rights reserved.
//
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
void changeScalar(int x);
void changeArray(int arr[5]);
int main(int argc, const char * argv[]) {
/*
C语言的数组
1.数组的概念
2.访问数组
3.操作数组
4.字符数组和字符串数组
5.数组作为函数参数
6.二维数组
7.结构体的定义及使用
*/
/*
数组的概念
数组是一个集合,他在计算机内存空间中是一串连续的地址空间,是可以存储多个同类型的变量
数组是一个存储多个 同类型 变量连续的集合
*/
/*
数组的定义
数组的类型 数组名[长度]={元素1,元素2,元素3,....};
*/
int array1[4]={1,4,5,7};
int array2[]={1,5};
int array3[10]={1,3,6,7};
float array4[]={3.9,45};
float array5[]={3.4,4,5};
//字符数组
char strp[]={'b','o','k','a','n'};
//字符串数组
char str1[]="bokan";
/*访问数组的元素,下标访问
在C语言中,下标是从0开始的,因为数组的元素是顺序存储,所有后面的元素下标依次累加一
,数组最后一个元素的下标为数组个数减一。
*/
int element=array1[0];
printf("element=%d\n",element);
//求数组元素的个数 sizeof
int count=sizeof(array1)/sizeof(int);
printf("count=%d\n",count);
for (int i=0; i<count; i++)
{
printf("array1[%d]=%d\n",i,array1[i]);
}
//操作数组
int array[]={1,5,6,8,9,10};
//求数组里面元素的和
int sum2=0;
for (int i=0;i<count; i++) {
sum2+=array1[i];
}
printf("sum2=%d\n",sum2);
int tmp;
for (int i=0; i<count/2; i++)
{
tmp=array1[i];
array1[i]=array1[count-1-i];
array1[count-1-i]=tmp;
}
for (int i=0; i<count; i++)
{
printf("array1[%d]=%d\n",i,array1[i]);
}
/*
数组定义必须要有大小
数组只能存放同类型的变量
数组的元素是用下标访问,而且下标从0开始
数组的长度为 sizeof(数组变量名)/sizeof(数组类型)
*/
/*
函数产生20个在【1,100】的数,而且此20个数不相同,存放到一个数组中,求和,最大值,求最小值,求平均值。
随机数:
arc4random()
#include <stdlib.h>
*/
printf("\n==============================\n");
int num[20],max,min;
float sum=0.0;
for (int i=0; i<20; )
{
int x=0;
num[i]=arc4random()%100+1;
x=i;
if(i>0)
{
for (int j=0; j<=x-1; j++)
{
if(num[j]==num[i])
{
i--;
break;
}
if(num[j]!=num[i] && j==x-1)
{
i++;
}
}
}
else
{
i++;
}
}
min=num[0];
max=num[0];
for (int i=0; i<20; i++) {
printf("%d ",num[i]);
if(max<num[i])
{
max=num[i];
}
if(min>num[i])
{
min=num[i];
}
sum+=num[i];
}
printf("\n");
//求和,最大值,求最小值,求平均值
printf("最大值:%d 最小值:%d 平均值:%f\n",max,min,sum/(sizeof(num)/sizeof(int)));
char c1[]={'i','b','k','a','n'};
char c2[]={'w','i','s','d','o','m'};
/*
字符数组
如果花括号提供的字符个数大于数组长度,按语法错误处理
如果小于数组长度,则只将这些字符数组中前面那些元素算上,其余的自动定位空字符‘\0’;
*/
//字符数组初始化的另一种方式==即可以用字符串常量来初始化字符数组
char newC1[]="ibokan";
/*
什么是字符串?
字符串是一组字符的组合,可以用来描述文本信息。但是,在C语言中,无法将一个字符串作为一个整体存储到一个变量
中。所有将字符串拆分为多个字符。然后存储到一个字符数组中。
注意:
1.在C语言中,使用双引号引起来的字符序列为字符串。字符串也为字符常量。在存储在付出的时候。结尾加上
一个末端字符'\0'作为结束标志。
2.上述这种字符数组的整体赋值只能在字符数组。初始化时使用 ,不能用字符数组的赋值,字符串数组的赋值只能
对其元素--赋值。
char a[];
a="ii";
上面这个是错误的
*/
char st1[13]="Hello world!";
char st2[13]={'H','e','l','l','o',' ','w','o','r','l','d','!'};
//st1和st2是等价的
//注意:数组名就是我们的数组元素的地址,所以在scanf()函数中,只需要用数组名即可
int i;
scanf("%d",&i);
char st3[10];
// scanf("%s",st3);
// printf("%s\n",st3);
//上面这个先输入空格不显示
gets(st3);
puts(st3);
//输入是在前面输入空格,空格显示
/*
字符串的一些函数,包含#include<string.h>
strcpy(str1,str2);//复制
strcat(str1,str2);//饼接
strlen(str1);
*/
char st5[]="ibokan";
char st6[]="wisdom";
strcpy(st5,st6);//st5的长度要比st6要大不然在复制过程中覆盖到其他存储区域
puts(st5);
strcat(st5, st6);//st6已经复制给st5
puts(st5);
//返回的是无符号整形,所以需要强制转换
int length=(int)strlen(st5);//不算上末端字符'\0'
// count=sizeof(st5)/sizeof(char);
//数组作为函数参数与基本数据类型作为函数参数的区别
//基本数据类型作为函数参数时
int x=10;
printf("调用函数前x的值为 %d\n",x);
changeScalar(x);
printf("调用函数后x的值是 %d\n",x);
//数组作为函数参数
int myArray[]={1,2,3,4,5};
printf("调用函数之前myArray 数组中各个元素的值为:\n");
int const1=sizeof(myArray)/sizeof(int);
for (int i=0; i<const1; i++)
{
printf("myArray[%d]=%d\n",i,myArray[i]);
}
//函数的调用
changeArray(myArray);
for (int i=0; i<const1; i++)
{
printf("myArray[%d]=%d\n",i,myArray[i]);
}
/*
注意:
C语言中将数组作为参数进行数据传递,无论数据量大小,不将数组进行复制,而是将该数组本身传入函数内部。而函数内部所操作的数据就是函数外部所定义的那个数组。
*/
return 0;
}
void changeScalar(int x)
{
x=1000;
}
void changArray(int arr[5])
{
for (int i=0; i<5; i++)
{
arr[i]+=10;
}
}
练习:
/*
函数产生20个在【1,100】的数,而且此20个数不相同,存放到一个数组中,求和,最大值,求最小值,求平均值。
随机数:
arc4random()
#include <stdlib.h>
*/
代码:
#include <stdio.h>
#include <stdlib.h>
void main()
{
printf("\n==============================\n");
int num[20],max,min;
float sum=0.0;
for (int i=0; i<20; )
{
int x=0;
num[i]=arc4random()%100+1;
x=i;
if(i>0)
{
for (int j=0; j<=x-1; j++)
{
if(num[j]==num[i])
{
i--;
break;
}
if(num[j]!=num[i] && j==x-1)
{
i++;
}
}
}
else
{
i++;
}
}
min=num[0];
max=num[0];
for (int i=0; i<20; i++) {
printf("%d ",num[i]);
if(max<num[i])
{
max=num[i];
}
if(min>num[i])
{
min=num[i];
}
sum+=num[i];
}
printf("\n");
//求和,最大值,求最小值,求平均值
printf("最大值:%d 最小值:%d 平均值:%f\n",max,min,sum/(sizeof(num)/sizeof(int)));
}
二维组:
/*
二维数组定义
数据类型 数组名[][] ={{},{},......}
*/
int arr1[][3]={1,4,5,1,5,7};
//等价于
//int arr1[][3]={{1,4,5},{2,5,7}};
int arr2[][3]={1};
//等价于 int arr2[][3]={{1,0,0}};
for (int i=0; i<2; i++)
{
for (int j=0; j<3; j++)
{
int r=arr1[i][j];
printf("%d ",r);
}
}
char R[][2]={{'s','s'},{'x','x'}};
//对于二维数组列是一定要写的