学习笔记12:程序设计基础(C)实验(数组)

【描述】
输入10个整数,存放在一维数组中,找出值最大和最小的元素,输出最大值、最小值及它们所在的元素下标。
【输入】
输入10个整数,整数以空格间隔。
【输出】
第一行输出最大值及其所在的元素下标,最大值和下标以空格间隔。
第二行输出最小值及其所在的元素下标,最小值和下标以空格间隔。
【输入示例】
1 3 5 7 9 6 0 8 2 4
【输出示例】
9 4
0 6
【来源】
《程序设计基础——以C为例》第6章上机实验题1。

#include<stdio.h>
#include<stdlib.h>
int main(void){
    
    
    int max,min;
    int maxindex=0,minindex=0;
    int a[10];
    int i;
    for(i=0;i<=9;i++){
    
    
        scanf("%d",&a[i]);
    }
    min=a[0];
    max=a[0];
    for(int i=1;i<=9;i++){
    
    
        if(a[i]>max){
    
    
            max=a[i];
            maxindex=i;
        }
        else if(a[i]<min){
    
    
            min=a[i];
            minindex=i;
        }
    }
    printf("%d %d\n",max,maxindex);
    printf("%d %d\n",min,minindex);
    return 0;
}


【描述】
输入一个十进制正整数,将它转换为二进制整数并输出。
【输入】
输入一个十进制正整数。
【输出】
输出对应的二进制整数。
【输入示例】
123
【输出示例】
1111011
【提示】
利用循环将十进制整数n转换为二进制数的思路是:反复地将n除以2取余数;将取出的余数用数组存放;由于先取出的是低位数据,后取出的是高位数据,因此需将数组逆序输出。
【来源】
《程序设计基础——以C为例》第6章上机实验题2。

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
int main()
{
    
    
    int n;
    scanf("%d",&n);
    int t=n;
    double sum=0;
    int i=0,j,k=0;

    while(t!=0)
    {
    
    
        t/=2;
        i++;
        //printf("i=%d\n",i);
    }
    double *a=(double *)malloc(sizeof(double)*i);
    while(n!=0)
    {
    
    

        a[k]=n%2;
        n/=2;
        k++;
    }
    for(j=i-1;j>=0;j--)
    {
    
    
        sum=sum*10+a[j];
        //printf("a[%d]=%d\n",j,a[j]);
    }
printf("%.0f",sum);
    return 0;
}

【描述】
给定一组整数,用数组保存整数,实现对数组中的数循环移动。假定共有n个整数,则要使前面各数顺序向后移m个位置,并使最后m个数变为最前面的m个数。
要求只用一个数组的方式实现,一定要保证在输出结果时,输出的顺序和数组中数的顺序是一致的。
【输入】
第一行包含一个正整数n(n≤100)和一个正整数m(m≤n),n和m以空格间隔。
第二行包含n个正整数,整数以空格间隔。
【输出】
依次输出经过循环移动后数组中元素值,元素值以空格间隔。最后一个元素后面没有空格。
【输入示例】
11 4
15 3 76 67 84 87 13 67 45 34 45
【输出示例】
67 45 34 45 15 3 76 67 84 87 13

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>//malloc要用
#include<math.h>
int main(void){
    
    
    int n,m;
    int i;
    int index;
    int t;
    scanf("%d %d",&n,&m);
    int *a=(int *)malloc(sizeof(int)*n);
    for(i=0;i<=n-1;i++){
    
    
        if(i+m>n-1){
    
    
            index=abs(i+m-n);
        }
        else{
    
    
            index=i+m;
        }
        scanf("%d",&a[index]);
    }
    for(i=0;i<=n-1;i++){
    
    
        printf("%d",a[i]);
        if(i!=n-1){
    
    
            printf(" ");
        }
    }
    free(a);
    return 0;
}

【描述】
输入n个正整数(无序的),找出第k大的数。注意,第k大的数意味着从大到小排在第k位置的数。
【输入】
n(n≤100)
k
a1 a2 a3 a4 … an
输出
b
【输入示例】
5
2
32 3 12 5 89
【输出示例】
32

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
int main(void)
{
    
    
    int n, k;
    int t;
    scanf("%d %d",&n,&k);
    int *a=(int *)malloc(sizeof(int)*n);//分配
    for(int i=0;i<=n-1;i++)
    {
    
    
        scanf("%d",&a[i]);
        //printf("a[%d]=%d\n",i,a[i]);
    }
    for(int i=0;i<=n-2;i++)
    {
    
    
        for(int j=0;j<n-i-1;j++)//冒泡排序
        {
    
    

            if(a[j]<a[j+1])
            {
    
    
                t=a[j];
                a[j]=a[j+1];
                a[j+1]=t;
            }
            //printf("a[%d]=%d\n",j,a[j]);
        }
    }
        printf("%d",a[k-1]);
        free(a);//释放
return 0;
}


【描述】
输入一个正整数n(2≤n≤10)和n×n矩阵a中的元素,如果a是上三角矩阵,输出“Yes”,否则输出“No”。
【输入】
第一行为正整数n,表示矩阵大小。
接着n行,每一行n个整数,整数以空格间隔。
【输出】
输出“Yes”或“No”。
【输入示例】
3
3 4 5
1 2 3
1 3 4
【输出示例】
No
【提示】
用二维数组表示n×n矩阵时(i表示行下标,j表示列下标),则:
主对角线i==j,副对角线i + j == n – 1
上三角矩阵i<=j
下三角矩阵i>=j
【来源】
《程序设计基础——以C为例》第6章上机实验题5。

#include<stdio.h>
int main(void){
    
    
    int i,j;
    int a[10][10];
    int n;
    int flag=0;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
    
    
        for(j=0;j<n;j++){
    
    
            scanf("%d",&a[i][j]);
        }
    }
    for(i=0;i<n;i++)
    {
    
    
        for(j=0;j<i;j++){
    
    
            if(a[i][j]!=0){
    
    	//找0就完事了
                flag=1;	//有0吗
                break;
            }
        }
    }
    if(flag==1){
    
    
        printf("No");
    }
    else{
    
    
        printf("Yes");
    }
}

【描述】
输入一个4×4的整数矩阵,求该矩阵的外围元素之和,主对角线元素之和以及副对角线元素之和。
【输入】
输入一个4×4的整数矩阵。
分4行,每行4个整数,整数之间以空格间隔。
【输出】
分行输出矩阵的外围元素之和,主对角线元素之和以及副对角线元素之和。
【输入示例】
1 2 4 5
6 7 8 9
0 1 2 3
4 5 6 7
【输出示例】
52
17
18
【提示】
求三类元素的和,可以定义三个不同的和变量,在遍历数组元素的循环中通过三次条件判断分别进行三类元素的求和。设行下标为i,列下标为j,考察三类元素的下标特征,外围元素要么行下标i == 0或者i == n - 1(这里n为4),要么列下标j ==0或者j == n - 1;主对角线上的元素行下标和列下标相等(i == j);副对角线上的元素行下标和列下标之和等于n - 1(i + j == n - 1)。
【来源】
《程序设计基础——以C为例》第6章上机实验题6。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    
    
    int a[4][4];
    int sum1=0;
    int sum2=0;
    int sum3=0;
    for(int i=0;i<=3;i++)
    {
    
    
        for(int j=0;j<=3;j++)
        {
    
    
            scanf("%d",&a[i][j]);
            if(i==0 || j==0|| i==3||j==3)//边框排除大法
            {
    
    
                sum1+=a[i][j];
            }
            if(i==j)
            {
    
    
                sum2+=a[i][j];
            }
            if(i+j==3)
            {
    
    
                sum3+=a[i][j];
            }

        }
    }
    printf("%d\n%d\n%d",sum1,sum2,sum3);
    return 0;
}


【描述】
以左下三角的形式输出杨辉三角形。
【输入】
输入一个正整数n(n≤10)。
【输出】
输出n行杨辉三角形。每个数宽度为4。
【输入示例】
5
【输出示例】

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
【提示】
以左下三角的形式输出杨辉三角形,用主对角线作为0元素和非0元素的分界线。假设i和j分别表示二维数组的行、列下标。
①三角形两条腰上的元素均为1。两条腰一个为第0列,一个为主对角线。
②除两腰外,三角形覆盖的其余元素等于其两肩元素之和(上一行前一列元素和上一行同一列元素之和)。
【来源】
《程序设计基础——以C为例》第6章上机实验题8。

#include<stdio.h>
int main(void){
    
    
	int a[11][11]={
    
    0};
	int i,j,p;
	int sum1,sum2;
	int n;
	int x=1;
	int y=1;
	a[1][1]=1;
        scanf("%d",&n);
	for(p=0;p<10;p++){
    
    
		a[p][0]=1;
	}
	for(i=2;i<=n-1;i++){
    
    
        for(j=1;j<=i;j++){
    
    
            sum1=j;
            sum2=i;
            while(sum1>0){
    
    	//排列组合懂得都懂
                x*=sum1;    //被除数
                y*=sum2;    //除数
                sum1--;
                sum2--;
            }
            a[i][j]=y/x;
            y=1;
            x=1;
        }
    }
    for(int s=0;s<=n-1;s++){
    
    
        for(int m=0;m<=s;m++){
    
    
            printf("%4d",a[s][m]);
        }
        printf("\n");
    }
	return 0;
	}

【描述】
编写一个函数:int swap(int array [5][5], int n, int m ),输入参数是5×5的二维数组,和n、m两个行下标。功能:判断n、m是否在数组范围内,如果不在,则返回0;如果在范围内,则将n行元素与m行元素交换,并返回1。
在main函数中, 创建一个5×5的矩阵,输入矩阵数据,并输入n、m的值。调用前面的函数。如果返回值为0,输出error。如果返回值为1,输出交换n、m行后的新矩阵。
【输入】
5×5矩阵的数据,以及n和m的值。
【输出】
如果不可交换,则输出error;如果可交换,则输出新矩阵。
【输入示例】
1 2 2 1 2
5 6 7 8 3
9 3 0 5 3
7 2 1 4 6
3 0 8 2 4
0 4
【输出示例】

3 0 8 2 4
5 6 7 8 3
9 3 0 5 3
7 2 1 4 6
1 2 2 1 2
【提示】
输出error格式如下:
printf(“error\n”);
输出矩阵元素格式如下:
printf("%4d", num);
输出矩阵一行后要换行:
printf("\n");

#include <stdio.h>
int swap(int array[5][5], int n, int m);
int main(void) {
    
    
    int i, j;
    int n, m, flag;
    int array[5][5];
    for(i = 0; i < 5; ++i) {
    
    
	for(j = 0; j < 5; ++j) {
    
    
    	    scanf("%d", &array[i][j]);
    	}
    }
    scanf("%d%d", &n, &m);
    flag = swap(array, n, m);
    if(flag) {
    
    
    	for(i = 0; i < 5; ++i) {
    
    
            for(j = 0; j < 5; ++j) {
    
    
                 printf("%4d", array[i][j]);
            }
            printf("\n");
        }
    }
    else
        printf("error\n");
    return 0;
}
/* 请在下面编写swap函数 */
int swap(int array[5][5], int n, int m){
    
    
    int t,i;
if(n>4||n<0||m>4||m<0){
    
    
    return 0;
}
else{
    
    
        for(i=0;i<=4;i++)
        {
    
    
            t=array[n][i];
            array[n][i]=array[m][i];
            array[m][i]=t;
        }
        
    return 1;
}
}

【描述】
拍摄的一张CT照片用一个二维数组来存储,假设数组中的每个点代表一个细胞。每个细胞的颜色用0到255之间(包括0和255)的一个整数表示。定义一个细胞是异常细胞,如果这个细胞的颜色值比它上下左右4个细胞的颜色值都小50以上(包括50)。数组边缘上的细胞不检测。现在的任务是,给定一个存储CT照片的二维数组,写程序统计照片中异常细胞的数目。
【输入】
第一行包含一个整数n(2 < n <= 100)。
下面有n行,每行有n个0~255之间的整数,整数以空格间隔。
【输出】
输出一个整数,即异常细胞的数目。
【输入示例】
4
70 70 70 70
70 10 70 70
70 70 20 70
70 70 70 70
【输出示例】
2

#include <stdio.h>
#include <stdlib.h>
int main()
{
    
    
    int n;
    scanf("%d",&n);
    int a[255][255];
    int sum=0;
    for(int i=0;i<=n-1;i++){
    
    
            for(int j=0;j<=n-1;j++){
    
    
                scanf("%d",&a[i][j]);
            }
    }
    for(int i=1;i<=n-2;i++){
    
    
        for(int j=1;j<=n-2;j++){
    
    
            if((a[i-1][j]-a[i][j])>=40 || (a[i][j-1]-a[i][j])>=40 || (a[i][j+1]-a[i][j])>=40 || (a[i+1][j]-a[i][j])>=40)
            {
    
    
                sum++;
            }
        }
    }
    printf("%d",sum);
    return 0;
}


【描述】
中位数定义:一组数据按从小到大的顺序依次排列,处在中间位置的一个数或最中间两个数据的平均值(如果这组数的个数为奇数,则中位数为位于中间位置的那个数;如果这组数的个数为偶数,则中位数是位于中间位置的两个数的平均值)。
给出一组无序整数,求出中位数,如果求最中间两个数的平均数,向下取整即可(不需要使用浮点数)。
【输入】
包含多组测试数据,每一组测试数据的第一行为n,代表该组测试数据包含的数据个数,1 <= n <=10000。
接着n行为n个数据。n为0时结束输入。
【输出】
输出中位数,每一组测试数据输出一行。
【输入示例】
4
10
30
20
40
3
40
30
50
4
1
2
3
4
0
【输出示例】
25
40
2

#include <stdio.h>
#include <stdlib.h>
int main(void){
    
    
    int a[10000];//1~10000个数
    int n=0;
    int t;
	int z[10000];
    int m=0;
    do{
    
    
    	scanf("%d",&n);
    	for(int i=0;i<=n-1;i++){
    
    
    		scanf("%d",&a[i]);
    		//printf("a[%d]=%d\n",i,a[i]);
		}
		
    	for(int j=0;j<=n-2;j++){
    
    
    	for(int k=0;k<=n-j-1;k++){
    
    
    		if(a[j]>a[j+1]){
    
    
    			t=a[j];
    			a[j]=a[j+1];
    			a[j+1]=t;
			}
		}
	}

	//printf("a[0]=%d\n",a[0]);
	if(n%2==0){
    
    
		z[m]=(a[n/2-1]+a[n/2])/2; 
		m++;
	}
	
	else{
    
    
		z[m]=a[n/2];
		//printf("z[%d]=%d\n",m,a[n/2]);
		m++;
	}
	}while(n!=0);
	//printf("m=%d\n",m);
	for(int s=0;s<=m-2;s++){
    
    	//输出 
		printf("%d\n",z[s]);//这个在istudy,有一个测试案例过不了,不知道错哪里了,裂开了
	}
    return 0;
}

错误之处,还望指出,感激不尽

猜你喜欢

转载自blog.csdn.net/qq_49868778/article/details/111304492
今日推荐