【C语言】编程练习及答案(数组专项和运算符练习题)

数组专项


1.输入一个5个元素的一维数组,实现冒泡排序(大到小)。

#include<stdio.h>
 
int main(int argc, const char *argv[])
{
    int arr[5];
	for(int i=0;i<5;i++)	//输入一个5个元素
	{
		scanf("%d",&arr[i]);
	}
	int t=0;
	for(int i=0;i<5;i++)	//冒泡排序
	{
		for(int j=1;j<5-i;j++) 	//把最小的值一步一步飘到数组的最后面
		{
			if(arr[j-1]<arr[j]) 	//每次取相邻的两个数比较找小的值,从小到大排序就找大的值
			{
				t=arr[j-1];
				arr[j-1]=arr[j];
				arr[j]=t;
			}
		}
	}
	for(int i=0;i<5;i++)	//输出一个5个元素
	{
		printf("%d ",arr[i]);
	}
	putchar(10);
    return 0;
}

2.输入一个5个元素的一维数组,实现简单选择排序(大到小)。

#include<stdio.h>
 
int main(int argc, const char *argv[])
{
    int arr[5];
	for(int i=0;i<5;i++)	//输入一个5个元素
	{
		scanf("%d",&arr[i]);
	}
	int t=0;
	for(int i=0;i<5;i++)	//简单选择排序:循环遍历,每次选择最大的值和未排序的第一个元素交换,直到排完
	{
		int maxi=i; 		//定义每次循环要找的值的数组下标(从小到大排找最小的值的下标,本人一般定义为mini)
		for(int j=i+1;j<5;j++) 	
		{
			if(arr[maxi]<arr[j])maxi=j;
		}
		if(maxi!=i)
		{
			t=arr[i];
			arr[i]=arr[maxi];
			arr[maxi]=t;
		}
	}
	for(int i=0;i<5;i++)	//输出一个5个元素
	{
		printf("%d ",arr[i]);
	}
	putchar(10);
    return 0;
}

3.输入一个5个元素的一维数组,计算最大值最小值。

#include<stdio.h>
 
int main(int argc, const char *argv[])
{
    int arr[5];
	for(int i=0;i<5;i++)	//输入一个5个元素
	{
		scanf("%d",&arr[i]);
	}
	int max=arr[0],min=arr[0];
	for(int i=1;i<5;i++)	
	{
		if(max<arr[i])max=arr[i];
		if(min>arr[i])min=arr[i];
	}
	printf("最小值为%d,最大值为%d\n",min,max);
    return 0;
}

4.输入一个3行4列个元素的二维数组,计算最大值最小值。

#include<stdio.h>
 
int main(int argc, const char *argv[])
{
    int arr[3][4];
	for(int i=0;i<3;i++)	//输入一个5个元素
	{
		for(int j=0;j<4;j++)
		{
			scanf("%d",&arr[i][j]);
		}
	}
	int max=arr[0][0],min=arr[0][0];
	for(int i=0;i<3;i++)	
	{
		for(int j=0;j<4;j++)
		{
			if(max<arr[i][j])max=arr[i][j];
			if(min>arr[i][j])min=arr[i][j];
		}
	}
	printf("最小值为%d,最大值为%d\n",min,max);
    return 0;
}

5.使用二维数组计算杨辉三角。

#include<stdio.h>
 
int main(int argc, const char *argv[])
{
    int n;
	printf("输入杨辉三角的行数:");
	scanf("%d",&n);
	int arr[n][n]={0};
	arr[0][0]=arr[1][0]=arr[1][1]=1;
	for(int i=2;i<n;i++)
	{
		arr[i][0]=1;
		for(int j=1;j<i;j++)
		{
			arr[i][j]=arr[i-1][j-1]+arr[i-1][j];
		}
		arr[i][i]=1;
	}
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<i+1;j++)
		{
			printf("%d ",arr[i][j]);
		}
		putchar(10);
	}
    return 0;
}

6.输入一个n个元素的一维数组,计算最大的和,最大差(不允许使用排序)。提示:最大和=第一大值+第二大值,最大差=第一大值-最小值。

#include<stdio.h>
 
int main(int argc, const char *argv[])
{
    int n;
	printf("请输入n的值:");
	scanf("%d",&n);
	int arr[n];					//定义一个n个元素的一维数组
	for(int i=0;i<n;i++)		//输入一个n个元素的一维数组
	{
		scanf("%d",&arr[i]);
	}
	int max=0,max2=0,min=0; 	//分别定义第一大值、第二大值、最小值的下标
	for(int i=1;i<n;i++)
	{
		if(arr[max]<arr[i])max=i;
		if(arr[min]>arr[i])min=i;
	}
    max2=min;     //把最小值下标赋值给第二大值下标,以防下标走到第一大值了
	for(int i=0;i<n;i++) 	//找第二大值下标
	{
		if(arr[max2]<arr[i])
		{
			if(i!=max)
			{
				max2=i;
			}
		}
	}
	int sum=arr[max]+arr[max2];
	int difference=arr[max]-arr[min];
	printf("最大和:%d,最大差:%d\n",sum,difference);
    return 0;
}

7.输入一个m行n列的二维数组,计算第二小值。

#include<stdio.h>
 
int main(int argc, const char *argv[])
{
    int m=0,n=0;
	printf("请分别输入m行n列的m和n的值:");
	scanf("%d %d",&m,&n);
	int arr[m][n];
	for(int i=0;i<m;i++)
	{
		for(int j=0;j<n;j++)
		{
			scanf("%d",&arr[i][j]);
		}
	}
	int min=0,min2=0; 	//定义下标
	for(int i=0;i<m*n;i++)		//找到第一小值
	{
		if(arr[min/m][min%n]>arr[i/m][i%n])min=i;
	}
	while(arr[min2/m][min2%n]==arr[min/m][min%n]&&min2<m*n)min2++; 	//如果初始下标是重复的第一小值则跳过,但下标不能越界
	for(int i=0;i<m*n;i++)		//找第二小值
	{
		if(arr[min2/m][min2%n]>arr[i/m][i%n]&&arr[min/m][min%n]<arr[i/m][i%n])min2=i;
	}
	printf("第二小值为:arr[%d][%d]=%d\n",min2/m,min2%n,arr[min2/m][min2%n]);
    return 0;
}

8.输入n个元素的一维数组,输入查找的key值。若key出现一次,则输出对应的下标;若没有出现,则提示不存在;若key出现多次,则提示出现的次数。

#include<stdio.h>
 
int main(int argc, const char *argv[])
{
    int n=0,key=0,num=0,index=0;
	printf("请输入n的数值:");
	scanf("%d",&n);
	int arr[n];
	printf("请输入一维数组的n个元素:\n");
	for(int i=0;i<n;i++)
	{
		scanf("%d",&arr[i]);
	}
	printf("请输入要查找的key值:");
	scanf("%d",&key);
	for(int i=0;i<n;i++)
	{
		if(arr[i]==key)
		{
			num++;
			index=i;
		}
	}
	switch(num)
	{
		case 0:
			printf("输入的值不存在\n");
			break;
		case 1:
			printf("存在且存在1个,下标为%d\n",index);
			break;
		default:
			printf("存在%d个\n",num);
			break;
	}
    return 0;
}

9.输入一个m行n列的二维数组,输出每一行的和,以及每一列的和。

#include<stdio.h>
 
int main(int argc, const char *argv[])
{
    int m=0,n=0;
	printf("请分别输入m行n列的m和n的值:");
	scanf("%d %d",&m,&n);
	int arr[m][n];
	int sumline[m]={0},sumrow[n]={0};
	for(int i=0;i<m;i++)
	{
		for(int j=0;j<n;j++)
		{
			scanf("%d",&arr[i][j]);
			sumline[i]+=arr[i][j];
			sumrow[j]+=arr[i][j];
		}
	}
	for(int i=0;i<m;i++)
	{
		printf("第%d行的和为%d\n",i+1,sumline[i]);
	}
	for(int i=0;i<n;i++)
	{
		printf("第%d列的和为%d\n",i+1,sumrow[i]);
	}
    return 0;
}

10.输入一个m行m列的二维数组,输出正对角线和反对角线的差。

#include<stdio.h>
 
int main(int argc, const char *argv[])
{
    int m=0;
	printf("请输入m的值:");
	scanf("%d",&m);
	int arr[m][m];
	int sum1=0,sum2=0;
	for(int i=0;i<m;i++)
	{
		for(int j=0;j<m;j++)
		{
			scanf("%d",&arr[i][j]);
			if(i==j)sum1+=arr[i][j];
			if(i==m-j-1)sum2+=arr[i][j];
		}
	}
	printf("正对角线和反对角线的差为%d\n",sum1-sum2);
    return 0;
}

11.输入一个2行3列的二维数组,实现转置(行列转换)。

#include<stdio.h>
 
int main(int argc, const char *argv[])
{
    int arr[2][3],arr2[3][2];
	for(int i=0;i<2;i++)
	{
		for(int j=0;j<3;j++)
		{
			scanf("%d",&arr[i][j]);
		}
	}
	for(int i=0;i<3;i++)
	{
		for(int j=0;j<2;j++)
		{
			arr2[i][j]=arr[j][i];	  //行列转换
			printf("%d ",arr2 [i][j]); //输出转置的数组
		}
		putchar(10);
	}
    return 0;
}

运算符练习题


1.设foat a=2,b=4,c=3;C语言表达式(1/2)+(a+b)*c的计算结果是?

答:结果是18。因为1/2的结果是0,整数和整数相处结果也是整数。


2.下述程序执行后的输出结果是?

main()
{
    int x='f';
    printf("%c\n",'a'+(x-'a'+1));
}

答:g。字符和整数想运算会转为ascall码值进行计算,输出使用的是%c格式符,输出ascall码值对应的字符。


3.执行语句“k=7>>1;”后,变量k的当前值是?

答:3。右移一位,有个窍门,右移1除2,左移1乘2,使用窍门还需注意取值范围。


4.若有宏定义:#defne MOD(x,y) x%y,则执行以下语句后的输出结果是?

int a=10,b=94;
printf("%d\n",MOD(b,a+4));

答:8。宏定义是在预处理阶段实现文本替换,不会先进行计算,所以会输出b%a+4的值。


5.下列程序段运行后,x的值是? 

int a=1;b=2;x=0;
if(!(--a))x--;
if(!b)x=7;else ++x;

答:0。


                                                      

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值