· 地址和一维数组是一样的,都是连续的,存储显示是一维,数组名也不能自增或自减。
练习1 计算m行n列的二维数组的最大值和最小值,以及所在的行列
#include
int main() {
int m=0;
int n=0;
scanf("%d",&m);
scanf("%d",&n);
int arr[m][n] = { 0 };
int max = 0;
int min = 0;
int maxi = 0;
int maxj = 0;
int mini = 0;
int minj = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (0 == i && 0 == j) {
max = arr[i][j];
min = arr[i][j];
}
if (max > arr[i][j]) {
max = arr[i][j];
maxi = i;
maxj = j;
}
if (min < arr[i][j]) {
min = arr[i][j];
mini = i;
minj = j;
}
}
}
printf("max_arr[%d][%d]=[%d]\n", maxi, maxj, max);
printf("min_arr[%d][%d]=[%d]\n", mini, minj, min);
return 0;
}
练习2:杨辉三角
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
//题目要求做的是6行6列的,本人做的是个10行10列的大杨辉三角
#include
int main() {
int arr[10][10];
int i = 0;
int j = 0;
for (i = 0; i < 10;i++) {
arr[i][i] = 1;
arr[i][0] = 1;
}
for (i = 2; i < 10;i++) {
for(j=1;j<=i-1;j++)
arr[i][j] = arr[i-1][j-1] + arr[i-1][j];
}
for (i = 0; i < 10;i++) {
for (j = 0; j <= i;j++) {
printf("%4d",arr[i][j]);
}
printf("\n");
}
return 0;
}
字符数组:存储多个字符的容器,属于线性结构
字符串:由0个或多个字符组成的整体,成为字符串
【多用双引号括起来,字符串的标志\0,当字符串使用双引号括起来时,计算机会自动添加\0,所有汉字都是字符串】
gets(); puts();
格式:char *gets(char *s); 格式:int puts(const char *s);
返回值是一个地址,故括号内需要写入一个地址 返回值:int 输出字符的个数
特点:能读入空格 特点:输出自带换行,不需要‘\n’
字符数组长度:计算\0 就是sizeof
字符串长度:不计算\0, strlen,实际字符的个数
字符数组长度 字符串长度
char a[10]={'a','b'}; 10 2
char b[]={'a','b'} 2 不是字符串,所以读取的长度不确定,
原因找不到\0.会越界继续向下访问
char c[]="abcd" 5 4
char d[10]="abc" 10 3
char e[]="abc\0def" 8 3
考点1 单词逆转
这是对于单个字符串的逆转
#include
#include
int main() {
//字符串逆转
char str[100];
scanf("%s", str);
char i = 0;
char j = strlen(str)-1;
char temp = 0;
for (i = 0; i<=j;i++,j--) {
temp= str[j];
str[j] = str[i];
str[i] = temp;
}
printf("逆转后为%s\n",str);
return 0;
}
而对于多个单词的逆转就是先将字符串整体先逆转,再对于字符串单个逆转
#include
#include
int main() {
//字符串整体逆转
char arr[100] = "";
scanf("%99[^\n]", arr);
char i = 0;
char j = strlen(arr) - 1;
while (i < j) {
char temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
i++;
j--;
}
//再将逆转后的字符串逆转
i = 0;
j = 0;
int flag = 0;
while (arr[j] != '\0') {
while (arr[j] != ' ' && arr[j] != '\0') {
j++;
}
flag = j;
j--;
while (i < j) {
char temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
i++;
j--;
}
while (' ' == arr[flag]) {
flag++;
}
i = flag;
j = flag;
}
printf("%s\n", arr);
}
考点2 实现atoi功能
#include
int main() {
//实现atoi功能
char arr[100] = "";
scanf("%99s",arr);
int sum = 0;
for (int i = 0; arr[i] != 0;i++) {
int num = arr[i] - '0';
sum=sum*10 +num;
}
printf("%d",sum);
}
最主要考点在于不调用这些函数实现他们的功能
//strlen函数实现
#include
int main() {
char arr[100] = "";
scanf("%99s", arr);
int i = 0;
while (arr[i] != '\0') {
i++;
}
printf("%d", i);
}
//strcpy函数实现
#include
int main() {
int i = 0;
int j = 0;
char arr[100] = "";
char brr[100] = "";
scanf("%99s", arr);
scanf("%99s", brr);
while (brr[j]!=0) {
arr[i]= brr[j];
i++;
j++;
}
arr[i] = '\0';
printf("%s %s\n",arr,brr);
return 0;
}
//strcat函数实现
#include
int main() {
int i = 0;
int j = 0;
char arr[100] = "";
char brr[100] = "";
scanf("%99s", arr);
scanf("%99s",brr);
while (arr[i])
i++;
while (brr[j]) {
arr[i] = brr[j];
j++;
i++;
}
printf("%s\n",arr);
}
//strcmp函数实现
#include
int main() {
char arr[100] = "";
char brr[100] = "";
scanf("%99s", arr);
scanf("%99s", brr);
int i = 0;
while (arr[i] == brr[i] && arr[i] != '\0') {
i++;
}
if (arr[i] > brr[i]) {
printf("1\n");
}
else if (arr[i] < brr[i]) {
printf("-1\n");
}
else {
printf("0\n");
}
return 0;
}
1.可以使用二维数组遍历的方法
char a[3][5]={"abcd","ASDF","123"};
for(int i=0;i<3;i++)
{
for(int j=0;j<5;j++)
{
printf("%c",a[i][j]);
}
printf("\n");
}
2.常用:二维数组类似一维数组的循环方式
for(int i=0;i<3;i++)
{
printf("%s\n",a[i]);
}
作业
1.杨辉三角
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
//金字塔形状的长高为6的杨辉三角形
#include
int main() {
int arr[10][10];
int rows = 6;
for (int i = 0; i < rows; i++) {
for (int space = 0; space < rows - i-1; space++) {
// 打印前置空格
printf(" ");
}
for (int j = 0; j <= i; j++) {
// 第一行和每行的第一个和最后一个数是1
if (i == j || j == 0)
arr[i][j] = 1;
// 其他位置的数字是上一行的前一个和上一行的同一个位置的数字之和
else
arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
printf("%4d", arr[i][j]); // 打印数字,%4d表示至少占4个字符宽度
}
printf("\n");
}
return 0;
}
2.图形打印
A
BB
CCC
DDDD
DDDD
CCC
BB
A
#include
int main() {
int arr[4][5] = { 0 };
//打印正三角
for (int i = 0; i < 4;i++) {
for (int j = 0; j <= i;j++) {
printf("%c",'A'+i);
}
printf("\n");
}
printf("\n");
//打印倒三角
for (int i = 0; i < 4;i++) {
for (int j = 0; j <4-i;j++) {
printf("%c", 'D' - i);
}
printf("\n");
}
}
3.穷举算法
日本某地发生了一件谋杀案,警察通过排查确定茶人凶手必定4个中的一个 以下为4个嫌疑犯的供词
A说:罪犯是他们3人当中
B说:人不是我杀的,是C
C说:A和D之间有一个是罪犯
D说:B说的是事实
已知2个人说了真话,2个人说了假话 请编程确定谁是凶手
#include
int main() {
char murderer;
for (murderer = 'A'; murderer <= 'D'; murderer++) {
int truth_count = 0;
// Check if A's statement is true
if ((murderer != 'A') + (murderer == 'C') + (murderer == 'D') + (murderer != 'D') == 2)
truth_count++;
// Check if B's statement is true
if ((murderer != 'B') + (murderer == 'C') + (murderer == 'A') + (murderer != 'D') == 2)
truth_count++;
// Check if C's statement is true
if ((murderer != 'A') + (murderer != 'C') + (murderer == 'D') + (murderer == 'B') == 2)
truth_count++;
// Check if D's statement is true
if ((murderer == 'B') + (murderer != 'C') + (murderer != 'A') + (murderer != 'D') == 2)
truth_count++;
if (truth_count == 2) {
printf("The murderer is %c.\n", murderer);
break;
}
}
return 0;
}
4.给定一个整数,判断它是否被3、5、7整除,并输出一下信息
1.能同时被3,5,7整除(直接输出3 5 7,每个数字之间一个空格)
2.只能内其中两个整数整除(输出两个数,小的在前,大的在后,例如3 5 或者 3 7 或者5 7,中间使用空格隔开)
3. 只能被其中一个整数整除(输出这个除数)
4.不能被任何数整除,输出小写字母n 案例如下: 输入:105 输出:3 5 7
#include
void check_divisibility(int n) {
int flag = 0;
if(n % 3 == 0) {
printf("3 ");
flag = 1;
}
if(n % 5 == 0) {
printf("5 ");
flag = 1;
}
if(n % 7 == 0) {
printf("7 ");
flag = 1;
}
if(flag == 0) {
printf("n");
}
printf("\n");
}
int main() {
int num;
printf("Enter a number: ");
scanf("%d", &num);
check_divisibility(num);
return 0;
}
5.字符串单词逆置
”good good study“
"study good good"
见1.4考点1 单词逆转
6.实现atoi函数
见1.4考点2 实现atoi功能
7.输入一个字符串,删除字符串中的空格
”this is my class“
"thisismyclass"
#include
int main() {
char arr[100] = "";
scanf("%99[^\n]", arr);
int i = 0;
int j = 0;
while (arr[i]!='\0') {
if (arr[i] != ' ') {
arr[j++] = arr[i];
}
i++;
}
arr[j] = '\0';
printf("删除后为%s\n",arr);
}
8.四个字符串函数,非函数实现
见标题三中内容