基于Linux学习 C语言——基础 DAY9(接DAY8二维数组部分)

一、二维数组的地址

·        地址和一维数组是一样的,都是连续的,存储显示是一维,数组名也不能自增或自减。

1.1、二维数组的练习(重点,笔试有部分会考)

练习1 计算m行n列的二维数组的最大值和最小值,以及所在的行列

#include <stdio.h>

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<stdio.h>

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;
}

1.3一维字符数组     

字符数组:存储多个字符的容器,属于线性结构

字符串:由0个或多个字符组成的整体,成为字符串

【多用双引号括起来,字符串的标志\0,当字符串使用双引号括起来时,计算机会自动添加\0,所有汉字都是字符串】

1.3.1字符数组的引用

gets();                                                                                        puts();

格式:char *gets(char *s);                                                        格式:int puts(const char *s);

返回值是一个地址,故括号内需要写入一个地址                      返回值:int 输出字符的个数

特点:能读入空格                                                                     特点:输出自带换行,不需要‘\n’

1.4字符数组长度和字符串长度【考点】

字符数组长度:计算\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<stdio.h>
#include<string.h>
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<stdio.h>
#include<string.h>
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<stdio.h>
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<stdio.h>
int main() {
	char arr[100] = "";
	scanf("%99s", arr);
	int i = 0;
	while (arr[i] != '\0') {
		i++;
	}
	printf("%d", i);
}
//strcpy函数实现
#include<stdio.h>
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<stdio.h>
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<stdio.h>
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<stdio.h>

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<stdio.h>
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 <stdio.h>

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 <stdio.h>

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 <stdio.h>
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.四个字符串函数,非函数实现

见标题三中内容

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值