C语言好好题(一维数组)

这篇具有很好参考价值的文章主要介绍了C语言好好题(一维数组)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

两天没有更新了,贴纸们,有没有想我呀。😄😄😄

好了,就寒暄到这里吧,下面请看题:

有序序列判断

输入一个整数序列,判断是否是有序序列,有序,指序列中的整数从小到大排序或者从大到小排序(相同元素也视为有序

输入描述:

第一行输入一个整数N(3≤N≤50)。

第二行输入N个整数,用空格分隔N个整数。

输出描述:

输出为一行,如果序列有序输出sorted,否则输出unsorted。

判断是否为有序序列,可能是升序还可能是降序,所以我们就可以设计一个函数来判断是不是有序序列,那么我们怎么实现呢?首先我们假设是升序的,那么我们就以这个条件进去,然后以某一个值为有序状态,然后我们再里面进行判断,如果有相反情况,那么我们就改变刚才假设有序状态的值,改为无序状态。之后我们再在主函数中,根据返回的值进行判断有序还是无序!:

int sort(int arr[], int n)
{
	
	if (arr[0] >= arr[1])
	{
			int flag = 0;//假设flag为0的时候为有序状态
			for (int j = 0; j < n - 1; j++)
			{
				if (arr[j] < arr[j + 1])
				{
					flag = 1;//因为我们前面假设的是升序,这里前一位大于后一位的话,就不是有序                
                             //  状态了,那么此时我们就变为无序状态
				}
			}
			return flag;
	}
	else 
	{
		int flag = 0;
		for (int j = 0; j < n - 1; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				flag = 1;
			}
		}
		return flag;
	}
}

主函数里,我们就很好写了:

int sort(int arr[], int n)
{
	
	if (arr[0] >= arr[1])
	{
			int flag = 0;
			for (int j = 0; j < n - 1; j++)
			{
				if (arr[j] < arr[j + 1])
				{
					flag = 1;
				}
			}
			return flag;
	}
	else 
	{
		int flag = 0;
		for (int j = 0; j < n - 1; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				flag = 1;
			}
		}
		return flag;
	}
}

int main()
{
	int n = 0;
	scanf("%d", &n);

	int arr[50];
	for (int i = 0; i < n; i++)
	{
		scanf("%d",&arr[i]);
	}

	int ret = sort(arr, n);//根据返回的值进行判断是否有序
	if (ret == 1)
	{
		printf("unsorted");
	}
	else
	{
		printf("sorted");
	}

	return 0;
}

我们来看看运行结果:

C语言好好题(一维数组),c语言,算法,一维数组,学习


有序序列插入一个整数

有一个有序数字序列,从小到大排序,将一个新输入的数插入到序列中,保证插入新数后,序列仍然是升序。

输入描述:

第一行输入一个整数N(0≤N≤50)。

第二行输入N个升序排列的整数,输入用空格分隔的N个整数。

第三行输入想要进行插入的一个整数。

输出描述:

输出为一行,N+1个有序排列的整数。

插入一个数到升序序列中,而且保证插入后还是一个升序序列!怎么想这道题呢?这里的要求是插入一个数,那么我们一个数有一个数的做法,有一些是两个有序序列进行排序!那么我们很容易想到用这个数字与这个序列进行比较,如果小于这个数,那么我们就打印我们的原序列的数,如果大于我们这个数,那我们此时就是打印我们的目标数,那么现在我们就以这个思路去实现我们的代码:

int main()
{
	int n = 0;
	scanf("%d", &n);

	int arr[50];
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &arr[i]);
	}

	int num = 0;
	scanf("%d", &num);

	
	for (int i = 0; i < n; i++)
	{

		if (arr[i] < num)
		{
			printf("%d ", arr[i]);
		}
		else
		{
			printf("%d ", num);
		}	
	}


	return 0;
}

此时我们来看看运行的结果:

C语言好好题(一维数组),c语言,算法,一维数组,学习

 我们根据运行的结果可以看出,当我们找到插入数的位置后,我们之后的数都是打印的是我们的插入的那个数。那么此时我们可以想,那当我们的插入数插到属于它自己的位置时,此时我们就不回去循环了。我们可以重新写一个循环呀,打印原序列后面的数不就好了嘛,我们打印完后,我们就跳出整个循环!:

int main()
{
	int n = 0;
	scanf("%d", &n);

	int arr[50];
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &arr[i]);
	}

	int num = 0;
	scanf("%d", &num);

	
	for (int i = 0; i < n + 1; i++)//因为我们插入了一个数,所以多了一次循环
	{

		if (arr[i] < num)
		{
			printf("%d ", arr[i]);
		}
		else
		{
			printf("%d ", num);//因为是插入一个,所以我们就打印之后的序列的数就好了。
			for (int j = i; j < n; j++)
			{
				printf("%d ", arr[j]);
			}
			break;//打印完后跳出整个循环就over了!
		}
	}


	return 0;
}

 我们来看看此时的运行结果:

C语言好好题(一维数组),c语言,算法,一维数组,学习


序列中删除指定数字

有一个整数序列(可能有重复的整数),现删除指定的某一个整数,输出删除指定数字之后的序列,序列中未被删除数字的前后位置没有发生改变。

输入描述:

第一行输入一个整数(0≤N≤50)。

第二行输入N个整数,输入用空格分隔的N个整数。

第三行输入想要进行删除的一个整数。

输出描述:

输出为一行,删除指定数字之后的序列。

序列中删除指定的数字,而且可能序列中有相同的整数,那么也可能是相邻的相同的数。那么我们还是要与序列中的数进行比较,如果不相同的话,那么我们就打印出序列中的数。如果相同的话,我们就删除序列中的数:

int main()
{
	int n = 0;
	scanf("%d", &n);

	int arr[50];
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &arr[i]);
	}

	int num = 0;
	scanf("%d", &num);

	for (int i = 0; i < n; i++)
	{
		if (arr[i] > num || arr[i]<num)
		{
			printf("%d ", arr[i]);
		}	
		else
		{
			
		}
	}
	return 0;
}

此时我们的问题是怎样删除我们的数,那我们可以由后面一位数来替代该位需要删除的数:

arr[i] = arr[i + 1];

而且还要注意可能有相邻的相同的数!那么我们在序列中的数与该数相同时我们是不是还应该弄一个循环,判断是否有相邻的相同数,直到不相等了,我们才跳出去!

while (arr[i] == arr[i + 1])
{
	arr[i] = arr[i + 1];
	i++;
}

我们来看看整体的代码:

int main()
{
	int n = 0;
	scanf("%d", &n);

	int arr[50];
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &arr[i]);
	}

	int num = 0;
	scanf("%d", &num);

	for (int i = 0; i < n; i++)
	{
		if (arr[i] > num || arr[i]<num)
		{
			printf("%d ", arr[i]);
		}	
		else
		{
			while (arr[i] == arr[i + 1])
			{
				arr[i] = arr[i + 1];
				i++;
			}
			
		}
	}
	return 0;
}

我们来看看运行的结果:

C语言好好题(一维数组),c语言,算法,一维数组,学习

 我们来梳理一下该过程:假设序列不等于要删除的数,我们就直接打印该序列中的数就可以了,如果等于该序列的数,我们先判断有没有相邻的相同的数,如果没有,那么我们就不用执行,这一位就不用打印,就直接跳到上面for循环给i++,跳到下一位进行判断!如果有相邻相同的,我们就进入while循环,把后一位的值赋值给前一位,然后i++,直到不相等为止!假设我们有两位相邻的,那么我们的while循环就执行了一次,i就加了一次,然后到上面for循环处还要加一次,总共加了我们的两次,就是跳过我们的这两位咯,你懂了吗?学会了?还是学废了?哈哈,如果还是不太懂的话,可以自己去调试哦!

C语言好好题(一维数组),c语言,算法,一维数组,学习


序列中整数去重

输入n个整数的序列,要求对这个序列进行去重操作。所谓去重,是指对这个序列中每个重复出现的整数,只保留该数第一次出现的位置,删除其余位置。

输入描述:

输入包含两行,第一行包含一个正整数n(1 ≤ n ≤ 1000),表示第二行序列中数字的个数;第二行包含n个整数(范围1~5000),用空格分隔。

输入描述:

输出为一行,按照输入的顺序输出去重之后的数字,用空格分隔。

序列中整数的去重,且保留该数第一次出现的位置。哇,这题是一道比一道变态啊!😵😵😵

既然序列中的每一个元素都要去看的话,那么我们就拿出第一位去和后面的每一位进行比较,看看后面有没有,如果有那么我们就删除或者向上面那样的跳过,第一位比较完后,我们接着要拿出第二位去与后面的进行比较了,既然怎样的话,那么我们还是可以写出下面的代码的:

int main()
{
	int n = 0;
	scanf("%d", &n);

	int arr[1000];
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &arr[i]);
	}

	for (int i = 0; i < n; i++)
	{
		for (int j = i+1; j < n; j++)
		{
			if (arr[i] == arr[j])
			{
				//待思考的内容
			}
		}
	}


	return 0;
}

既然它要删除的话,那就是我们的跳过或者移位,如果跳过的话,那么我们再双重循环里面又该怎样打印?那么我们就先选择一位看看,把后面的那一位移到这一位来,就把后面的整体像前面移一位。移动完后,我们再接着从后面一位进行排查,如果还有我们又接着移,直到排查完毕!这个思路好像可以勒哈。那么我们移动一整次,是不是我们的n就要减少一次呢,因为我们移动了之后就会减少一位嘛,所以n应该减减。但是我们此时还要注意一个问题,我们的j也应该减减,因为再我们下一次判断下一位时,是从删除那位的位置开始排查着走的,因为我们到上面for循环去的话,j还要加加,所以我们这里j还要减减!

int main()
{
	int n = 0;
	scanf("%d", &n);

	int arr[1000];
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &arr[i]);
	}

	for (int i = 0; i < n; i++)
	{
		for (int j = i+1; j < n; j++)
		{
			if (arr[i] == arr[j])
			{
				for (int a = j; a < n - 1; a++)
				{
					arr[a] = arr[a + 1];
				}
				n--;
				j--;
			}
		}
	}

	for (int i = 0; i < n; i++)
	{
		printf("%d ", arr[i]);
	}

	return 0;
}

我们来看看运行结果:

C语言好好题(一维数组),c语言,算法,一维数组,学习

 今天就到这里了,拜拜了,好梦!文章来源地址https://www.toymoban.com/news/detail-755311.html

到了这里,关于C语言好好题(一维数组)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言中函数返回数组(一维和二维)

    C语言中函数返回数组是很重要的一种应用,有时候在程序中调用函数返回数组可以更容易的实现我们想要的某些操作,比如一次返回多个值,这篇文章带来的是C语言中函数返回一维数组和二维数组的例子。 函数返回一维数组中需要注意的是:定义函数时需要在函数类型的后

    2024年02月04日
    浏览(48)
  • 【C语言基础入门】二级指针、一维数组与指针、二维数组与指针

    在学习C语言的过程中,理解指针的概念是非常重要的。指针提供了一种直接访问内存地址的方式,使得我们可以更加灵活地管理数据和内存。在本文中,我们将介绍C语言中的二级指针、一维数组与指针,并通过通俗易懂的语言和示例代码来帮助读者理解这些概念。 二级指针

    2024年02月05日
    浏览(55)
  • C语言问题 - 关于一维数组和二维数组用*a+i形式表达

    今天在编写程序时被一个语句搞懵了: 输出结果: 把我搞懵的是*(pa + k) = *(a + i) + j; (其实真的很简单的道理还一直在纠结。。。) 其实这句话就是指(对等号左右边语句分别解释): 每次循环 pa+k都会让pa指针都会向下移动一格,而加上星号*就是为了取指针所指的值,而

    2024年02月11日
    浏览(39)
  • Visual Studio 2022环境中C语言的使用——一维数组和二维数组

    我是荔园微风,作为一名在IT界整整25年的老兵,今天总结一下,Visual Studio 2022环境中,是如何使用C语言的数组的。 先说一维数组,直接上代码: 这里特别容易搞错的就是一维数组的初始化,方法有如下几种: 1.在定义数组时直接对数组元素赋初值,例如: int iArray[6]={1,3,

    2024年02月05日
    浏览(81)
  • 数据结构与算法—一维数组、二维数组、矩阵、顺序串、链接串的C++代码实现

    1、一维数组:ArrayOneD.h 数组这种数据结构可以看作线性表的推广。数组一般采用顺序存储的方法表示。 这是一个模板类 ArrayOneD 的实现,用于表示一维数组。它包括了 构造函数、拷贝构造函数、析构函数、重载下标运算符、重载赋值运算符、求数组长度、重新设置数组长度

    2024年02月07日
    浏览(60)
  • 【C语言数组】一维数组,二维数组详解,数组传参,变长数组,这篇文章让你更全面的认识数组。

    前言: 大家好,我是 良辰丫 💞,今天带大家全面认识一下C语言里面的 数组 ,大家是不是满怀期待呢?嘿嘿嘿,别着急,我们往下看,感受C语言数组的魅力!!!💌💌💌 要么出众,要么出局。💝 乾坤未定,💟你我皆是黑马。 保存一组成绩的数据,数据多的时候难道要

    2024年01月19日
    浏览(51)
  • C语言:编写函数进行一维数组输入输出和求平均值

    任务描述 本关任务:从键盘输入某班学生 C 语言课的成绩(已知该班人数为 40 人),要求分别定义三个子函数分别进行数组输入、输出和求平均分。 相关知识 如果希望定义一个函数,能对一个数组整体进行操作,我们应该注意以下 3 点: 定义函数时,形参是一维数组,那么主

    2024年02月06日
    浏览(49)
  • C语言例题(二维数组)【转置矩阵】【成绩登记】【斐波那契】【简单矩阵查找】【螺旋数阵】【一维数组转二维数组】

    例一:转置矩阵 程序: 输出:通过b[j][i] = a[i][j];这一步实现了转置 进阶:用6个1~20内的随机数按行的顺序生成一个a[2][3]的矩阵,并输出它的转置矩阵 输出: 例2.登记某班三人的数学、英语两门课程的成绩。 分析:此类问题可以通过使用3个一维数组来解决,也可以通过使用

    2024年02月03日
    浏览(42)
  • 多轴机械臂运动控制:4x4坐标变换矩阵该用C语言的二维数组还是一维数组?

            做多轴机械臂的运动控制,免不了要对4x4的坐标变换矩阵进行乘法,C语言中可以用二维数组或者一维数组来实现矩阵,下面来比较一下二维数组和一维数组的性能差异。         开发环境:Visual Studio 2022,分别在Debug和Release模式下测试函数Multi4x4和Multi16,Re

    2024年03月25日
    浏览(58)
  • C++入门学习(三十)一维数组的三种定义方式

    数组是什么? 数组(Array)是有序的元素序列。 若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。用于区分数组的各个元素的数字编号称为下标。数组是在程序设计中,为了处

    2024年02月19日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包