2020-11-09

前言

大家好,本人是某大学的大一新生。今天是我第一天成为呃呃呃呃呃呃呃呃~有点小紧张不好意思,回归正题,你们第一想到是不是以为我是第一天成为软件工程师,不不不,我想说的是今天我第一天成为一名博客,对,没错,第一天成为博客毫无经验当天就发表我作为博客的第一篇文章。第一天成为一名博客好紧张呀,但是不慌吃口药缓解一下心情。我,一名博客新人,软件工程师新手(呃呃呃呃呃,把自己说的好高大上呀,其实我感觉自己作为新手啥也不是,但是我想不到其他名词来描述我们这个专业,所以先预称自己是一名软件工程师吧),一名不善于写文章的理工生(是超级不会),以下以及以后文章如果有什么错误以及其他见解希望屏幕前的大佬们能在评论去指出或私信我,对了前面说过我是一个不善于写文章的人所以我的语言可能没有极强的道理性和逻辑性,就是简简单单,就是和大家平时聊天那样的简单,希望大家不要介意。我发表文章就是想和大家分享我在学习如何成为一名软件工程师的一些学习问题和感受,希望大家能在评论区分享大家成为软件工程师的头炸和欢乐吧!好了,废话一大堆,学习第一位,开始学习了,朋友们。

数组:同伴,我找到你了!

数组:同伴,我找到你了!
普通单独变量:我靠,下一个,叫你呢,你在哪!!

数组,说白了,就是几个变量,只不过是这几个变量是连起来的,还有就是它这几个变量是被计算机挖了个大坑一起丢下去的,计算机还不会让它们乱跑。而你定义相同数量的变量,虽然也是存放了这几个变量,但是当你如果在用某个变量的同时你又要用到其他一起定义的变量时,如果你是单独分别定义变量那你就很难找到其他变量,因为计算机在定义这几个单独变量它是随机找了一个内存来存放这几个变量的,变量的地址是随机的,变量之间没有什么联系。但是你用数组来存放数据,但你在使用某一数组元素时你又要找到其他的数组元素来进行运算,这时你就很方便地找到正确的那个元素进行运算。
下面三道题目来体现数组的优越性
1.判断一个数是否是回文数。回文数是正序(从左到右)和倒序(从右到左)读都是一样的整数。

#include<stdio.h>
#include<math.h>
int main()
{
	int m,n;                                                                          //m表示输入的数,n表示中间所需变量
	char str[20];
	int i,j;                                                                            
	int swit=1;                                                                       //swit标志变量
	printf_s("请输入一个整数:");
	scanf_s("%d", &m);
	n = fabs(m);
	i = 0;
	while (n > 0)                                                                     //将m每一位数输入到字符数组相应次序的字符
	{
		str[i] = n % 10 + '0';
		i++;
		n = n / 10;
	}
	if (m < 0)                                                                        //若m<0则在最后在字符串后加上'-'
	{
		str[i] = '-';
		i++;
	}
	str[i] = '\0';                                                                    //记住字符串最后的'\0'字符
	i = i - 1;
	for (j = 0; j <= i; j++,i--)                                                      //检查字符串是否对称
	{
		if (str[j] != str[i])
		{
			swit = 0;                                                                 //不对称swit=0,跳出循环
			break;
		}
	}
	if (swit)                                                                         //swit=1表示是回文数
		printf_s("true\n");
	else
		printf_s("false\n");                                                          //swit=0表示不是回文数
	return 0;
}

运行结果:
输入一个正整数回文数输出true
输入一个负数输出false

思路:一看到是要对某个整数的每一位数或某一位数进行运算就用字符数,但是先要将这个整数的每一位依次记录在字符数组中。
这里我就要分享我对整数和字符数组区别的看法,我认为对于C语言输入一个整数等同于输入一个对应的字符数组。一个程序最终的结果是输出来给为我们看的只要我们看到的这个结果是我们想要的结果那这个程序就是成功的,那对于计算机输出的结果是以一个整数数值的形式还是以一个对应的字符数组的形式输出没有区别。那么对于我们输入一个整数,可以用程序转换为对应的字符数组,进行数字倒置、输出,甚至我们可以设计一个函数来有相应的字符数组来达到数值加减乘除的运算结果。
回到原题,为什们我要把一个整数转换为一个对应的字符数组呢,因为用字符数组的下标可以实现不同位的比较、交换,最后输出字符数组,虽输出的是字符数组但是我看到是这结果,与用数值来处理结果一样。
本题当然也可以数值分别分离出每一位数字,再进行比较,但这是整数位数你知道而且少才能做到,如果整数为未知且多久无法这样做,这就体现了用字符数组处理整数要对每位数运算的优越性。
算法流程:

  1. 输入一个整数
  2. 将整数(包括符号)记录在字符数组中(本程序是倒放记录,结果一样)
  3. 将字符数组进行比较看是否对称,对称则为回文数。
  4. 输出判断结果。
    2.给出一个3位的有符号整数,你需要将这个整数每一位上的数字进行反转。
#include<stdio.h>
int main()
{
	int m, n;                                                                          //m表示输入的整数,n表示中间所需变量
	int i;
	char str[20];
	int swit;                                                                          //swit标志变量
	printf_s("请输入一个整数:");
	scanf_s("%d", &m);
	if (m >= 0)                                                                   
	{
		swit = 1;                                                                      //swit=1表示m>=0
		n = m;
	}
	else
	{
		swit = 0;                                                                      //swit表示m<0
		n = -m;                                                                        //n取m绝对值
	}
	i = 0;
	while (n > 0)                                                                      //将m每一位数输入到字符数组相应次序的字符,这里是倒置记录
	{
		str[i] = n % 10 + '0';
		i++;
		n = n / 10;
	}
	str[i] = '\0';                                                                     //记住字符串最后的'\0'字符
	if (swit)
		printf_s("%s\n", str);                                                         //m>=0原样输出字符数组   
	else
		printf_s("-%s\n", str);                                                        //m<0要加负号
	return 0;
}

运行结果:
在这里插入图片描述

在这里插入图片描述
思路:看到要对整数倒置就是要对每一位数进行运算用字符数组。
算法流程:

  1. 输入整数
  2. 判断整数时否大于等于0,小于0则要取其相反值
  3. 将整数记录到字符数组中
  4. 这里记录时已经时倒序记录了,无需再进行处理原样输出(注意如果这个整数是负数还要记得输出结果不要忘了符号)
    3.给定一个非整数numBow,生成杨辉三角的前numBow行
#include<stdio.h>
int main()
{
	int number;                                                                       //number表示要输出杨辉三角的行数
	int num[20][20];
	int i, j;
	printf_s("请输入一个非负整数:");
	scanf_s("%d", &number);
	if (number < 0 || number>20)                                                     //输入的行数错误结束程序
	{
		printf_s("输入number错误\n");
		return 0;
	}
	for(i=0;i<number;i++)                                                            //使一行第一个数和最后一个数为1,其他数为0;
		for (j = 0; j <= i; j++)
		{
			if (j == 0 || j == i)
				num[i][j] = 1;
			else
				num[i][j] = 0;
		}
	for (i = 0; i < number; i++)                                                     //杨辉三角除第一个数和最后一个数都等于其左右上肩两个数这和
		for (j = 1; j <= i - 1; j++)
			num[i][j] = num[i - 1][j - 1] + num[i - 1][j];
	printf_s("[\n");
	for (i = 0; i < number; i++)                                                     //输出杨辉三角前number行
	{
		for (j = number - 1 - i; j >= 0; j--)
			printf_s(" ");
		for (j = 0; j <= i; j++)
		{
			if (j == i)
				printf_s("%d\n",num[i][j]);
			else
				printf_s("%d,",num[i][j]);
		}
	}
	printf_s("]\n");
	return 0;
}

运行结果:
在这里插入图片描述
思路:输出杨辉三角的前number行,杨辉三角的性质就是杨辉三角数等于其右上肩和左上肩两个数之和。一看到要计算一个数同时又要其他同组或同类的数就用数组解决这个问题。本题虽然要输出的是三角形阵,而数组是矩形阵,但是只有我们控制好输出空格和数据个数循环次数就可以达到我们要的结果。
个人提醒:程序中我还加入几行判断number大小是否正确的代码,如果错误则输出数据错误并结束程序。虽然题目并没有要求有这个判断,但是我们作为软甲工程师就用使程序对所有数据几乎都可以运行,使程序接近完美。或者说我觉得我们应该从现在开始就要培养能够自己在写代码时提前预知可能存在的漏洞,如果等他出现再到回来找需要的工作就更多。
算法流程:

  1. 输入非负整数并判断是否错误
  2. 计算杨辉三角,第n行有n个杨辉三角数,每一行第一和最后一个数位1,第i行j列个数=第i-1行j列个数+第i-1行j-1列个数
  3. 输出杨辉三角

总结

对于输出某一图形阵,数值阵,检查对称,倒置数,或者说运算一个数需要与其它相类似数相关,就可以用数组解决。定义数组存放多个数据,这几个数据会放在同一个数组中,那么这几个数据一定有一些联系,我们有数组就是利用数组元素间有一定联系性。所以用好数组元素间的联系!!

等等!!别划走!最后一件事!

我不求点赞不求关注,只求在评论区留下你们学习过程中有意思的想法见解和学习遇到的搞笑事情,一经采用推广就有~~~~~~等等,你在想什么,现金红包,奖品,不!这些统统没有,我是一个某大学大一新生,c语言初学者,一个偏远县城里的穷小子,给你只有大大的鼓励。那赶快打开你们的键盘界面,敲下你们的评论吧,我真的是等不了呀,朋友们!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值