//
// main.m
// LessonFive
//
// Created by lanou3g on 15/8/3.
// Copyright (c) 2015年 lanou.3g.com. All rights reserved.
//
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
//2分钟敲冒泡和冒泡优化
int a[5]={5,4,87,12,1};
int temp=0;
for (int i=0; i<5; i++) {
for (int j=0; j<5-i-1; j++) {
if (a[j]>a[j+1]) {
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
for (int i=0; i<5; i++) {
printf("%d\t",a[i]);
}
printf("\n");
int a1[5]={5,3,1,7,8};
BOOL flag=NO;
for (int i=0; i<5; i++) {
flag=NO;//一定要注意这里的赋值,对后面的影响很大。
for (int j=0; j<5-i-1; j++) {
if (a1[j]>a1[j+1]) {
temp=a1[j];
a1[j]=a1[j+1];
a1[j+1]=temp;
flag=YES;
}
}
if (flag==NO) {
printf("第%d趟就不用交换了.\n",i);
break;
}
}
for (int i=0; i<5; i++) {
printf("%d\t",a1[i]);
}
printf("\n");
//第五节正课正式开始
char charYuejie1[3]="abc";
//越界,'\0'没有地方存储
printf("字符串越界输出:%s\n",charYuejie1);
char charYuejie2[4]="abc";
printf("字符串常规输出:%s\n",charYuejie2);
char charArray[3]={'a','b','c'};
printf("字符数组用%%s输出:%s\n",charArray);
//%s是字符串的专用,其中'\0'是字符串的结束标志
//而字符数组末尾没有'\0'
for (int i=0; i<3; i++) {
printf("字符数组常规输出:%c\t",charArray[i]);
}
printf("\n");
//同学的早分享----选择排序
int chooseSort[4]={12,45,23,2};
int min=45,pos=0;
for (int i=0; i<4; i++) {//第一趟
for (int j=i+1; j<4; j++) {
if (chooseSort[i]>chooseSort[j]) {//把i对应的值和i之后的值进行比较
pos=j;//pos记录最小值的位置,用于后面交换
}
}
min=chooseSort[pos];
chooseSort[i]=min;
}
printf("排序后:\t");
for (int i=0; i<4; i++) {
printf("%d\t",chooseSort[i]);
}
printf("\n");
//二维数组的本质:就是数组的数组
//为了更好的理解二维数组,通常把二维数组写成行和列的排列形式。
//m 行 n 列 空间大小就是m*n
//m个一维数组 n代表一维数组中有n个元素 ----通常称为数学上的矩阵
//定义二维数组 : 类型修饰符 数组名[常量表达式1][常量表达式2] = {值1,值2...};
//其中,值1表示一维数组,00,01
//形式2 : {{},{},{}...}
//可以省略行数,列数不能省略.
//每一行或列不够补0并补齐。
//定义一个3行5列的数组,最好不要用下面的定义方式,使用形式2
int doubleArray[3][5]={23,12,34,22,11,45,22,11,23,25,13,9};
for (int i=0; i<3; i++) {
for (int j=0; j<5; j++) {
printf("%d\t",doubleArray[i][j]);
}
printf("\n");
}
//
char classrates[3][5]={{'f','g','h'},{'i','j','k'},{'l'}};
for(int i=0;i<3;i++){
for (int j=0; j<5; j++) {
printf("%c\t",classrates[i][j]);
}
printf("\n");
}
//省略行数,这是不可取的,不要用
int a11[][3]={1,2,3};
//访问二维数组元素 :
//1、必须指定两个下标;
//2、不要越界.
int arr[2][3]={1,2,3,4,5,6};
printf("%d\n",arr[0][2]);
arr[1][1]=12;
printf("%d\n",arr[1][1]);
for (int i=0; i<2; i++) {
for (int j=0; j<3; j++) {
printf("%d\t",arr[i][j]);
}
printf("\n");
}
printf("\n");
//将一个二维数组的行列交换
int aChange0[2][3]={7,6,3,2,8,5};
int aChange[3][2]={0};
for (int i=0; i<3; i++) {
for (int j=0; j<2; j++) {
aChange[i][j]=aChange0[j][i];
printf("%d\t",aChange[i][j]);
}
printf("\n");
}
//
int afindNumber[3][4]={0};
int max=0;
for (int i=0; i<3; i++) {
for (int j=0; j<4; j++) {
afindNumber[i][j]=arc4random()%(20-5+1)+5;
printf("%d\t",afindNumber[i][j]);
}
printf("\n");
}
for (int i=0; i<3; i++) {
for (int j=0; j<4; j++) {
if (afindNumber[i][j]>max) {
max=afindNumber[i][j];
}
}
}
printf("最大值:%d\t其位置是\t",max);
for (int i=0; i<3; i++) {
for (int j=0; j<4; j++) {
if (max==afindNumber[i][j]) {
printf("第%d行第%d列\t",i,j);
}
}
}
printf("\n");
//练习,定义一个3行4列的数组,找出最小值,并打印,并打印其位置。
int minOfArray=20;
for (int i=0; i<3; i++) {
for (int j=0; j<4; j++) {
if (afindNumber[i][j]<minOfArray ) {
minOfArray=afindNumber[i][j];
}
}
}
printf("最小值:%d,其位置\t",minOfArray);
for (int i=0; i<3; i++) {
for (int j=0; j<4; j++) {
if (minOfArray==afindNumber[i][j]) {
printf("第%d行第%d列\t",i,j);
}
}
}
//字符串数组 : 数组元素是 字符串 ,是一个二维数组。因为字符串本身也是一维数组,
//定义一个字符串数组
char doubleChar[5][10]={"hello,","how","are","you","?"};
//访问成员
printf("用%%s访问第一维数组也即是单个的字符串:\t");
for (int i=0; i<5; i++) {
printf("%s ",doubleChar[i]);//%s访问字符串
}
//访问某一组的字符串 :数组名[第一维下标]
printf("\n");
//取单个字符 :数组名[第一维下标][第二维下标]
printf("用%%c访问单个字符:%c\n",doubleChar[0][2]);
for (int i=0; i<5; i++) {
for (int j=0; j<10; j++) {
printf("%c ",doubleChar[i][j]);
}
}
printf("\n");
//定义一个字符串数组,元素为前后左右的元素,将每个名字的首字母改为大写
char names_ofMyClassmates[4][20]={"zhongbohan","xingjiahe","wangjianye"};
printf("改写前:\t");
for (int i=0; i<3; i++) {
printf("%s\t",names_ofMyClassmates[i]);
}
printf("\n");
//为什么不能在这写i<4,是因为字符串后面有一个'\0',最后会输出一个0-32的值所对应的字符
for(int i=0;i<3;i++){
names_ofMyClassmates[i][0]-=32;
}
printf("改写后:\t");
for (int i=0; i<4; i++) {
printf("%s\t",names_ofMyClassmates[i]);
}
printf("\n");
//长度最长的
int length=10;
int length_names[3]={0};
for (int i=0; i<3; i++) {
length_names[i]=(int)strlen(names_ofMyClassmates[i]);
if (length<length_names) {
length=length_names[i];
printf("最长的名字:%s\n",names_ofMyClassmates[i]);
break;
}
}
int temp_namesLength=0;
for (int i=0; i<3; i++) {
length_names[i]=(int)strlen(names_ofMyClassmates[i]);
}
for (int i=0; i<3; i++) {
for (int j=0; j<3-i-1; j++) {
if (length_names[j]>length_names[j+1]) {
temp_namesLength=length_names[j];
length_names[j]=length_names[j+1];
length_names[j+1]=temp_namesLength;
}
}
}
printf("名字长度排序:\t");
for (int i=0; i<3; i++) {
for(int j=0;j<3;j++){
if ((int)strlen(names_ofMyClassmates[j])==length_names[i]) {
printf("%s\t",names_ofMyClassmates[j]);
}
}
//当出现相同长度的字符串时,避免重复输出一样的字符串
if (length_names[i]==length_names[i+1]) {
break;
}
}
printf("\n");
char names_temp[1][1]={0};
for (int i=0; i<3; i++) {
if (strcmp(names_ofMyClassmates[i], names_ofMyClassmates[i+1])>0) {
if (strcmp(names_ofMyClassmates[i], names_ofMyClassmates[i+2])) {
strcpy(names_temp, names_ofMyClassmates[i]);
}else{
strcpy(names_temp, names_ofMyClassmates[i+2]);
}
}else{
if (strcpy(names_ofMyClassmates[i+1], names_ofMyClassmates[i+2])) {
strcpy(names_temp, names_ofMyClassmates[i+1]);
}else{
strcpy(names_temp, names_ofMyClassmates[i+2]);
}
}
}
for (int i=0; i<3; i++) {
printf("%s\t",names_ofMyClassmates[i]);
}
printf("ASCII码最大的名字:%s\n",names_temp);
printf("用冒泡比较字符串大小:\t");
for (int i=0; i<3; i++) {
for (int j=0;j<3-i-1 ;j++) {
if (strcmp(names_ofMyClassmates[j], names_ofMyClassmates[j+1])>0) {
strcpy(names_temp, names_ofMyClassmates[j]);
strcpy(names_ofMyClassmates[j], names_ofMyClassmates[j+1]);
strcpy(names_ofMyClassmates[j+1], names_temp);
}
}
}
for (int i=0; i<3; i++) {
printf("%s\t",names_ofMyClassmates[i]);
}
printf("\n");
//scanf("%s",namesAroud); 以空格或者回车结束读取。空格或回车会遗留在缓冲区中。【不能直接输入空格】
//gets(namesAroud); 从标准输入设备读取字符串----缺点:不限制读取长度
char NamesAround[3][20]={0};
printf("请输入你周边人名字:\n");
for (int i=0; i<3; i++) {
//gets读取直接从键盘buffer中读取,不管什么样形式的输入
// scanf("%s",&NamesAround[i]);
//输入名字的时候,姓和名分开,再输入中需要读取到空格用"%[^\n]",感觉好高大上
scanf("%[^\n]",NamesAround[i]);
//输入 :
//z bh 回车
//w jy 回车
//x jh 回车
//scanf("%[^\n]\n",NamesAround[i]);这样写的话会让你输入四遍,我也不知道为什么。
getchar();
// gets(NamesAround[i]);
}
printf("输出姓和名分开的名字:\n");
for (int i=0; i<3; i++) {
printf("%s\n",NamesAround[i]);
}
// printf("输入三个字符,并且");
// char namesAroud[3]={0};
// for (int i=0; i<3; i++) {
// scanf("%[^\n]",namesAroud);
// getchar();
// }
// for (int i=0; i<3; i++) {
// printf("%c\t",namesAroud[i]);
// }
//定义一个字符串数组,里面有6个字符串,每个字符串长度为20,从键盘输入
char stringArray[6][20]={0};
for (int i=0; i<6; i++) {
//数组名和指针变量名 遇到scanf 不需要&这个,为什么,因为数组名和指针变量名本身就是地址
scanf("%[^\n]",stringArray[i]);
getchar();
}
for (int i=0; i<6; i++) {
printf("%s\t",stringArray[i]);
}
printf("\n");
//多维数组
//定义一个三维数组 类型修饰符 数组名[层][行][列] ;
int aSanWei[2][3][4]={0};
printf("输入几层几行几列的三维空间:\n");
for (int i=0; i<2; i++) {
for (int j=0; j<3; j++) {
for (int k=0; k<4; k++) {
printf("k\t");
}
printf("\n");
}
printf("\n");
}
//访问多维数组 数组名[层的下标数][行的下标数][列的下标数];
//多维数组访问元素个数 :各个维数个数的积
//占用内存 :元素个数*单个元素所占空间
//sizeof()返回一个对象或者类型所占的内存字节数
//sizeof(对象) sizeof(类型)
printf("%lu\n",sizeof(aSanWei)/sizeof(int));
//字符数组是一维数组 --->字符串
//字符串数组是二维数组
//有scanf控制输入时,后面最好跟一个getchar(),以防万一
return 0;
}
// main.m
// LessonFive
//
// Created by lanou3g on 15/8/3.
// Copyright (c) 2015年 lanou.3g.com. All rights reserved.
//
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
//2分钟敲冒泡和冒泡优化
int a[5]={5,4,87,12,1};
int temp=0;
for (int i=0; i<5; i++) {
for (int j=0; j<5-i-1; j++) {
if (a[j]>a[j+1]) {
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
for (int i=0; i<5; i++) {
printf("%d\t",a[i]);
}
printf("\n");
int a1[5]={5,3,1,7,8};
BOOL flag=NO;
for (int i=0; i<5; i++) {
flag=NO;//一定要注意这里的赋值,对后面的影响很大。
for (int j=0; j<5-i-1; j++) {
if (a1[j]>a1[j+1]) {
temp=a1[j];
a1[j]=a1[j+1];
a1[j+1]=temp;
flag=YES;
}
}
if (flag==NO) {
printf("第%d趟就不用交换了.\n",i);
break;
}
}
for (int i=0; i<5; i++) {
printf("%d\t",a1[i]);
}
printf("\n");
//第五节正课正式开始
char charYuejie1[3]="abc";
//越界,'\0'没有地方存储
printf("字符串越界输出:%s\n",charYuejie1);
char charYuejie2[4]="abc";
printf("字符串常规输出:%s\n",charYuejie2);
char charArray[3]={'a','b','c'};
printf("字符数组用%%s输出:%s\n",charArray);
//%s是字符串的专用,其中'\0'是字符串的结束标志
//而字符数组末尾没有'\0'
for (int i=0; i<3; i++) {
printf("字符数组常规输出:%c\t",charArray[i]);
}
printf("\n");
//同学的早分享----选择排序
int chooseSort[4]={12,45,23,2};
int min=45,pos=0;
for (int i=0; i<4; i++) {//第一趟
for (int j=i+1; j<4; j++) {
if (chooseSort[i]>chooseSort[j]) {//把i对应的值和i之后的值进行比较
pos=j;//pos记录最小值的位置,用于后面交换
}
}
min=chooseSort[pos];
chooseSort[i]=min;
}
printf("排序后:\t");
for (int i=0; i<4; i++) {
printf("%d\t",chooseSort[i]);
}
printf("\n");
//二维数组的本质:就是数组的数组
//为了更好的理解二维数组,通常把二维数组写成行和列的排列形式。
//m 行 n 列 空间大小就是m*n
//m个一维数组 n代表一维数组中有n个元素 ----通常称为数学上的矩阵
//定义二维数组 : 类型修饰符 数组名[常量表达式1][常量表达式2] = {值1,值2...};
//其中,值1表示一维数组,00,01
//形式2 : {{},{},{}...}
//可以省略行数,列数不能省略.
//每一行或列不够补0并补齐。
//定义一个3行5列的数组,最好不要用下面的定义方式,使用形式2
int doubleArray[3][5]={23,12,34,22,11,45,22,11,23,25,13,9};
for (int i=0; i<3; i++) {
for (int j=0; j<5; j++) {
printf("%d\t",doubleArray[i][j]);
}
printf("\n");
}
//
char classrates[3][5]={{'f','g','h'},{'i','j','k'},{'l'}};
for(int i=0;i<3;i++){
for (int j=0; j<5; j++) {
printf("%c\t",classrates[i][j]);
}
printf("\n");
}
//省略行数,这是不可取的,不要用
int a11[][3]={1,2,3};
//访问二维数组元素 :
//1、必须指定两个下标;
//2、不要越界.
int arr[2][3]={1,2,3,4,5,6};
printf("%d\n",arr[0][2]);
arr[1][1]=12;
printf("%d\n",arr[1][1]);
for (int i=0; i<2; i++) {
for (int j=0; j<3; j++) {
printf("%d\t",arr[i][j]);
}
printf("\n");
}
printf("\n");
//将一个二维数组的行列交换
int aChange0[2][3]={7,6,3,2,8,5};
int aChange[3][2]={0};
for (int i=0; i<3; i++) {
for (int j=0; j<2; j++) {
aChange[i][j]=aChange0[j][i];
printf("%d\t",aChange[i][j]);
}
printf("\n");
}
//
int afindNumber[3][4]={0};
int max=0;
for (int i=0; i<3; i++) {
for (int j=0; j<4; j++) {
afindNumber[i][j]=arc4random()%(20-5+1)+5;
printf("%d\t",afindNumber[i][j]);
}
printf("\n");
}
for (int i=0; i<3; i++) {
for (int j=0; j<4; j++) {
if (afindNumber[i][j]>max) {
max=afindNumber[i][j];
}
}
}
printf("最大值:%d\t其位置是\t",max);
for (int i=0; i<3; i++) {
for (int j=0; j<4; j++) {
if (max==afindNumber[i][j]) {
printf("第%d行第%d列\t",i,j);
}
}
}
printf("\n");
//练习,定义一个3行4列的数组,找出最小值,并打印,并打印其位置。
int minOfArray=20;
for (int i=0; i<3; i++) {
for (int j=0; j<4; j++) {
if (afindNumber[i][j]<minOfArray ) {
minOfArray=afindNumber[i][j];
}
}
}
printf("最小值:%d,其位置\t",minOfArray);
for (int i=0; i<3; i++) {
for (int j=0; j<4; j++) {
if (minOfArray==afindNumber[i][j]) {
printf("第%d行第%d列\t",i,j);
}
}
}
//字符串数组 : 数组元素是 字符串 ,是一个二维数组。因为字符串本身也是一维数组,
//定义一个字符串数组
char doubleChar[5][10]={"hello,","how","are","you","?"};
//访问成员
printf("用%%s访问第一维数组也即是单个的字符串:\t");
for (int i=0; i<5; i++) {
printf("%s ",doubleChar[i]);//%s访问字符串
}
//访问某一组的字符串 :数组名[第一维下标]
printf("\n");
//取单个字符 :数组名[第一维下标][第二维下标]
printf("用%%c访问单个字符:%c\n",doubleChar[0][2]);
for (int i=0; i<5; i++) {
for (int j=0; j<10; j++) {
printf("%c ",doubleChar[i][j]);
}
}
printf("\n");
//定义一个字符串数组,元素为前后左右的元素,将每个名字的首字母改为大写
char names_ofMyClassmates[4][20]={"zhongbohan","xingjiahe","wangjianye"};
printf("改写前:\t");
for (int i=0; i<3; i++) {
printf("%s\t",names_ofMyClassmates[i]);
}
printf("\n");
//为什么不能在这写i<4,是因为字符串后面有一个'\0',最后会输出一个0-32的值所对应的字符
for(int i=0;i<3;i++){
names_ofMyClassmates[i][0]-=32;
}
printf("改写后:\t");
for (int i=0; i<4; i++) {
printf("%s\t",names_ofMyClassmates[i]);
}
printf("\n");
//长度最长的
int length=10;
int length_names[3]={0};
for (int i=0; i<3; i++) {
length_names[i]=(int)strlen(names_ofMyClassmates[i]);
if (length<length_names) {
length=length_names[i];
printf("最长的名字:%s\n",names_ofMyClassmates[i]);
break;
}
}
int temp_namesLength=0;
for (int i=0; i<3; i++) {
length_names[i]=(int)strlen(names_ofMyClassmates[i]);
}
for (int i=0; i<3; i++) {
for (int j=0; j<3-i-1; j++) {
if (length_names[j]>length_names[j+1]) {
temp_namesLength=length_names[j];
length_names[j]=length_names[j+1];
length_names[j+1]=temp_namesLength;
}
}
}
printf("名字长度排序:\t");
for (int i=0; i<3; i++) {
for(int j=0;j<3;j++){
if ((int)strlen(names_ofMyClassmates[j])==length_names[i]) {
printf("%s\t",names_ofMyClassmates[j]);
}
}
//当出现相同长度的字符串时,避免重复输出一样的字符串
if (length_names[i]==length_names[i+1]) {
break;
}
}
printf("\n");
char names_temp[1][1]={0};
for (int i=0; i<3; i++) {
if (strcmp(names_ofMyClassmates[i], names_ofMyClassmates[i+1])>0) {
if (strcmp(names_ofMyClassmates[i], names_ofMyClassmates[i+2])) {
strcpy(names_temp, names_ofMyClassmates[i]);
}else{
strcpy(names_temp, names_ofMyClassmates[i+2]);
}
}else{
if (strcpy(names_ofMyClassmates[i+1], names_ofMyClassmates[i+2])) {
strcpy(names_temp, names_ofMyClassmates[i+1]);
}else{
strcpy(names_temp, names_ofMyClassmates[i+2]);
}
}
}
for (int i=0; i<3; i++) {
printf("%s\t",names_ofMyClassmates[i]);
}
printf("ASCII码最大的名字:%s\n",names_temp);
printf("用冒泡比较字符串大小:\t");
for (int i=0; i<3; i++) {
for (int j=0;j<3-i-1 ;j++) {
if (strcmp(names_ofMyClassmates[j], names_ofMyClassmates[j+1])>0) {
strcpy(names_temp, names_ofMyClassmates[j]);
strcpy(names_ofMyClassmates[j], names_ofMyClassmates[j+1]);
strcpy(names_ofMyClassmates[j+1], names_temp);
}
}
}
for (int i=0; i<3; i++) {
printf("%s\t",names_ofMyClassmates[i]);
}
printf("\n");
//scanf("%s",namesAroud); 以空格或者回车结束读取。空格或回车会遗留在缓冲区中。【不能直接输入空格】
//gets(namesAroud); 从标准输入设备读取字符串----缺点:不限制读取长度
char NamesAround[3][20]={0};
printf("请输入你周边人名字:\n");
for (int i=0; i<3; i++) {
//gets读取直接从键盘buffer中读取,不管什么样形式的输入
// scanf("%s",&NamesAround[i]);
//输入名字的时候,姓和名分开,再输入中需要读取到空格用"%[^\n]",感觉好高大上
scanf("%[^\n]",NamesAround[i]);
//输入 :
//z bh 回车
//w jy 回车
//x jh 回车
//scanf("%[^\n]\n",NamesAround[i]);这样写的话会让你输入四遍,我也不知道为什么。
getchar();
// gets(NamesAround[i]);
}
printf("输出姓和名分开的名字:\n");
for (int i=0; i<3; i++) {
printf("%s\n",NamesAround[i]);
}
// printf("输入三个字符,并且");
// char namesAroud[3]={0};
// for (int i=0; i<3; i++) {
// scanf("%[^\n]",namesAroud);
// getchar();
// }
// for (int i=0; i<3; i++) {
// printf("%c\t",namesAroud[i]);
// }
//定义一个字符串数组,里面有6个字符串,每个字符串长度为20,从键盘输入
char stringArray[6][20]={0};
for (int i=0; i<6; i++) {
//数组名和指针变量名 遇到scanf 不需要&这个,为什么,因为数组名和指针变量名本身就是地址
scanf("%[^\n]",stringArray[i]);
getchar();
}
for (int i=0; i<6; i++) {
printf("%s\t",stringArray[i]);
}
printf("\n");
//多维数组
//定义一个三维数组 类型修饰符 数组名[层][行][列] ;
int aSanWei[2][3][4]={0};
printf("输入几层几行几列的三维空间:\n");
for (int i=0; i<2; i++) {
for (int j=0; j<3; j++) {
for (int k=0; k<4; k++) {
printf("k\t");
}
printf("\n");
}
printf("\n");
}
//访问多维数组 数组名[层的下标数][行的下标数][列的下标数];
//多维数组访问元素个数 :各个维数个数的积
//占用内存 :元素个数*单个元素所占空间
//sizeof()返回一个对象或者类型所占的内存字节数
//sizeof(对象) sizeof(类型)
printf("%lu\n",sizeof(aSanWei)/sizeof(int));
//字符数组是一维数组 --->字符串
//字符串数组是二维数组
//有scanf控制输入时,后面最好跟一个getchar(),以防万一
return 0;
}