//定义一个 3 行 3 列的二维数组, 本质上定义了一个包含3个一维数组,并且每个一维数组包含三个元素
// int a[3][3] = {
// 1, 2, 3,
// 4, 5, 6,
// 7, 8, 9};
// for (int i = 0; i < 3; i++) { // 外层循环 控制行数(对应二维数组中的一个一维数组),遍历除对应的一维数组
// for (int j = 0; j < 3; j++) { //内层循环 控制列数,遍历出一维数组中的每个元素
// printf("%d ", a[i][j]);
// }
// printf("
");
// }
// int a[3][4] = {
// 29, 18, 20, 25,
// 29, 29, 17, 14,
// 24, 23, 17, 18};
//
// int sum = 0;
// //1. 为二维数组中赋值
// for (int i = 0; i < 3; i++) {
// for (int j = 0; j < 4; j++) {
// a[i][j] = arc4random() % (30 - 10 + 1) + 10;
// printf("%d ", a[i][j]);
// }
// printf("
");
//
// }
// //2. 求和,平均值
// for (int i = 0; i < 3; i++) {
// for (int j = 0; j < 4; j++) {
// sum += a[i][j];
// }
// }
// printf("和☺ = %d, 平均值 = %.2f
", sum, sum * 1.0 / 12);
//
// //求二维数组中, 所有元素的最大值, 以及最大值的位置,行和列标
// int max = 0;
// int maxRow = 0;
// int maxLine = 0;
// int r[5] = {0}; //假如,有5个相同的最大值
// int l[5] ={0};
// int m = 1, n = 1; // r[0],给了遇到的第一个最大值
// for (int i = 0; i < 3; i++) {
// for (int j = 0; j < 4; j++) {
// if(a[i][j] > max)
// {
// max = a[i][j];
// maxRow = i;
// maxLine = j;
// r[0] = maxRow + 1; //加1, 是为了打印的时候, 好做不等于0的判断, 让所有没有存数据的数, 不打印
// l[0] = maxLine + 1;
// }else if (a[i][j] == max)
// {
//
// r[m++] = i + 1;
// l[n++] = j + 1;
//
// }
// }
// }
// for (int i = 0; i < 5; i++) {
// if(r[i] != 0 && l[i] != 0)
// printf("最大值%d个: %d, 行标: %d, 列标: %d
",i + 1, max, r[i] - 1, l[i] - 1);//减1, 对应上面的加1
// }
//
// //求所有最大值,还有另一种方法, 先求出最大值, 然后拿最大值, 与二维数组中的每一个去匹配, 匹配到了,打印位置, 即可
// for (int i = 0; i < 3; i++) {
// for (int j = 0; j < 4; j++) {
// if(a[i][j] == max)
// {
// printf("共%d个: %d, 行标: %d, 列标: %d
",i + 1, max, i, j);
//
// }
// }
// }
//////////////技能拓展////////////////
// 0.将一个二维数组的行和列交换,存储到另外一个数组中去。
// int a[3][3] = {0};
// int b[3][3] = {0};
// //给数组a赋值
// for (int i = 0; i < 3; i++) {
// for (int j = 0; j < 3; j++) {
// a[i][j] = arc4random() % (50 - 20 + 1)+ 20;
// printf("%d ", a[i][j]);
// b[j][i] = a[i][j];
// }
// printf("
");
// }
// printf("行列交换后的数组
");
// for (int i = 0; i < 3; i++) {
// for (int j = 0 ; j < 3; j++) {
// printf("%d ", b[i][j]);
// }
// printf("
");
// }
// 1.将两个排好序的数组,合并到另外一个数组中,并且合并之后的数组也是有序的。
//Method one: 先将两个数组中的元素,放到第三个数组中,在对第三个数组进行升序排序(本题不使用)
//Method two: 归并排序 , 将两个数组中的元素,放入第三个数组中是, 已经保证第三个数组是一个有序的序列(本题使用)
// int a[5] = {1, 2, 3, 8, 10};
// int b[5] = {4, 5, 7, 9, 12};
// int c[10] = {0};
//
// //随机数组, 在进行冒泡排序
// /* 以下内容, 是随机生成两个数组, 进行冒泡排序,
// 为了方便, 直接初始化的时候, 就写好两个有序的数组
// for (int i = 0; i < 5; i++) {
// a[i] = arc4random() % (50 - 20 + 1) + 20;
// b[i] = arc4random() % (50 - 20 + 1) + 20;
// printf("%d ", a[i]); //打印原始a数组
// }
// printf("
");
// for (int i = 0; i < 5; i++) { //打印原始b数组
// printf("%d ", b[i]);
// }
// for (int i = 0; i < 5 - 1; i++) { //将a和b排序
// for (int j = 0; j < 5 - 1 -i;j++) {
// if (a[j] > a[j + 1]) { //将a数组升序排序
// int temp = a[j];
// a[j] = a[j + 1];
// a[j + 1] = temp;
// }
// if (b[j] > b[j + 1]) { //将b数组升序排序
// int temp = b[j];
// b[j] = b[j + 1];
// b[j + 1] = temp;
// }
// }
// }
// printf("
排序后的a和b数组:
");
// for (int i = 0; i < 5; i++) { //排序后的a数组
// printf("%d ", a[i]);
// }
// printf("
");
// for (int i = 0; i < 5; i++) {
// printf("%d ", b[i]);
// }
// */
//
// printf("
a和b组合成的c数组:
");
// int k = 0, i = 0, j = 0;
// while (i < 5 && j < 5) {
// if(a[i] < b[j]) //将小的数放到c中
// c[k++] = a[i++];
// else
// c[k++] = b[j++];
// }
//
// //如果其中一个数组元素全部放到c数组里, 我们只需将两一个数组的剩下的元素,不做比较, 直接放到c里面
// while (i < 5) {
// c[k++] = a[i++];
// }
// while (j < 5){
// c[k++] = b[j++];
// }
//
// for (int i = 0; i < 10; i++) {
// printf("%d ", c[i]);
// }
// //2.耶稣有13个门徒,其中有一个就是出卖耶稣的叛徒,请用排除法找出这位叛徒:13人围坐一圈,从第一个开始报号:1,2,3,1,2,3...。凡是报到“3”就退出圈子,最后留在圈子内的人就是出卖耶稣的叛徒。请找出它原来的序号。 提示:使用数组中13个元素来表示13个人.
// int man[13] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
// int call = 0;
// int manCount = 13; //人数初始 13人
// for (int i = 0; manCount > 1;i++) { //人数大于1, 才会继续报号
// if(i == 13)i = 0; //13人围一圈, 所以当i等于 13 的时候, 需要从 0 开始
// if(man[i] != 0) call++;
// if(call == 3)
// {
// man[i] = 0; //喊到 3 的人, 将他对应的数设置为 0
// call = 0; //将喊数,重置为0
// manCount--; //kill一个人
// }
// }
//
// /////while循环
// // int i = 0; //记录当前报数人的位置
// // while (manCount > 1) { //人数大于1, 才会继续报号
// //
// // if(man[i] != 0) call++; //不等于0, 说明还没有报道 3
// // if(call == 3)
// // {
// // man[i] = 0; //喊到 3 的人, 将他对应的数设置为 0
// // call = 0; //将喊数,重置为0
// // manCount--; //kill一个人
// // }
// // i++;
// // if(i == 13)i = 0;
// // }
// for (int i = 0; i < 13; i++) {
// if(man[i] != 0){
// printf("出卖耶稣的叛徒的序号是 %d 号", i + 1);
// }
// }
// 3.(***)模拟n个人参加选举的过程,并输出选举结果:假设候选人有四人,分别用A、B、C、D表示,当选某候选人时,直接输入其编号(编号由计算机随机产生),// 若输入的不是A、B、C、D对应的编号,则视为无效票,选举结束后按得票数从高到低输出候选人编号和所得票数。
// int man = 0; //参加选举的人数
// int poll[4] = {0}; //存放票数
// int num[4] = {0}; //存放随机编号
// char candidate[4] = {'A', 'B', 'C', 'D'};
// printf("候选人名单:
");
// for (int i = 0; i < 4; i++) { //随机产出编号, 对应候选人
// num[i] = arc4random() % (200 - 100 + 1) + 100;
// printf("%c的编号:%d
",candidate[i], num[i]);
// }
// printf("请管理员输入参加选举人数:");
// scanf("%d", &man);
// while (man) {
// printf("
请输入候选人对应的编号:");
// int inputNum = 0;
// bool isUse = NO; //判断是否是有效票
// scanf("%d", &inputNum);
// for (int i = 0; i < 4; i++) {
// if(inputNum == num[i]){ //如果输入的编号, 存在
// printf("投票成功~~
");
// poll[i]++;
// isUse = YES;
// break;
// }
// }
// if (!isUse) {
// printf("无效票~!~
");
// }
// man--;
// }
//
// for (int i = 0; i < 4 - 1; i++) {
// for (int j = 0; j < 4 - 1 - i; j++) {
// if(poll[j] < poll[j + 1]){ //冒泡排序票数
// int temp = poll[j];
// poll[j] = poll[j + 1];
// poll[j + 1] = temp;
//
// //为了将候选人, 以及编号, 同票数, 一一对应,
// //也需要将候选人以及编号, 同票数做同样的排序
// char ctemp = candidate[j];
// candidate[j] = candidate[j + 1];
// candidate[j + 1] = ctemp;
//
// int ntemp = num[j];
// num[j] = num[j + 1];
// num[j + 1] =ntemp;
// }
//
// }
// }
//
// for (int i = 0 ;i < 4 ;i++) {
// printf("%d 号候选人 %c 获得 %d 票
", num[i], candidate[i], poll[i]);
// }
///////////******课堂方法**********//////////////
// printf("请管理员输入参加选举人数:");
// scanf("%d", &man);
// //开始模拟投票
// for (int i = 0; i < man; i++) {
// int ran = arc4random() % (68 - 65 + 1) + 65;
// poll[ran - 65]++;
// }
// for (int i = 0; i < 4 - 1; i++) {
// for (int j = 0; j <4 - 1 - i; j++) {
// if (poll[j] < poll[j + 1]) {
// int temp = poll[j];
// poll[j] = poll[j + 1];
// poll[j + 1] = temp;
// //为了将候选人, 以及编号, 同票数, 一一对应,
// //也需要将候选人以及编号, 同票数做同样的排序
//
// char ctemp = candidate[j];
// candidate[j] = candidate[j + 1];
// candidate[j + 1] = ctemp;
// }
// }
// }
// for (int i = 0 ;i < 4 ;i++) {
// printf("候选人 %c 获得 %d 票
", candidate[i], poll[i]);
// }
// 4、找出一个二维数组中的“鞍点”,即该位置上的元素在该行中最大,在该列中最小(也可能没鞍点),打印出有关信息。
int a[3][4] = {
1, 1, 1, 1,
1, 1, 1, 1,
1, 1, 1, 1 };
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("
");
}
int maxRow = 0;
int maxR[3] = {0};
int minLine = 70;
int minL[4] = {0};
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++){
if(a[i][j] > maxRow){
maxRow = a[i][j];
}
}
maxR[i] = maxRow; //存放一行中最大值
maxRow = 0;
}
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 3; j++) {
if(a[j][i] < minLine){
minLine = a[j][i];
}
}
minL[i] = minLine; //存放一列中最小值
minLine = 70;
}
bool isNO = NO; //不存在按点
int num = 0; //记录鞍点的个数
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
if(maxR[i] == minL[j]){
num++;
printf("第 %d 个鞍点 %d 位置:(%d 行, %d 列)
",num, maxR[i], i + 1, j + 1);
isNO = YES;
}
}
}
if (!isNO) {
printf("该二维数组不存在鞍点
");
}
printf("
");
//
// double start ,finish;
// start = (double)clock();
//
// finish = (double)clock();
// printf("%.2f", finish - start);
//
// ////////////////*****课堂答案********//////////////
// int count = 0;//记录按点个数
// for (int i = 0; i < 3; i++) {
// for (int j = 0; j < 4; j++) {
// //判断元素是不是按点
// //1.判断是否是本行中最大的
// int max = a[i][j];
// BOOL isMax = YES; //假设是本行中最大的
//
// for (int col = 0; col < 4; col++) { //代表列
// if(a[i][col] > max){
// isMax = NO; //发现本行中比当前值大,说明该数不是本行中最大
// break;
// }
// }
// if (isMax == NO) {
// continue;
// }
// //2.判断是否是本咧中最小
// int min = a[i][j];
// BOOL isMin = YES;
// //验证是否是本咧中最小的
// for (int row = 0; row < 3; row++) {
// if(a[row][j] < min){
// isMin = NO;
// break;
// }
// }
// if (isMin == NO) {
// continue;
// }
// //如果执行到这里, 说明是按点
// printf("%d, %d
", i, j );
// count++;
// }
// }
// printf("%d
" , count);
//
//////////////////*****字符串数组*******////////////////
//字符串数组, 存储多个字符串
//本质:包含多个一维的字符数组, 每一个字符数组村粗一个字符串
//列数应该大于等于, 最长字符串长度 + 1
// char str[3][8] = {"iPhone", "Android" ,"WP"}; //
// //访问字符串数组中的第二个字符串
// printf("%s
", str[1]);
// printf("%c
", str[1][1]);
//
// //将iPhone,替换成Ashen
// strcpy(str[0], "Ashen");
// printf("%s ",str[0] );
//
////输出最长字符串的长度
// char name[4][10] = {"HuiPeng", "BaiYaChao" ,"HeHang", "ZhenZhen"};
//
// int len = 0;
// for (int i = 0; i < 4; i++) {
// if(strlen(name[i]) > len){
// len = (int)strlen(name[i]); //强制将unsigned long int 转成 int
// }
// }
// printf("最长字符串:%d
", len);
// //对字符串数组进行排序
// for (int i = 0 ; i < 4; i++) {
// for (int j = 0; j < 4 - 1 - i; j++) {
// if(strcmp(name[j], name[j + 1])){
// char temp[10] = " ";
// strcpy(temp, name[j]);
// strcpy(name[j], name[j + 1]);
// strcpy(name[j + 1], temp);
// }
// }
// }
// for (int i = 0; i< 4; i++) {
// printf("%s ", name[i]);
// }