第七章 数组

本文展示了多个C语言程序,涵盖了数组的各种操作,包括元素移动、正负数计数、斐波那契数列计算、冒泡排序、矩阵转置、外围元素求和、平均成绩计算、鞍点查找、矩阵乘法、字符串操作、菱形图案打印、字符统计以及字符串连接。这些程序深入浅出地展示了数组、条件判断、循环和算法的应用。

7-1  输入组数的五个元素,并依次后移一个位置,再将第五个数据放在第一个存储位置

#include <stdio.h>

int main(void) { 
	int a[5],t,i;
	printf("原始序列为\r\n");
	for(i=0;i<5;i++){
	    scanf("%d",&a[i]);
	    printf("%d ",a[i]);
	}
	t=a[4];
	for(i = 4;i>0;i--){
	    a[i]=a[i-1];
	}
	printf("\n操作之后的序列为:\r\n");
	a[0]=t;
	for(i=0;i<5;i++){
	    printf("%d  ",a[i]);
	}
	return 0;
}
/*input
1 2 3 4 5
*/
/*
原始序列为
1 2 3 4 5 
操作之后的序列为:
5  1  2  3  4  
*/

7-2 求具有10个元素的一维数组中正数、负数及0 的个数

7-3 利用数组计算斐波那契数列的前20个数,并以每行5个数输出

        

#include <stdio.h>

int main(void) { 
	int i,f[20]={1,1};
	
	for(i=2;i<20;i++){
	    f[i]=f[i-1]+f[i-2];
	}
	for(i=0;i<20;i++){
	    if(i%5==0)
    	    printf("\n");
    	printf("%-6d  ",f[i]);
	}
	return 0;
}
/*input

*/
/*
1       1       2       3       5       
8       13      21      34      55      
89      144     233     377     610     
987     1597    2584    4181    6765     
*/

7-4  采用冒泡,对一维数组中的元素数据进行按小到大的排序

#include <stdio.h>

int main(void) { 
	int i,j,n,temp,a[10];
	scanf("%d",&n);
    printf("The original numbers:\r\n");
    for(i=0;i<n;i++){
        scanf("%d",&a[i]);
        printf("%d  ",a[i]);
    }
    for(i=0;i<n-1;i++){
        for(j=1;j<n-i;j++){
            if(a[j-1]>a[j]){
                temp=a[j-1];
                a[j-1]=a[j];
                a[j]=temp;
            }
        }
    }
    printf("\nthe sorted nember is:\r\n");
     for(i=0;i<n;i++){
        printf("%d  ",a[i]);
    }    
	return 0;
}
/*input
10
9 8 5 6 2 3 4 8 6 52
*/
/*
The original numbers:
9  8  5  6  2  3  4  8  6  52  
the sorted nember is:
2  3  4  5  6  6  8  8  9  52     
*/

7-5  将矩阵 a2*3转置后存入b3*2

#include <stdio.h>

int main(void) { 
	int i,j,a[2][3]={{1,2,3},{5,6,8}},b[3][2];
	
	printf("array a:\r\n");
	for(i=0;i<2;i++){
	    for(j=0;j<3;j++){
	        printf("%d  ",a[i][j]);
	        b[j][i]=a[i][j];
	        
	    }
	    printf("\r\n");
	}
	printf("array b:\r\n");
	for(i=0;i<3;i++){
	    for(j=0;j<2;j++){
	        printf("%d  ",b[i][j]);
	    }
	    printf("\r\n");
	}
	
	
	return 0;
}
/*input
NULL
*/
/*
array a:
1  2  3  
5  6  8  
array b:
1  5  
2  6  
3  8    
*/

7-6  求矩阵 C3*4所有外围元素之和

#include <stdio.h>

int main(void) { 
	int i,j,a[3][4]={{1,2,3,5},{5,6,8,8},{9,4,2,5}},sum=0;
	
	printf("array a:\r\n");
	for(i=0;i<3;i++){
	    for(j=0;j<4;j++){
	        printf("%d  ",a[i][j]);
	    }
	    printf("\r\n");
	}

	for(i=0;i<3;i++){
	    for(j=0;j<4;j++){
	        if(i==0 || i==2 ||j== 0 ||j==3)
	            sum+=a[i][j];
	 	}
	}
	printf("sum = %d  ", sum);
	
	return 0;
}
/*input
NULL
*/
/*
array a:
1  2  3  5  
5  6  8  8  
9  4  2  5  
sum = 44   
*/

7-7  求一个班10名学生4门课的平均成绩

        注:包含随机数的使用

#include <stdio.h>
#include <math.h>
#include <time.h>
int main(void) { 
	int i,j,grade[10][4],sum=0;
	double ave;
	//为了产生不同的数据,重置随机数种子
	srand(time(NULL));
	
	for(i=0;i<10;i++){
	    for(j=0;j<4;j++){
	        grade[i][j]=rand()%90+10;
	    }
	}

	for(i=0;i<10;i++){
	    sum=0;
	    for(j=0;j<4;j++)
	        sum+=grade[i][j];
	    ave=sum/4.0;
	    printf("the average score of %d student is %5.1f\r\n",i,ave);
	}
	
	return 0;
}
/*input
NULL
*/
/*
the average score of 0 student is  22.5
the average score of 1 student is  73.2
the average score of 2 student is  52.8
the average score of 3 student is  61.0
the average score of 4 student is  29.0
the average score of 5 student is  49.2
the average score of 6 student is  71.5
the average score of 7 student is  22.5
the average score of 8 student is  27.0
the average score of 9 student is  72.8 
*/

7-8   找出任意二维数组中的鞍点。即该位置上的元素所在的行最大而所在列最小。要求输出鞍点位置,无鞍点时给出有关信息。

#include <stdio.h>
#include <math.h>
#include <time.h>
int main(void) { 
	int i,j,k,max,jj,flag,a[3][4]={{1,9,7,6},{4,6,0,5},{8,7,8,2}};

	for(i=0;i<3;i++){
	    max=a[i][0];
	    for(j=0;j<4;j++){
	        if(a[i][j]>max){
	            max=a[i][j];
	            jj=j;
	        }
	    }
	    for(k=0;k<3;k++)
	        if(a[k][jj]<max) break;
	        
	    if(k>=3){
	        printf("鞍点所在的行和列为:%d,%d,鞍点为%d",i,jj,a[i][jj]);
	        flag=1;
	    }
	}

	if(flag == 0)
	    printf("无鞍点");
	return 0;
}
/*input
NULL
*/
/*
鞍点所在的行和列为:1,1,鞍点为6
*/

7-9  求两矩阵的乘积  a 2*3,b3*4,得到 c2*4

#include <stdio.h>
#include <math.h>
#include <time.h>
int main(void) { 
	int i,j,k;
	int a[2][3],b[3][4],c[2][4];
	srand(time(NULL));
	printf("\r\na is\r\n");
	for(i=0;i<2;i++){
	    for(j=0;j<3;j++){
	        a[i][j]=i-j;
	         printf("%d  ",a[i][j]);
	    }
	    printf("\n");
	}
	printf("\r\nb is\r\n");
	for(i=0;i<3;i++){
        for(j=0;j<4;j++){
            b[i][j]=i+j;
            printf("%d  ",b[i][j]);
        }
        printf("\n");
	}
	for(i=0;i<2;i++){
	    for(j=0;j<4;j++){
	        c[i][j]=0;
	        for(k=0;k<3;k++)
	        {
	            c[i][j]+=a[i][k]*b[k][j];
	        }
	    }
	}
	printf("\r\nc is\r\n");
	for(i=0;i<2;i++){
	    for(k=0;k<4;k++){
	            printf("%d  ",c[i][k]);
	    }
	    printf("\n");
	}

	return 0;
}
/*input
NULL
*/
/*

a is
0  -1  -2  
1  0  -1  

b is
0  1  2  3  
1  2  3  4  
2  3  4  5  

c is
-5  -8  -11  -14  
-2  -2  -2  -2  

*/

7-10   编写程序输出”I am a good boy“

#include <stdio.h>
#include <math.h>
#include <time.h>
int main(void) { 
	char c[]={'I',' ','a','m',' ','a',' ','g','i','r','l'};
	int i;
	for(i=0;i<11;i++){
	    printf("%c ",c[i]);
	}
	
	return 0;
}
/*input
NULL
*/
/*
I   a m   a   g i r l 

*/

7-11  打印菱形图案

#include <stdio.h>
#include <math.h>
#include <time.h>

#define L 3              //基准行上边或下边的行数
#define Z 2*L+1          //菱形的总行数

int main(void) { 
	int m,n;
	for(m=-L;m<=L;m++){
	    for(n=0;n<abs(m);n++){
	        printf(" ");
	    }
	    for(n=0;n<Z-2*abs(m);n++)
	        printf("*");
	        
	   printf("\n");
	}
	
	
	return 0;
}
/*input
NULL
*/
/*
   *
  ***
 *****
*******
 *****
  ***
   *


*/

7-12  文章有N行,每行80个字符。分别统计英文大小写、数字、空格及其他字符的个数

#include <stdio.h>
#include <math.h>
#include <time.h>

#define N 2

int main(void) { 
	int i,j;
	int upp,low,dig,spa,oth;
	char ch[N][81];
	upp=low=dig=spa=oth=0;
	
	for(i=0;i<N;i++){
	    printf("Please input the line %d\r\n",i);
	    gets(ch[i]);
	    for(j=0;j<80&&ch[i][j]!='\0';j++){
	        if(ch[i][j]>='A'&&ch[i][j<='Z']) upp++;
	        else if(ch[i][j]>='a'&&ch[i][j<='z']) low++;
	        else if(ch[i][j]>='0'&&ch[i][j<='0']) dig++;
	        else if(ch[i][j]==' ') spa++;
	        else
	            oth++;
	    }
	}
	for(i=0;i<N;i++)
	    printf("%s\n",ch[i]);
	    
	printf("upp = %d\r\n",upp);
	printf("low = %d\r\n",low);
	printf("dig = %d\r\n",dig);
	printf("spa = %d\r\n",spa);
	printf("oth = %d\r\n",oth);
	return 0;
}
/*input
NULL
*/
/*
Please input the line 0
djslkafjdlskajfdklsajfdklsa3428048029483290        434343jfdksa
Please input the line 1
jkfdsja7834254397259432504382540932fdajfdsafjs   rueqru888432
djslkafjdlskajfdklsajfdklsa3428048029483290        434343jfdksa
jkfdsja7834254397259432504382540932fdajfdsafjs   rueqru888432
upp = 57
low = 0
dig = 56
spa = 11
oth = 0
*/

7-13  不使用strcat,将两个字符串连接起来

#include <stdio.h>
#include <math.h>
#include <time.h>

int main(void) { 
	char str1[20],str2[20];
	int i=0,j=0;
	printf("请输入第一个字符串\r\n");
	gets(str1);
	printf("请输入第二个字符串\r\n");
	gets(str2);
	while(str1[i]!='\0'){
		i++;
	}
	while(str2[j]!='\0'){
		str1[i++]=str2[j];
		j++;
	}
	str1[i]='\0';
	printf("连接后的字符串\r\n");
	puts(str1);
	return 0;
}
/*input
NULL
*/
/*
请输入第一个字符串
aaaa
请输入第二个字符串
bbbb
连接后的字符串
aaaabbbb
*/

7-14  输出若干字符串中最短的字符串

#include <stdio.h>
#include <math.h>
#include <time.h>

int main(void) { 
	char str1[80],min[80];
	int k,len;
	gets(str1);
	strcpy(min,str1);
	len=strlen(min);

	gets(str1);
	while(str1[0]!='\0'){
		k=strlen(str1);
		if(k<len){
			len=k;
			strcpy(min,str1);
		}
		gets(str1);
	}
	printf("len = %d,string is :%s\r\n",len,min);

	return 0;
}
/*input
fdjskljfkldsa
fjkdja
fdsklafkds
fdkjkf
fdksjafkdsjafkdsjafklda
fdsajkjk
jjjjjjjjjjjjjjjjjjjj
jjj
kkkkkkkkkk
iiii
i
*/
/*
len = 1,string is :i
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小满即大满

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

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

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

打赏作者

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

抵扣说明:

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

余额充值