C语言练习2 之数组

C语言练习2 之数组

矩阵

标题:
矩阵

问题描述
请写一个程序,对于一个m行m列(2<m<20)的方阵,求其每一行、每一列及主、辅对角线元素之和,然后按照从大到小的顺序依次输出这些值。
注:主对角线是方阵从左上角到右下角的一条斜线,辅对角线是方阵从右上角到左下角的一条斜线。

输入说明
输入数据的第一行为一个正整数m;
接下来为m行、每行m个整数表示方阵的元素。

输出说明
从大到小排列的一行整数,每个整数后跟一个空格,最后换行。

输入样例
4
15 8 -2 6
31 24 18 71
-3 -9 27 13
17 21 38 69

输出样例
159 145 144 135 81 60 44 32 28 27

#include<stdio.h>
int main()
{
	int m;
	scanf("%d",&m);
	int a[m][m],b[2*m+2]={};//定义
	for(int i=0;i<m;i++)//输入
	for(int j=0;j<m;j++)
	{
		scanf("%d",&a[i][j]);
	}
	for(int i=0;i<m;i++)//计算
	for(int j=0;j<m;j++)
	{
		b[i]+=a[i][j];
		b[i+m]+=a[j][i];
	}
	for(int i=0;i<m;i++)
	{
		b[2*m+0]+=a[i][i];
		b[2*m+1]+=a[i][m-i-1];
	}
	int i,j,t=0;
    for(j=0;j<2*m+1;j++)//排序
	for(i=0;i<2*m+1-j;i++)
	if(b[i]<b[i+1])
	{
	t=b[i];
	b[i]=b[i+1];
	b[i+1]=t;
	}
	for(i=0;i<2*m+2;i++)//打印
	printf("%d ",b[i]);
	printf("\n");
	
	return 0;
	
 } 

等差数列

标题
等差数列

问题描述
 请写一个程序,判断给定整数序列能否构成一个等差数列。

输入说明
 输入数据由两行构成,第一行只有一个整数n(n<100),表示序列长度(该序列中整数的个数);
第二行为n个整数,每个整数的取值区间都为[-32768~32767],整数之间以空格间隔。

输出说明
 对输入数据进行判断,不能构成等差数列输出“no”,能构成等差数列输出表示数列公差(相邻两项的差)的绝对值的一个整数。

输入样例
样例1输入
6
23 15 4 18 35 11
样例2输入
5
2 6 8 4 10
输出样例
样例1输出
no
样例2输出
2

//思路:先排序,后判断是否等差
#include<stdio.h>
int main()
{
	int n,u;
	scanf("%d",&n);
	int a[n],m;
	for(int i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
	}
	
	int i,j,t=0;
    for(j=0;j<n-1;j++)
	for(i=0;i<n-1-j;i++)
	if(a[i]>a[i+1])
	{
	t=a[i];
	a[i]=a[i+1];
	a[i+1]=t;
	}
	
	m=a[1]-a[0];
	for(int r=1;r<n;r++)
	{
		if(a[r]-a[0]==r*m)
		u=1;
		else
		u=0;
		if(u==0)
		break;
	}
	if(u==1)
	printf("%d",m);
	else if(u==0)
	printf("no");
}

数值求和–二维数组练习

标题
数值求和

描述
输入整数N(N≤20),输入二维矩阵A[N] [N]各元素值,计算所有对角线元素的和,每一元素只加一次,输出结算结果。

输入说明
输入整形数据N和N×N矩阵各元素值,如2和矩阵元素A={1,2,3,4}。

输出说明
格式输出:输出计算结果。

输入样例
2
1 2
3 4

输出样例
10

提示
采用重循环结构实现计算过程,所有对角线元素只加一次。

//注意对角线元素只加一次,因此需要判断是奇数二维矩阵还是偶数二维矩阵
#include<stdio.h>
int main()
{
	int m,b=0,t=0;
	scanf("%d",&m);
	int a[m][m];
	for(int i=0;i<m;i++)
	for(int j=0;j<m;j++)
	scanf("%d",&a[i][j]);
	if(m%2==1)
	{
	t=a[(m+1)/2-1][(m+1)/2-1];
	b=t;
	a[(m+1)/2-1][(m+1)/2-1]=0;
	}
	
	for(int i=0;i<m;i++)
	{
		b+=a[i][i];
		b+=a[i][m-i-1];
	}
	printf("%d",b);
}

转换排序–数组中的元素排序练习

标题
转换排序

描述
输入一维字符数组str[N](N≤80),查找出其中小写字母并转换成大写字母,按下面方式排序:1、只对大写字母进行排序;2、其他字符原位保持不动;3、转换后的各大写字母由小到大排序。输出排序后的结果。

输入说明
输入一行字符数据str[N](N≤80)。

输出说明
格式输出:输出仅对转换后的大写字母排序结果,其他字符原位不动输出。

输入样例
xA3T7p

输出样例
AP3T7X

提示
注意转换方式和排序要求。

#include<stdio.h>
#include<string.h>
int main()
{
	int n,i,j,m;
	char a[80],c[80],k;
	gets(a);
	n=strlen(a);
	for(i=0,j=0;i<n;i++)
	{
	if(a[i]>=97&&a[i]<=122)
	c[j++]=a[i]-32;
	else if(a[i]>=65&&a[i]<90)
	c[j++]=a[i];
	}
	m=strlen(c);
	for(i=0;i<m-1;i++)
	for(j=i+1;j<m;j++)
	if(c[i]>c[j])
	{
		k=c[i];
		c[i]=c[j];
		c[j]=k;
	}
	for(i=0,j=0;i<n;i++)
	if(a[i]<=64||a[i]>122||(a[i]<97&&a[i]>90))
	putchar(a[i]);
	else putchar(c[j++]);
	
	return 0} 

最值位置–数组数列元素查询练习

标题
最值位置

描述
输入整数N(N≤80),输入一维行向量A[N]各元素值,查找出其中最大值并记录位置信息,输出N、最大值和位置信息, 数据之间空一格空格。

输入说明
输入整形数据N和行向量各元素值,如8和行向量元素A={1,2,3,4,5,6,7,8}。

输出说明
格式输出:输出N、最大值和位置信息,数据之间空一格。

输入样例
8
1 2 3 4 5 6 7 8

输出样例
8 8 7

提示
采用重循环结构实现计算过程,输出数据之间空一格。

#include<stdio.h>
int main()
{
	int n,m,k=0;
	scanf("%d",&n);
	int a[n];
	for(int i=0;i<n;i++)
	scanf("%d",&a[i]);
	m=a[0];
	for(int i=0;i<n;i++)
	{
		if(a[i]>m)
		{
		m=a[i];
		k=i;
		}
	}
		printf("%d %d %d",n,m,k);
		return 0;
}

矩阵对角线求和

题目:3*3矩阵对角线求和

问题描述:
求一个 的整型矩阵对角线元素之和。
输入说明:
输入3*3的整型矩阵。
输出说明:
输出一个整数,即对角线的和。
输入样例:
1 2 3
4 5 6
7 8 9
输出样例:
15

//这道题目自身描述有很大的问题
#include<stdio.h>
int main()
{
	int a[3][3],s;
	for(int i=0;i<3;i++)
	for(int j=0;j<3;j++)
	scanf("%d",&a[i][j]);
	for(int i=0;i<3;i++)
	{
	s+=a[i][i];
	//s+=a[i][2-i];  // 这里描述不清楚,造成代码写出来有两种
	}
	printf("%d",s);
	return 0}

单词统计–字符数组练习

标题
单词统计

描述
输入字符串string[N](N≤100),各个单词以空格隔开,单词长度小于等于8,输入单词word[M](M≤8),在string中查找出相同的单词并统计该单词出现的次数信息,输出单词和出现次数的信息, 数据之间空一格空格。主函数输入字符串和待统计单词,编写函数count()实现统计和信息输出。

输入说明
输入一行字符以空格隔开各个单词,输入要统计的单词。

输出说明
格式输出:输出单词及其出现的次数信息,数据之间空一格。

输入样例
dog cat dog dog the abc dog hahe
dog

输出样例
dog 4

提示
采用重循环结构实现计算过程,输出数据之间空一格。

#include<stdio.h>
#include<string.h>
int main(void){
	char array[100][9];
	char str[1000];
	char flag[9]; 
	int i,num,index,count;
	gets(str);
	gets(flag);
	//提取单词
	num=index=0;
	for(i=0;i<strlen(str);i++){
		if(str[i]!=' '){
			array[num][index]=str[i];
			index++;
		}else{//碰到空格即为一个单词 
			array[num][index]='\0';
			num++;
			index=0; 
		}
	}
	array[num][index]='\0';//最后一个单词没有空格
	//统计次数 
	count=0;
	for(i=0;i<=num;i++){
		if(strcmp(array[i],flag)==0){
			count++;
		} 
	}
	printf("%s %d",flag,count); 
	return 0;
} 

字符删除–字符数组练习

标题
字符删除

描述
主函数中输入一个一维字符数组str[N](N≤50)和待删除字符ch,调用函数dele()完成内容:1、删除字符数组中的每个待删除字符;2、其它字符依次迁移;3、数组末尾加’\0’结束。

输入说明
输入一个一维字符数组和待删除字符。

输出说明
格式输出:输出处理后字符串。

输入样例
There are three men.
e
输出样例
Thr ar thr mn.

提示
字符串输入函数gets(),头文件string.h。

#include<stdio.h>
#include<string.h>
int main(void){
	char str[9999],a[9999],ch;
	int m=0;
	gets(str);
	scanf("%c",&ch);
	for(int i=0;i<strlen(str);i++)
	{
		if(str[i]==ch);
		else
		{
			a[m]=str[i];
			m++;
		}
	}
	a[m]='\0';
	printf("%s",a);
} 

奇偶排序–数组练习

标题
奇偶排序

描述
定义一个一维整形数组num[20],输入正整数N(N≤20)代表num的实际元素个数,输入N个任意整数到num中,编写函数sort()实现排序处理,完成前面奇数,后面偶数,分别从小到大排序。使用指针完成地址传递,主函数完成N、数组元素的输入和处理后的数组元素输出。

输入说明
输入正整数N(N≤20)和N个任意排列的整形到一维数组num中。

输出说明
格式输出:数据之间空一格,奇数和偶数分界处空三个空格。

输入样例
5
2 3 7 8 4

输出样例
3 7 2 4 8

提示
使用指针作形参,实现地址传递。
前面奇数、后面偶数,分别从小到大排序。
输出数据之间空一格,奇数和偶数分界处空三个空格。

#include<stdio.h>
void swap(int num[],int i,int j){
	int temp; 
	temp=num[i];
	num[i]=num[j];
	num[j]=temp;
}
int main(void){
	int n,i,j,temp,m;
	int num[20];
	scanf("%d",&n);
	for(i=0;i<n;i++){
		scanf("%d",&num[i]);
	}
	//排序
	for(i=1;i<n;i++){
		for(j=i;j>0;j--){
			if(num[j]%2==1&&(num[j-1]%2==0||(num[j-1]%2==1&&num[j]<num[j-1]))){
				swap(num,j,j-1);
			}else if(num[j]%2==0&&num[j-1]%2==0&&num[j]<num[j-1]){
				swap(num,j,j-1);
			}else{
				break;
			}
		}
	} 
	for(i=0;i<n;i++){
		if(num[i]%2!=0&&num[i+1]%2==0)
		m=i;
	}
	for(i=0;i<=m;i++)
	printf("%d ",num[i]);
	printf("  ");
	for(i=m+1;i<n;i++)
	printf("%d ",num[i]);
	return 0;
} 

最值交换–数组练习

标题
最值交换

描述
定义一个一维整形数组num[20],输入整数n(n≤20)和一个整形数列 (n个数),编写change()函数,查找出数列中的最大值和最小值,并把它们交换位置,主函数完成输入和输出,主函数输出处理后的数列,各元素之间空一个空格。指针进行地址传递,子函数实现查找最值和最值位置交换。

输入说明
输入整数n (n≤20)和一个整形数列 (n个数)。

输出说明
格式输出:输出处理后数列。

输入样例
5
2 3 1 5 8

输出样例
2 3 1 8 5

提示
使用指针作形参,实现地址传递。仅对最值进行交换。输出数据之间空一格。

#include<stdio.h>
void change(int *p, int num)
{
	int i = 0;
	int t=0,h=0;
	for (i = 1; i < num; i++)
	{
		if (p[t] < p[i])
		{
			t = i;
		}
		if (p[h] > p[i])
		{
			h = i;
		}
	}
	i = p[t];
	p[t] = p[h];
	p[h] = i;
}
int main()
{
	int num[20],N;
	scanf("%d",&N);
	for(int i=0;i<N;i++)
		scanf("%d",&num[i]);
	int *p =num;
	//int t = 0, h = 0;
	change(p, N);
	for (int i = 0; i < N; i++)
		{
		printf("%d ", p[i]);
		}
	return 0;
}

矩阵计算

编写程序,把3*3阶矩阵A加上矩阵A的转置,计算结果存放在矩阵B中并输出。

输入说明:输入矩阵A中的元素,数组元素用空格分隔,数组每行用换行分隔

输出说明:输出矩阵B,元素之间用空格分隔,数组每行用换行分隔

输入示例:
1 2 3
4 5 6
7 8 9

输出示例:
2 6 10
6 10 14
10 14 18

//这种写法也是一样的,相当于t[3][3]就为题干中描述的b数组,都是一个意思,我就懒得再写了
#include <stdio.h>
void fun(int a[][3]){
	int t[3][3];
	for(int i=0;i<3;i++){
		for(int j=0;j<3;j++){
			t[i][j]=a[j][i];
		}
	}
	for(int i=0;i<3;i++){
		for(int j=0;j<3;j++){
			a[i][j]=a[i][j]+t[i][j];
		}
	}
}
int main() {
	int a[3][3];
	for(int i=0;i<3;i++){
		for(int j=0;j<3;j++){
			scanf("%d",&a[i][j]);
		}
	}
	fun(a);
	for(int i=0;i<3;i++){
		for(int j=0;j<3;j++){
			printf("%d ",a[i][j]);
		}
		printf("\n");
	}
	return 0;
}

字符数组元素排序

从键盘输入一个字符串,将此字符串按字符的ASCII码值从小到大排序,并显示排序后的字符串。

输入说明:共一行,输入一个字符串

输出说明:共一行,输出排序后的字符串

输入样例:Fdjn4e5

输出样例:45Fdejn

#include <stdio.h>
#include <string.h>
int main(){
	char a[900];
	int n,l,j,k,i,tmp;
	scanf("%s",a);
	n = strlen(a);
	for(j=0;j<n-1;j++){//排序
		for(k=n-1;k>j;k--){
			if(a[k]<a[k-1]){
				tmp = a[k];
				a[k] = a[k-1];
				a[k-1] = tmp;
				}	
			}
		}
		for(i=0;i<n;i++){
			printf("%c",a[i]); 
		}

	return 0;
} 

欢迎打赏三连

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 创作都市 设计师:CSDN官方博客 返回首页