💕"痛苦难以避免,而磨难可以选择。"-->村上春树💕
作者:Mylvzi
文章主要内容:数据在内存中的存储
目录
1.有序序列判断
题目描述:
分析过程:
代码实现:
2.获得月份天数
题目描述:
分析过程:
代码实现:
3.矩阵相等判定
题目描述:
分析过程:
4.矩阵交换
题目描述:
代码实现:
5.井字棋判断输赢
题目描述:
代码实现:
6.递归进行进制转换
题目描述:
分析过程:
代码实现:
画图理解递归过程:(推出去,再归回来)
1.有序序列判断
题目描述:
分析过程:
代码实现:
#include <stdio.h>int main()
{//定义个数int n = 0;scanf("%d",&n);//循环输入数字int arr[n];int i = 0;for(i=0; i<n; i++){scanf("%d",&arr[i]);}//判断int flag1 = 0;//判断升序int flag2 = 0;//判断降序for(i=0; i<n-1; i++){if(arr[i] <arr[i+1])flag1 = 1;elseflag2 = 1;}//如果为unsorted flag1+flag2==2if(flag1 + flag2 == 2){printf("unsorted");}else {printf("sorted");}return 0;
}/*第二种写法,边输入,边判断*/
#include <stdio.h>
//边输入,边判断
int main()
{//定义个数int n = 0;scanf("%d",&n);//循环输入数字 //判断int flag1 = 0;//判断升序int flag2 = 0;//判断降序int arr[n];int i = 0;for(i=0; i<n; i++){scanf("%d",&arr[i]);if(i>=1)//只要输了一个元素之后,输入一个就和前面已经输入的数字进行比较{if(arr[i] <arr[i-1])flag1 = 1;elseflag2 = 1;}}if(flag1 + flag2 == 2){printf("unsorted");}else {printf("sorted");}return 0;
}
2.获得月份天数
题目描述:
分析过程:
代码实现:
/*第一种写法,最直观的*/
#include <stdio.h>
int main()
{int y, m;while (scanf("%d %d", &y, &m) != EOF){switch (m){//第一种情况case 1:case 3:case 5:case 7:case 8:case 10:case 12:printf("31\n");break;//第二种情况case 4:case 6:case 9:case 11:printf("30\n");break;//二月的情况 要判断是否是闰年default:if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0))printf("29\n");elseprintf("28\n");}}return 0;
}/*第二种方法,漂亮的代码*/
#include <stdio.h>
//判断是否为闰年
int is_leap_year(int y)
{if((y%4==0 && y%100!=0 ) || (y%400==0))return 1;elsereturn 0;
}//获取天数
int get_days_of_month(int y,int m)
{//使用数组来存放对应的天数int d = 0;int day[]={0,31,28,31,30,31,30,31,31,30,31,30,31};d=day[m];if(m==2){if(is_leap_year(y)==1)d+=1;}return d;}
int main()
{//输入年份和月数int y = 0;int m = 0;while(scanf("%d %d",&y,&m)==2){int d = get_days_of_month(y,m);printf("%d\n",d);}return 0;
}
3.矩阵相等判定
题目描述:
分析过程:
代码实现:(第二种方法要学习)
方法一:
#include <stdio.h>
//BC105
//方法一
//判断矩阵是否相等->大小相等,但对应元素未知
int main()
{//定义矩阵大小int n = 0;int m = 0;scanf("%d %d", &n, &m);//两个矩阵的赋值int arr1[n][m];int arr2[n][m];int i = 0;int j = 0;for (i = 0; i < n; i++){for (j = 0; j < m; j++){scanf("%d", &arr1[i][j]);}}for (i = 0; i < n; i++){for (j = 0; j < m; j++){scanf("%d", &arr2[i][j]);}}//判断是否相等int flag = 0;for (i = 0; i < n; i++){for (j = 0; j < m; j++){if (arr1[i][j] != arr2[i][j]){flag = 1;}}}if (1 == flag){printf("No\n");}else {printf("Yes\n");}return 0;
}
方法2:(很不错的一个方法)(main函数也是函数,把它看作一个普通的自定义函数,只有一个返回值)
//BC105
//判断矩阵是否相等->大小相等,但对应元素未知
int main()
{//定义矩阵大小int n = 0;int m = 0;scanf("%d %d", &n, &m);//两个矩阵的赋值int arr1[n][m];int arr2[n][m];int i = 0;int j = 0;for (i = 0; i < n; i++){for (j = 0; j < m; j++){scanf("%d", &arr1[i][j]);}}for (i = 0; i < n; i++){for (j = 0; j < m; j++){scanf("%d", &arr2[i][j]);if (arr2[i][j] != arr1[i][j]){printf("No\n");return 0;}}}printf("Yes\n");return 0;
}//BC106上三角形矩阵判定
int main()
{//定义方阵大小int n = 0;scanf("%d",&n);//方阵赋值并判断int arr[n][n];int i = 0;int j = 0;for(i=0; i<n; i++){for(j=0; j<n; j++){scanf("%d",&arr[i][j]);if(j<i)//下对角线的条件,j<i{if(arr[i][j] != 0){printf("NO\n");return 0;}}}}printf("YES\n");return 0;
}
4.矩阵交换
题目描述:
代码实现:
#include <stdio.h>
//BC108 矩阵交换
int main()
{//定义矩阵大小int n = 0;int m = 0;scanf("%d %d", &n, &m);//矩阵赋值int i = 0;int j = 0;int arr[n][m];for (i = 0; i < n; i++){for (j = 0; j < m; j++){scanf("%d", &arr[i][j]);}}//输入进行变幻的次数int k = 0;scanf("%d", &k);//分三种情况进行操作int a = 0;//a仅仅是用来循环次数while (a < k){//先定义要执行的操作char ope = 0;//定义具体位置int x = 0;int y = 0;while (getchar() != '\n');scanf("%c %d %d", &ope, &x, &y);switch (ope){case 'r'://行操作for (j = 0; j < m; j++){int temp = arr[x-1][j];arr[x-1][j] = arr[y-1][j];arr[y-1][j] = temp;}break;case 'c'://列操作for (i = 0; i < n; i++){int temp = arr[i][x-1];arr[i][x-1] = arr[i][y-1];arr[i][y-1] = temp;}break;default://不进行操作break;}a++;}//输出变换后的矩阵for (i = 0; i < n; i++){for (j = 0; j < m; j++){printf("%d ", arr[i][j]);}printf("\n");}return 0;
}
5.井字棋判断输赢
题目描述:
代码实现:
#include <stdio.h>
//BC110//判断输赢函数
int is_winner(char arr[3][3], int row, int col)
{int x = 0;int y = 0;char flag = 0;//rowfor (x = 0; x < row; x++){if (arr[x][0] == arr[x][1] && arr[x][1] == arr[x][2] && arr[x][0] == arr[x][2])flag = arr[x][0];}//colfor (y = 0; y < col; y++){if (arr[0][y] == arr[1][y] && arr[1][y] == arr[2][y] && arr[0][y] == arr[2][y])flag = arr[0][y];}//对角线if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[0][0] == arr[2][2]){flag = arr[0][0];}if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[0][2] == arr[2][0]){flag = arr[0][2];}return flag;
}
int main()
{//用二维数组填充棋盘char arr[3][3];int i = 0;int j = 0;for (i = 0; i < 3; i++){for (j = 0; j < 3; j++){scanf("%c", &arr[i][j]);getchar();}}//判断输赢char ret = is_winner(arr, 3, 3);if (ret == 'K'){printf("KiKi wins!");}else if (ret == 'B'){printf("BoBo wins!");}else {printf("No winner!");}return 0;
}
总结:使用flag标记这种做法是一种很常见的C语言编程过程中使用到的技巧
6.递归进行进制转换
题目描述:
分析过程:
代码实现:
#include <stdio.h>
//BC111
//直接打印出来
void print(int num)
{if (num > 5)//保证num<6{print(num / 6);}printf("%d", num % 6);
}
int main()
{int num = 0;scanf("%d", &num);print(num);return 0;
}
画图理解递归过程:(推出去,再归回来)