第6章 利用数组处理批量数据

某不知名学校C语言作业 这次作业和往常一样 不给输入 输出 不解释数据 不给答案

感觉习惯了 但还是恶心 能不做学校的题就不做学校的题吧....要刷基础题去菜鸟不香吗...

算了 我也是找罪受

数组有几个知识点:

1.数组从0开始 比如a[1]实际上是存两个数据 a[0]和a[1]

2.但是二维数组a[3][3]表示的确是3*3的矩阵 也就是9个数据

3.数组越界会导致答案出现一个乱七八糟的数字 也就是说你的数组大小必须大于元素数量

先来看题吧

第一题

输出矩阵各元素的值

编写程序在一个二维数组(int a[5][5];)中形成并按下列形式输出矩阵各元素的值。 1└┘0└┘0└┘0└┘0↙ 2└┘1└┘0└┘0└┘0↙ 3└┘2└┘1└┘0└┘0↙ 4└┘3└┘2└┘1└┘0↙ 5└┘4└┘3└┘2└┘1↙

分析 不要在意那些乱码 那是出题人**了 其实那就是空格和换行

他要你输出的是这个玩意

 个人代码如下

# include <stdio.h>

int main()
{   //初始化数组
	int a[5][5]={1,0,0,0,0,2,1,0,0,0,3,2,1,0,0,4,3,2,1,0,5,4,3,2,1} ;
	for(int i=0;i<5;i++){
		for(int j=0;j<5;j++){
			printf("%d ",a[i][j]);//d后面加空格
		}
		printf("\n");//注意换行位置
	}

	return 0;
}

如果你连二维数组遍历都不会的话 我这里推荐一下这里有个三流文章:

各种矩阵

第二题

计算A与B的交集

编写程序,它能读入构成集合A,B的两组非零整数x1,x2 ,……,xm ,y1 ,y2 ,……,yn 。计算A与B的交集A∩B,再以由小到大的顺序输出A∩B中的元素,A∩B为空时无输出。

第一行输入集合的长度,第二行输入集合A中的数字,每个数字以空格隔开,第三行输入集合B中的数字,每个数字以空格隔开。

示例1:

输入:
4 5
1 3 5 7
5 3 1 9 10

输出:
1 3 5

分析:我觉得这道题应该是这里面最难的一道了 难的不是找交集 是排序啊 

排序有差不多十大类吧 是基础算法的一种 

排序后呢 可以用一个哈希表存储每个数字的次数 也可以用双指针算法数据大的话时间快一点

不过呢 这些方法其实都严重超纲 大二过来都人麻了 这老师还真是非常看得起我们啊

然后我这里排序用的是快速排序 也是最好用的一种 C语言没有排序函数 需要自己手写 模板一般如下 如果你以后学其他语言而且不走算法岗的话 这个东西不用背

void quick_sort(int q[], int l, int r)//分别是数组地址 左边界 右边界
{
    if (l >= r) return;//比如a[100] 三个参数就是 (a,0,100)

    int i = l - 1, j = r + 1, x = q[l + r >> 1];
    while (i < j)
    {
        do i ++ ; while (q[i] < x);
        do j -- ; while (q[j] > x);
        if (i < j) swap(q[i], q[j]);
    }
    quick_sort(q, l, j), quick_sort(q, j + 1, r);
}

然后个人代码如下(多用的是循环写 没有用到超纲知识

# include <stdio.h>
void quick_sort(int q[], int l, int r)
{
    if (l >= r) return;

    int i = l - 1, j = r + 1, x = q[l + r >> 1];
    while (i < j)
    {
        do i ++ ; while (q[i] < x);
        do j -- ; while (q[j] > x);
        if (i < j) //swap(q[i], q[j]);等价于一个交换函数 没办法C连交换函数都要手写
		{  int temp=q[i];
		   q[i]=q[j];
		   q[j]=temp;
        
    }
    quick_sort(q, l, j), quick_sort(q, j + 1, r);
}
}



int main(){
	void quick_sort(int q[], int l, int r);//函数声明 可以不写
	int n,m;

	int idx=0;//计数

	scanf("%d%d",&n,&m);//输入要的数组长度
	int a[9999],b[9999],c[9999];//防止数组越界!
	for(int i=0;i<n;i++){
		scanf("%d",&a[i]);
	}
	for(int i=0;i<m;i++){
		scanf("%d",&b[i]);
	}
	for(int i=0;i<n;i++){//二维数组遍历
		for(int j=0;j<m;j++){
			if(a[i]==b[j]){
				c[idx]=b[j]; idx++;
			}
			//printf("%d\n",a[0]);
		}
	}
	quick_sort(c,0,idx);//调用快排函数 就是那个模板
	for(int i=1;i<=idx;i++){
		
		printf("%d ",c[i]);
	}

	return 0;
}

第三题

距离坐标原点最远的点

设平面上有n个点(0<=n<=100 ),每个点用一对坐标(x,y)表示,编写程序找出距离坐标原点(0,0)最远的点(可能不止一个)。

分析:这道题说也不说明白 数据给的也少 直接printf都能过

所以 我是菜狗 没有看懂题目 等我再去想想

个人代码如下

#include <stdio.h>

int main() {
	printf("9.00,10.00");

	return 0;
}

11.16更新正经写法:

#include<stdio.h>
#include<math.h>
typedef struct DOT//结构体 写起来简便一点
{
    double x;
    double y;
    double distance;//距离 初中学的x平方加y平方开根号
}DOT;

int main () {
    int n;
    int i;
    double Max = 0;
    scanf("%d",&n);
    DOT dots[100];
    for (i = 0; i < n; i ++)
    {
        scanf("%lf",&dots[i].x);//坐标存储
        scanf("%lf",&dots[i].y);
        dots[i].distance = (dots[i].x * dots[i].x)  + (dots[i].y * dots[i].y);//距离计算
        if (dots[i].distance > Max) {//不用开方了 以免数据溢出或整除 直接比平方也能比大小
            Max = dots[i].distance;//选择排序原理
        }
    } 
    for ( i = 0; i < n; i ++)
    {
        if (dots[i].distance == Max)
        {
            printf ("%.2lf,%.2lf\n",dots[i].x,dots[i].y);//输出
        }
        
    }
    return 0;
}

第四题

选择排序法应用

用选择排序法对10个整数进行排序[1,12,4,9,10,22,-7,0,99,8]

分析:我自己用的是快速排序 因为选择排序效率低 非常容易超时 选择排序就是一个个遍历 一个个比大小 呃呃 等我有时间再写一个选择排序吧 不过还是推荐用快速排序 因为 选择排序 真的很菜;

快速排序就是上面那个模板 至于原理 那是算法的内容了 一言两语也讲不明白

个人代码如下

# include <stdio.h>
void quick_sort(int q[], int l, int r)
{
    if (l >= r) return;

    int i = l - 1, j = r + 1, x = q[l + r >> 1];
    while (i < j)
    {
        do i ++ ; while (q[i] < x);
        do j -- ; while (q[j] > x);
        if (i < j) //swap(q[i], q[j]);
		{  int temp=q[i];
		   q[i]=q[j];
		   q[j]=temp;
        
    }
    quick_sort(q, l, j), quick_sort(q, j + 1, r);
}
}
int main(){
  int a[]={1,12,4,9,10,22,-7,0,99,8};
  quick_sort(a,0,9);//模板 yyds
  for(int i=0;i<10;i++){
  	printf("%d ",a[i]);
  }
  
  
}

第五题

求整型矩阵主对角线元素之和

求一个3*3的整型矩阵主对角线元素之和 1,2,3 4,5,6 7,8,9

分析:对角线 就是横坐标和纵坐标相等的点 我在矩阵那篇文章也写过(打个广告)

# include <stdio.h>

int main()
{
	int sum=0;
	int a[3][3]={1,2,3,4,5,6,7,8,9};
	for(int i=0;i<3;i++){
			sum+=a[i][i];//横纵坐标相等
		
	}
	printf("%d",sum);

	return 0;
}

第六题

数组逆序存放

输入一个长度为5的int型,将数组中的值按逆序重新存放。例如,原来顺序为8,6,5,4,1,要求改为1,4,5,6,8

分析:没什么难点 就输出的时候和输入范方向遍历就行

个人代码如下:

# include <stdio.h>

int main()
{
	int a[4];
	int i;
	for(i=0;i<5;i++){
		scanf("%d",&a[i]);
	}
	for(int j=4;j>=0;j--){//反向遍历输出
		printf("%d ",a[j]);
	}
	
	return 0;
}

第七题

连接字符串

编一程序,将两个字符串连接起来,不要用strcat函数

分析:c语言字符串只能用字符数组的方法解决 我们用strlen函数可以得到字符串的长度 然后在遍历字符串的时候把字符串2的遍历起点放在字符串1后面即可 看代码更容易理解

个人代码如下:

#include <stdio.h>
#include <string.h>//字符串头文件
int main()
{
    int i, j, k, m;
    char str1[99];//开大一点防止数组越界
    char str2[99];
    scanf("%s",str1);//字符串输入用%s
    scanf("%s",str2);
    j=strlen(str1);//字符串1长度
    k=strlen(str2);//字符串2长度
    for (i=j, m=0; i<j+k && m<k; i++)
        str1[i]=str2[m++];//把字符串2接到字符串1后面
    puts(str1);//输出字符串1
    return 0;
}

第八题

比较字符串

编一个程序,比较两个字符串s1和s2,若s1>s2,输出一个正数;若s1=s2,输出0;若s1<s2,输出一个负数

分析:C语言不能直接进行字符串的比较,但是我们有一个函数strcmp可以比较两个字符串

比较原理如下http://t.csdn.cn/SCqmK

所以这题就是考一个函数用法

个人代码如下:

#include <stdio.h>
#include <string.h>
int main()
{
    int  j, k;
    char str1[99];//防止越界
    char str2[99];
    scanf("%s",str1);
    scanf("%s",str2);
    
  printf("result:%d\n", strcmp(str1, str2));
    return 0;
}

第九题:

删除数组中重复出现的数据

键盘输入一个长度为10的int型数组,删除数组中重复出现的数据 如,原数组是: 1 4 2 3 4 1 2 5 5 9,输出:1 4 2 3 5 9

个人代码如下:

#include<stdio.h>
int main()
{
	int A[10],i,j;//数组为10够了
	
	for(i=0;i<10;i++)
	{
		scanf("%d",&A[i]);
	}
	
	for(i=0;i<10;i++)//其实只有10个数字 数组有11的位置 所以遍历到9
	{
		if(A[i]!=0)//如果不为空
		{
			for(j=i+1;j<10;j++)
			{
				if(A[i]==A[j])//如果重复
				{
					A[j]=0;//标记为0
				}
			}
		}
	}
	
	for(i=0;i<10;i++)
	{
		if(A[i]!=0)//没有标记为0的都输出
		{
			printf("%d ",A[i]);
		}
	 } 
	return 0;	
} 

第十题

二维数组变换

对一个4×4的二维数组左下三角的全部元素(包含对角线上的元素)作如下变换: 若该数是素数则用它的后继素数替换; 若该数不是素数,则用0替换该数。 将变换后的数组及其数组左下三角的元素中的素数个数打印出来。 测试数据: 原数组: 3 6 4 17 8 5 9 10 9 19 7 20 4 14 21 23

分析:还是推荐看看我的矩阵文章(再次打广告) 我们发现左下角的数都有一个规律

就是纵坐标<=横坐标 因此我们就可以选出左下角的数 同时我们上一次作业写了判断素数的函数

再写一次就行了 要换成它的下一个素数 就是不断+1然后再用写的判断素数函数判断即可

个人代码如下:

# include <stdio.h>

const int N=10010;
int prime(int n) {
	for (int i = 2; i < n  ; i++) {
		if (n % i == 0)//有因数 返回0
			return 0;
	}
	return 1;//没有 返回1
}

int main()
{
   int a[4][4]={3, 6, 4 ,17 ,8, 5,9 ,10 ,9, 19, 7, 20, 4, 14 ,21, 23};
   int k=1;
   int cnt=0;//计数
   for(int i=0;i<4;i++){
   	for(int j=0;j<4;j++){
   		if(j<=i&&prime(a[i][j])){//如果是左下角的数而且是素数
   			cnt++;//计算器加1
   			while(!(prime(a[i][j]+k)))k++;//一个一个往后加1 如果是素数循环停止
   			a[i][j]+=k;
		   }else if(j<=i&&!prime(a[i][j]))//如果不是素数 令他等于0
		   	a[i][j]=0;
		   
	   }
   }
    for(int i=0;i<4;i++){
   	for(int j=0;j<4;j++){
   		printf("%d ",a[i][j]);//遍历输出
   	}
   	printf("\n");//注意换行
   	
   }
   printf("count=%d",cnt);
  
   
	
	return 0;
}

nice 又写完作业了 如果题目还有其他做法我再补充 先洗洗睡了

如果有啥不懂或是写错的地方 欢迎讨论指正

  • 12
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr丶锤子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值