//
// main.m
// C5-多维数组,字符串数组
//
// Created by dllo on 15/10/11.
// Copyright (c) 2015年 dllo. All rights reserved.
//
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
// int a[3]= {4,5,6};
// printf("%d",1[a + 1]);
//数组a[],这种形式只是为了更好的让人理解,实际上在计算机中只是知道一个数组的首地址,再进行位移操作
// 定义一个二维数组
// int arr[第一维度][第二维度] = 初值 行话中不说几行几列,第一维度也可以表示列,并不确定
// int arr[2][3] = {1,2,3,4,5,6};
//只能第一维度不写,注意,系统会根据初值个数确定数组大小!!第二维度不可以不写
// int b[][3] = {1,2,3,4};
//访问二维数组数组中的元素
// int arr[][3] = {0};
// printf("%d\n",arr[1][1]);
//遍历二维数组
// for(int i = 0;i < 2;i++){
// for (int j = 0; j < 3; j++) {
// arr[i][j] = arc4random() % (70 - 30 + 1) + 30;
// printf("%d ",arr[i][j]);
// }
// }
// 一个10行20 列的二位数组,为每一个数组的元素附一个随机数,编程找出 与第一个元素相等的元素个数
// int a[10][20] = {0};
// int count = -1;
// for (int i = 0; i < 10; i++) {
// for (int j = 0; j < 20; j++) {
//遍历赋值
// a[i][j] = arc4random() % (70 - 20 + 1) + 20;
// printf("%d ", a[i][j]);
//
//若等于第一个元素,计数加1
//注意第一次比较的时候a[0][0] = a[0][0]成立,count成立,所以count初值为-1
// if(a[i][j] == a[0][0]){
// count++;
// }
//
// }
// printf("\n");
// }
//
//
// printf("%d", count);
//1将一个二维数组的行和列交换,储存到另外的一个数组中
// int a[2][3] = {1, 2, 3, 4, 5, 6};
// int b[3][2] = {0};
// for (int i = 0; i < 2; i++) {
// for (int j = 0; j < 3; j++) {
//交换
//2行3列交换后的数组为3行2列
// b[j][i] = a[i][j];
// }
// }
//输出打印交换后的数组
// for (int i = 0; i < 3; i++) {
// for (int j = 0; j < 2; j++) {
// printf("%d ", b[i][j]);
// }
// }
//2有一个3行4列的二维数组要求编程找出最大元素,并输出所在行列
//
// int a[3][4] = {0};
// int max = 0;
// int arr = 0;
// int b = 0;
//输出随机数组
// for (int i = 0; i < 3; i++) {
// for (int j = 0; j < 4; j++) {
// a[i][j] = arc4random() % (70 - 20 + 1) + 20;
// printf("%d ", a[i][j]);
// }
// printf("\n");
// }
//找到最大值
// for (int i = 0; i < 3; i++) {
// for (int j = 0; j < 4; j++) {
//
// if(a[i][j] > max){
// max = a[i][j];
// }
// }
// }
//输出最大值,和相等的最大值!!注意随机产生的数的最大值有可能相等
// for (int i = 0; i < 3; i++) {
// for (int j = 0; j < 4; j++) {
//
// if(max == a[i][j]){
// max = a[i][j];
// arr = i + 1;
// b = j + 1;
// printf("行:%d列:%d最大值:%d", arr, b, max);
// printf("\n");
//
// }
// }
//
//
//
// }
// int arr[2][3][4] = {0};
// for (int i = 0; i < 2; i++) {
// for (int j = 0; j < 3; j++) {
// for (int k= 0; k < 4; k++) {
// arr[i][j][k] =arc4random() % (70 - 12 + 1) + 12;
// printf("%d ", arr[i][j][k]);
// }
// printf("\n");
// }
// printf("\n");
//
// }
//字符串数组
//字符串数组也是二维数组,只不过每行都用'\0'结尾,而且不一定满所在行
// char str[3][7] = {"aaa", "bbbb", "cccccc"};
//打印一个字符串
// printf("%s\n", str[1]);
//打印一个元素
// printf("%c\n", str[1][0]);
//创建一个字符串数组,输出最长字符串的长度,,strlen(a)求得是王琼的长度,因为数组的首地址就是a[0]的首地址.他们的首地址是重合的
//
char a[3][20] = {"wangqiong", "lijinmingss", "yuhao"};
long len = 0;
long maxlen = 0;
for (int i = 0; i < 3; i++) {
for (int j = 0;a[i][j] != '\0'; j++) {
len++;//计数加1
}
//比较暂存的最大值
if (len > maxlen) {
maxlen = len;
len = 0;
}
printf("\n");
}
printf("%ld",maxlen);
// char a[3][20] = {"wangqiongjhgjhhj", "lijinming", "yuhao"};
// long len = 0;
// long maxlen = 0;
// for (int i = 0; i < 3; i++) {
// len = strlen(a[i]);
//
// //比较暂存的最大值
// if (len > maxlen) {
// maxlen = len;
//
// }
//}
// // 输出最长的字符串
// for (int i = 0; i < 3; i++) {
// if (strlen(a[i]) == maxlen) {
// printf("%s",a[i]);
// }
// }
// printf("%ld",maxlen);
// 上面的代码可以看成时strlen的具体实现
}
//创建一个字符串,对字符串的内容从大到小排序
// char a[3][20] = {"yuhao", "lijinming", "wangqiong"};
// for (int i = 0; i < 3 - 1; i++) {
// for (int j = 0; j < 3 - i - 1; j++){
//
// if(strcmp(a[j], a[j + 1]) < 0){
// // 交换
// // 注意b数组元素个数应该参考谁
// // 注意,数组不可以整体赋值,应该用strcpy代替
// char b[20] = {0};
// strcpy(b, a[j]);
// strcpy(a[j], a[j + 1]);
// strcpy(a[j + 1], b);
//
//
// }
//
// }
//
//
//}
// for (int i = 0; i < 3; i++){
//
// printf("%s ",a[i]);
//
//
// }
//}
//输入6个字符串,并对它们按从小到大的顺序排序后输出。
//
// char strings[][20] = {"wangziyu", "duhaoran", "haoyun", "niuzhiquan", "yangguo", "xiaolongnv", "linghuchog", "guojing", "xiaofeng", "guomeimei", "zhoubotong", "cuiyayun"};
// int size = sizeof(strings)/sizeof(strings[0]);
// unsigned long maxlenth = strlen(strings[0]);
// unsigned long minlenth = strlen(strings[0]);
// for (int i = 0; i < size; i++) {
// maxlenth = maxlenth > strlen(strings[i]) ? maxlenth : strlen(strings[i]);
// minlenth = minlenth < strlen(strings[i]) ? minlenth: strlen(strings[i]);
// printf("%s \n", strings[i]);
// }
//
//
// for (int i = 0; i < size; i++){
// //求最长的字符串 并输出其长度
// if (maxlenth == strlen(strings[i])) {
// printf("%s %lu\n", strings[i], maxlenth);
// }
// //求最短的字符串 并输出其长度
// if (minlenth == strlen(strings[i])) {
// printf("%s %lu\n", strings[i], minlenth);
// }
// }
// for (int i = 0; i < size-1; i++) {
// for (int j = 0; j < size - i - 1; j++) {
// //比较字符串的大小 如果前面的字符串大 则交换位置
// if (strcmp(strings[j], strings[j+1]) > 0) {
// char temp[20] = {0};
// strcpy(temp, strings[j]);
// strcpy(strings[j], strings[j+1]);
// strcpy(strings[j+1], temp);
// }
// }
// }
//
// for (int i = 0; i < size; i++){
// printf("%s\n", strings[i]);
// }
// 4、(**)随机生成一个三维数组,编程求深度的平均值,保存在一个二维数组中(相当于一个模仿从上面看)。
// float arr[3][4][5] = {0};
// float sum = 0;
// for (int i = 0; i < 3; i++) {
// for (int j = 0; j < 4; j++) {
// sum = 0;
// for (int k = 0; k < 5; k++) {
// arr[i][j][k] = arc4random()%99 + 1;
// printf("%6.2f ", arr[i][j][k]);
// //把深度的值累加
// sum += arr[i][j][k];
// }
// //保存深度平均值
// //arr[i][j][0] = sum/5;
// printf(" = %6.2f", sum/5);
// printf("\n");
// }
// printf("\n");
// }
// printf("深度平均值:\n");
// for (int i = 0; i < 3; i++) {
// for (int j = 0; j < 4; j++) {
// printf("%6.2f", arr[i][j][0]);
// }
// printf("\n");
// }
// 3、(****)找出一个二维数组中的“鞍点”,即该位置上的元素在该行中最大,在该列中最小(也可能没有“鞍点”),打印有关信息。(提示:注意特殊情况:没鞍点或多个鞍点)
// int arr[N][M] = {0};
// for (int i = 0; i < N; i++) {
// for (int j = 0; j < M; j++) {
// arr[i][j] = arc4random()%99 + 1;
// printf("%-2d ", arr[i][j]);
// }
// printf("\n");
// }
// BOOL flag = 1;
// int count = 0;
// for (int i = 0; i < N; i++) {
// for (int j = 0; j < M; j++) {
// //把数组当前的数和整行比较,如果不是最大值跳出当前循环,并把标记置为0
// for (int k = 0; k < M; k++) {
// if (arr[i][j] < arr[i][k]){
// flag = 0;
// break;
// }
// }
//
// if (flag) {
// //把数组当前的数和整列进行比较,如果不是最小的跳出当前循环,并把标记置为0
// for (int x = 0; x < N; x++) {
// if (arr[i][j] > arr[x][j]) {
// flag = 0;
// break;
// }
// }
// }
//
// //如果标记不为零,说明数组当前数据为行最大值,列最小值.是鞍点 打印出来
//
// flag = 1;
// }
// }
// if (count == 0) {
// printf("没有鞍点!!");
// }
//
// int a[3][5] = {0};
// for (int i = 0; i < 3 ; i++) {
// for (int j = 0; j < 5; j++) {
// a[i][j] = arc4random() % (99 - 1 + 1) + 1;
// printf("%-2d ",a[i][j]);
// }
// printf("\n");
// }
// BOOL flag = 1;
// int count = 0;
// for (int i = 0; i < 3; i++) {
// for (int j = 0; j < 5; j++) {
// //将数组当前值和整行数做比较,如果不是最大值就跳出循环,并把标记置为0
// for (int k = 1 ; k < 5; k++) {
// if (a[i][j] < a[i][k]) {
// flag = 0;
// break;
// }
// }
// if (flag) {
// //把数组当前的值和整列作比较,如果不是最小值就跳出循环,并把标记置为0
// for(int x = 1; x < 3; x++){
// if (a[i][j] > a[x][j]) {
// flag = 0;
// break;
// }
// }
// }
// //如果标记不为0 表明当前值为行最大值,列最小值,是鞍点,打印出来
// if (flag) {
// printf("a[%d][%d] = %d是鞍点 ",i,j,a[i][j]);
// count++;
// }
// flag = 1;
// }
//
// }
//
// if (count == 0) {
// printf("没有鞍点");
// }
//
//
// int a[4][5][6] = {0};
// int sum =0;
// int b = 0;
// int c[4][5] = {0};
//
// for (int i = 0; i < 4; i++) {
// for (int j = 0 ; j < 5; j++) {
// for (int k = 0; k < 6; k++) {
// a[i][j][k] = arc4random() % (90 - 20 + 1) +20;
// printf("%d",a[i][j][k]);
// sum += a[i][j][k];
//
// }
// b = sum / 6;
// c[i][j] =b;
// }
// }
// for (int i =0; i < 4; i++) {
// for (int j = 0; j < 5; j++) {
// printf("%d ", c[i][j]);
// }
// printf("\n");
// }
//
// 自己实现strcpy的功能.
/* 1、(**)有一个3行4列的二维数组,要求编程找出最大的元素,并输出所在的行和列。
int a[3][4] = {0};
int max = 0;
for (int i = 0; i < 3; i++) {
for(int j = 0; j < 4 ; j++){
a[i][j] = arc4random() % (50 - 20 + 1) + 20;
printf("%d ",a[i][j]);
if(a[i][j] > max){
max = a[i][j];
}
}
printf("\n");
}
for (int i = 0 ; i < 3 ; i++) {
for (int j = 0; j < 4; j++) {
if (a[i][j] == max) {
int b = i + 1;
int c = j + 1;
printf("最大值:%d所在行:%d所在列:%d\n",max,b,c);
}
}
}
2、(**)输入6个字符串,并对它们按从小到大的顺序排序后输出。
3、(****)找出一个二维数组中的“鞍点”,即该位置上的元素在该行中最大,在该列中最小(也可能没有“鞍点”),打印有关信息。(提示:注意特殊情况:没鞍点或多个鞍点)
4、(**)随机生成一个三维数组,编程求深度的平均值,保存在一个二维数组中(相当于一个模仿从上面看)。
float arr[3][4][5] = {0};
// float sum = 0;
// for (int i = 0; i < 3; i++) {
// for (int j = 0; j < 4; j++) {
// sum = 0;
// for (int k = 0; k < 5; k++) {
// arr[i][j][k] = arc4random()%99 + 1;
// printf("%6.2f ", arr[i][j][k]);
// //把深度的值累加
// sum += arr[i][j][k];
// }
// //保存深度平均值
// //arr[i][j][0] = sum/5;
// printf(" = %6.2f", sum/5);
// printf("\n");
// }
// printf("\n");
// }
// printf("深度平均值:\n");
// for (int i = 0; i < 3; i++) {
// for (int j = 0; j < 4; j++) {
// printf("%6.2f", arr[i][j][0]);
// }
// printf("\n");
// }
//
*/