C语言总结(第6章利用数组处理批量数据目录)

简介: 数组的定义及其理解:用来表示同一性质的数据(比如说一个班的30名同学的成绩)数组是一组有序数据的集合。数组中各数据的排列是有一定规律的,小标代表数据在数组中的序号。用一个数组名(如s)和下标(如15)来唯一地确定数组中的元素,如s15来唯一地确定数组中的元素,如s15 就代表第十五个学生的成绩。数组中的每一个元素都属于同一个数据类型。不能把不同类型的数据(如学生的成绩和学生的性别)放在同一个数组中。在计算机中只能输入有限的单个字符而无法表示上下标,C语言中就规定用方括号中的数字来表示下标,如用s[15]表示s15 ,即第15个学生的成绩。

数组的定义及其理解:用来表示同一性质的数据(比如说一个班的30名同学的成绩)


数组是一组有序数据的集合。数组中各数据的排列是有一定规律的,小标代表数据在数组中的序号。

用一个数组名(如s)和下标(如15)来唯一地确定数组中的元素,如s15来唯一地确定数组中的元素,如s15 就代表第十五个学生的成绩。

数组中的每一个元素都属于同一个数据类型。不能把不同类型的数据(如学生的成绩和学生的性别)放在同一个数组中。

在计算机中只能输入有限的单个字符而无法表示上下标,C语言中就规定用方括号中的数字来表示下标,如用s[15]表示s15  ,即第15个学生的成绩。

将数组与循环相结合起来可以有效的处理大批量的数据,大大提高工作效率


怎样定义和引用一维数组


int a[10];


表示定义了一个整型数组,数组名为a,此数组中包含了10个整型元素。


注意a[10]中是从a[0]开始到a[9]结束 没有a[10]!!!


常量表达式中可以包含常量和符号常量,如inta[3+5]是合法的,不能包含变量,如int a[n];是不合法的,也就是说,C语言不允许对数组的大小作动态定义,即数据的大小不依赖于程序运行过程中变量的值。


例题:简化的插入排序


输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:


输入一个正整数 n(0<n<=9)和一组(n个)有序的整数,再输入一个整数 x,把 x 插入到这组数据中,使该组数据仍然有序。


输入输出示例:括号内为说明


输入:


4               (repeat=4)


5               (数据的个数n=5)


1 2 4 5 7       (5个有序整数)


3               (待插入整数x=3)


4               (数据的个数n=4)


1 2 5 7         (4个有序整数)


-10             (待插入整数x=-10)


3               (数据的个数n=3)


1 2 4         (3个有序整数)


100             (待插入整数x=100)


5               (数据的个数n=5)


1 2 4 5 7       (5个有序整数)


4               (待插入整数x=4)


输出:


1 2 3 4 5 7

-10 1 2 5 7

1 2 4 100

1 2 4 4 5 7

#include <stdio.h>

int main(void)  

{

   int i, j, n, x;

   int repeat, ri;

   int a[10];

   scanf("%d", &repeat);

   for(ri = 1; ri <= repeat; ri++){

       scanf("%d", &n);

       for(i = 0; i < n; i++)

        scanf("%d", &a[i]);

        scanf("%d", &x);

if (x >= a[n-1]) a[n] = x;  /* 特殊情况:若x比所有的元素都要大 */

        else

for(i = 0; i < n; i++) {

 if(x > a[i])   continue;  /* 将x 插入到合适的位置*/

 j = n - 1;     /* 从当前要插入的位置往后移位 */

 while(j >= i){

  a[j+1] = a[j];

  j--;  

 }      

     a[i] = x;      /* 将x查到当前的位置 */

             break;

}

    for(i = 0; i < n + 1; i++)

           printf("%d ", a[i]);

       putchar('\n');  

   }

}

一维数组的初始化

int a[10]={0,1,2,3,}

int a[10]={0}未赋值的部分自动设定为0


用数组来求fibonacci数列问题:


#include<stdio.h>

int main()

int i;

int f[20]={1,1};

for(i=2;i<20;i++)

{

f[i]=f[i-2]+f[i-1];

for(i=2;i<20;i++)

{

if(i%5==0) printf(“\n”);

printf(“%12d”,f[i]);

}

printf(“\n”);

return 0;

}


冒泡排序例题:


(算法入门,算法的重要性!)


http://t.csdn.cn/ERGm9


数字的排序:


#include <stdio.h>

#define SIZE 10

int main()

{

   int a[SIZE]={12 ,43,9,13,67,98,101,89,3,35};//十个数的无序数列

   int i,j,t;

   printf("此程序使用冒泡排序法排列无序数列!\n");

   //冒泡排序

   for(i=0;i<10-1;i++)//n个数的数列总共扫描n-1次

   {

       for(j=0;j<10-i-1;j++)//每一趟扫描到a[n-i-2]与a[n-i-1]比较为止结束

       {

           if(a[j]>a[j+1])//后一位数比前一位数小的话,就交换两个数的位置(升序)

           {

              t=a[j+1];

              a[j+1]=a[j]; //t就是一个中间量用来交换2个数的值的

              a[j]=t;

           }

       }

   }

   printf("排列好的数列是:\n");

   //输出排列好得数列

   for(i=0;i<10;i++)

   {

       printf("%d ",a[i]);

   }

   return 0;

}

字符排序:


用函数来解决这个问题:


#include <stdio.h>

#define SIZE 10

int main()

{

   char a[SIZE]={'i','l','o','v','e','y','o','u','y','x'};//十个数的无序数列

   int i,j;

   char t;

   printf("此程序使用冒泡排序法排列无序数列!\n");

   //冒泡排序

   for(i=0;i<10-1;i++)//n个数的数列总共扫描n-1次

   {

       for(j=0;j<10-i-1;j++)//每一趟扫描到a[n-i-2]与a[n-i-1]比较为止结束

       {

           if(a[j]>a[j+1])//后一位数比前一位数小的话,就交换两个数的位置(升序)

           {

              t=a[j+1];

              a[j+1]=a[j];

              a[j]=t;

           }

       }

   }

   printf("排列好的字符组是:\n");

   //输出排列好得吃数列

   for(i=0;i<10;i++)

   {

       printf("%c ",a[i]);

   }

   return 0;

}

#include <stdio.h>

void function(char a[],int);//尤其注意,此处的函数声明必须是char a[],因为这里穿的是地址,不能仅仅使用char

int main()

{

   int i;

   char a[10]={'i','l','o','v','e','y','o','u','y','x'};//十个数的无序字符数列

   printf("此程序使用冒泡排序法排列无序数列!\n");

   function(a,10);//调用冒泡排序

   printf("排列好的字符组是:\n");

   //输出排列好得吃数列

   for(i=0;i<10;i++)

   {

       printf("%c ",a[i]);

   }

   return 0;

}

void function(char a[],int m)

{


   //冒泡排序

   int i,j;

   char t;

   for(i=0;i<m-1;i++)//n个数的数列总共扫描n-1次

   {

       for(j=0;j<m-i-1;j++)//每一趟扫描到a[n-i-2]与a[n-i-1]比较为止结束

       {

           if(a[j]>a[j+1])//后一位数比前一位数小的话,就交换两个数的位置(升序)

           {

              t=a[j+1];

              a[j+1]=a[j];

              a[j]=t;

           }

       }

   }

   return;

}


6.2怎样定义和引用二维数组


二维数组常称为矩阵。把二维数组写成行和列的排列形式,可以有助于形象化地理解二维数组的逻辑结构。


float pay[3][6];


3*6(3行6列)


多维数组在内存中的排列顺序为:第一维的下标变化最慢,最右边的下标变化最快。例如:


a[0][0][0]>>a[0][0][1]>>a[0][0][2]>>a[0][1][0]>>a[0][1][1]>>a[0][1][2]>>a[1][0][0]


*交换行和列*


#include<stdio.h>

int main()

{

   int n,m,i,j,k;

   int num1,num2;//要交换的两行或两列

   char ch;//决定进行行变换还是列变换

   int rek;//进行几次操作

   int tmp;

   scanf("%d %d",&n,&m);

   int arr[n][m];

   //输入矩阵

   for(i=0;i<n;i++)

   {

       for(j=0;j<m;j++)

       {

           scanf("%d",&arr[i][j]);

       }

   }

 

   scanf("%d",&k);

 

   for(rek=0;rek<k;rek++)

   {

      scanf(" %c %d %d",&ch,&num1,&num2);

       if(ch=='r')//进行行变换

       {

           for(j=0;j<m;j++)

           {

               tmp=arr[num1-1][j];//进行行变换的时候约定矩阵的行不变循环递归列然后交换即可

               arr[num1-1][j]=arr[num2-1][j];

               arr[num2-1][j]=tmp;

           }

       }

       else if(ch=='c')//进行列变换

       {

           for(i=0;i<n;i++)

           {

               tmp=arr[i][num1-1];//同理进行列变换的时候约定列为需要交换的两列不变后,循环递归循环行即可。

               arr[i][num1-1]=arr[i][num2-1];

               arr[i][num2-1]=tmp;

           }

       }

   }

 


  for(i=0;i<n;i++)

   {

       for(j=0;j<m;j++)

       {

           printf("%d ",arr[i][j]);

       }

       printf("\n");

   }

   

   return 0;

}


6.3字符数组


字符型数据是以字符的ASCII代码存储在存储单元中的,一般占1字节


C语言中没有字符串类型,也没有字符串变量,字符串是存放在字符串数组中的。


6.3.1怎样定义字符数组


char c[10]


由于字符型数据是以整数形式(ASCII代码)存放的,因此也可以用整型数组来存放字符数据,例如:


int c[10]; //合法,但浪费存储空间


c[0]=‘a’


6.3.4字符串和字符串结束标志


C语言规定了一个“字符串结束标志”,以字符串‘\0’作为结束标志。如果字符数组中存放有若干字符,前面9个字符都不是空字符‘\0’,而第十个字符是‘\0’,则认为数组中有一个字符串,其有效字符为9个。也就是说,在遇到字符‘\0’时,表示字符串结束,把它前面的字符组成一个字符串。


注意:C系统在用字符数组存储字符串常量时会自动加一个‘\0’作为结束符。例如“C program”共有9个字符。字符串是存放在一维数组中的,在数组中占10个字节,最后有一个字节‘\0’是系统自动加上的。


说明:‘\0’代表ASCII码为0的字符,从ASCII码表中可以查到,ASCII码为0的字符不是一个可以显示的字符,而是一个“空操作符”,即它什么也不做。用它来作为字符串结束标志不会产生附加的操作或增加有效字符,只起一个供辨别的标志。


对字符串的说明:


①不能用运算符对字符串做运算


②通过数组的方式可以遍历字符串


6.3.5字符数组的输入输出


字符串的结尾有‘\0’          


Char string[8];


Scanf (“%s”,string);       //前面不允许加&(因为在C语言中数组名代笔该数组第一个元素的地址或者也可以说是数组的起始地址)


Printf (“%s”,string);


安全的输入:


Char string[8];

Scanf (“%7s”,string);


这个7代表:最多允许读入的字符数量,应比数组数组的大小小1


6.3.6使用字符串处理函数


注意:在使用后字符串处理函数时,应当在程序文件的开头用


#include <string.h>


puts函数——输出字符串的函数

Puts(str);


gets函数——输入字符串的函数

Gets(str);


Strcat函数———字符串连接函数


Strcat(字符数组1,字符数组2)


#include <stdio.h>  

#include <string.h>  

int main(void)  {

   char str1[6] = "hello";  

   char str2[6] = "world";  

   strcat(str1,str2);

   printf("str1 = %s\n",str1);  

   printf("str2 = %s\n",str2);

   int len = strlen(str1);

   printf("len的长度:%d\n",len);

 

   return 0;  

}


说明:


字符数组1必须足够大,以便容纳连接后的新字符串

连接两个字符串的后面都有‘\0’,连接时将字符串1后面的‘\0’取消,只在最后保留‘\0’。


Strcpy和strncpy——字符串复制函数

Strcpy(字符数组1,字符串2)


Char strl[10],str2[]“china”;

Strcpy(str1;str2);


说明:


字符数组1必须足够大,以便容纳连接后的新字符串

“字符数组1”必须写出数组名形式如(str1),“字符串2”可以是字符数组名,也可以是一个字符串常量。


Strcmp——字符串比较函数


Strcmp(字符串1,字符串2)


字符串比较的规则是:将两个字符串自左向右逐个字符相比(按ASCII码值大小比较)直到出现不同的字符或者是遇到‘\0’为止。


如全部字符相同,则认为两个字符串相等;

若出现并不相同的字符,则以第1对不相同的字符的比较结果为准。

比较的结果由函数值带回:


如果字符串1与字符串2相同,则函数值为0。

如果字符串1>字符串2,则函数值为一个正整数

如果字符串1<字符串2,则函数值为一个负整数

这样使用if(strcmp(str1,str2)>0)


Printf(“yes”)


Strlen函数——测字符串长度的函数


是string length(字符串的长度)的缩写。


Char str[10]=“CHINA”


Printf(“%d”,strlen(str));


输出的结果不是10,也不是6,而是5。


Strlwr函数——转换为小写的函数        


Strlwr(字符串)          


是string lowercase的缩写

Strupr函数——转换为大写的函数

Strupr(字符串)    


6.3.7字符数组应用举例


70013    将数组中的数逆序存放


输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:


输入一个正整数 n (1<n<=10),再输入 n 个整数,存入数组a中,先将数组a中的这n个数逆序存放,再按顺序输出数组中的n个元素。


输入输出示例:括号内为说明


输入


2            (repeat=2)

4            (n=4)

10 8 1 2

5            (n=5)

1 2 5 4 0


输出


2 1 8 10

0 4 5 2 1

#include <stdio.h>

int main(void)

{

   int i, n, temp;

   int repeat, ri;

   int a[10];

   scanf("%d", &repeat);

   for(ri = 1; ri <= repeat; ri++){

       scanf("%d", &n);

       for(i = 0; i < n; i++)

           scanf("%d", &a[i]);

i=0;

for(i=0;i<n/2;i++){

temp=a[i];

a[i]=a[n-1-i];

a[n-1-i]=temp;

}

       for(i = 0; i < n; i++)

           printf("%d ", a[i]);

       printf("\n");

   }

}


70014    求最大值及其下标


输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:


输入一个正整数 n (1<n<=10),再输入n个整数,输出最大值及其对应的最小下标,下标从0开始。


输入输出示例:括号内为说明


输入


3     (repeat=3)

3     (n=3)

1 6 4

4     (n=4)

10 8 1 9

5     (n=5)

1 2 0 4 5


输出


max = 6, index = 1    (最大值6的下标是1)

max = 10, index = 0   (最大值10的下标是0)

max = 5, index = 4    (最大值5的下标是4)

#include <stdio.h>

int main(void)

{

   int i, index, n;

   int ri, repeat;

   int a[10];

   scanf("%d", &repeat);

   for(ri = 1; ri <= repeat; ri++){

       scanf("%d", &n);

       for(i = 0; i < n; i++)

           scanf("%d", &a[i]);

index=0;

a[index]=a[0];

for(i = 1; i < n; i++){

if(a[index]<a[i]){

a[index]=a[i];

index=i;

}

}

       printf("max = %d, index = %d\n", a[index], index);

   }

}

70015    交换最小值和最大值


输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:


输入一个正整数 n (1<n<=10),再输入 n 个整数,将最小值与第一个数交换,最大值与最后一个数交换,然后输出交换后的 n 个数。


输入输出示例:括号内为说明


输入


3         (repeat=3)

5         (n=5)

8 2 5 1 4

4         (n=4)

1 5 6 7

5         (n=5)

5 4 3 2 1


输出


After swap: 1 2 5 4 8

After swap: 1 5 6 7

After swap: 1 4 3 2 5

#include <stdio.h>

int main(void)

{

   int i, index, n, t;

   int repeat, ri;

   int a[10];

   scanf("%d", &repeat);

   for(ri = 1; ri <= repeat; ri++){

       scanf("%d", &n);

       for(i = 0; i < n; i++)

           scanf("%d", &a[i]);

index=0;

for(i = 1; i < n; i++){

if(a[i]<a[index])

index=i;

}

t=a[index];   /* 最小值与第1个数交换 */

a[index]=a[0];

a[0]=t;

index=0;

for(i = 1; i < n; i++){

if(a[i]>a[index])

index=i;

}

t=a[index];     /* 最大值与最后一个数交换 */

a[index]=a[n-1];

a[n-1]=t;

       printf("After swap: ");

       for(i = 0; i < n; i++)

           printf("%d ", a[i]);

       printf("\n");

   }

}

70016    选择法排序


输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:


输入一个正整数 n (1<n<=10),再输入 n 个整数,将它们从大到小排序后输出。


输入输出示例:括号内为说明


输入


3           (repeat=3)

4           (n=4)

5 1 7 6

3           (n=3)

1 2 3

5           (n=5)

5 4 3 2 1


输出


After sorted: 7 6 5 1

After sorted: 3 2 1

After sorted: 5 4 3 2 1

#include <stdio.h>

int main(void)

{

   int i, index, k, n, temp;

   int repeat, ri;

   int a[10];

   scanf("%d", &repeat);

   for(ri = 1; ri <= repeat; ri++){

       scanf("%d", &n);

       for(i = 0; i < n; i++)

           scanf("%d", &a[i]);

for(k=0;k<n-1;k++){

index=k;

for(i=k+1;i<n;i++)

if(a[i]>a[index])

index=i;

temp=a[index];

a[index]=a[k];

a[k]=temp;

}

       printf("After sorted: ");

       for(i = 0; i < n; i++)

           printf("%d ", a[i]);

       printf("\n");

   }

}

70017    在数组中查找指定的元素


输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:


输入一个正整数 n (1<n<=10),再输入 n 个整数,将它们存入数组 a 中,再输入一个整数 x,然后在数组 a 中查找与 x 相同的元素,如果找到,输出 x 在数组 a 中对应元素的最小下标,如果没有找到,输出相应信息。


输入输出示例:括号内为说明


输入:


2 (repeat=2)

6 (n=6)

1 3 5 7 9 5

5 (x=5)

4 (n=4)

1 3 5 7

2 (x=2)

输出:


5: a[2]

2: not found

#include <stdio.h>

int main(void)

{

   int flag, i, n, x;

   int repeat, ri;

   int a[10];

   scanf("%d", &repeat);

   for(ri = 1; ri <= repeat; ri++){

flag=0;          /* 若标志不重新初始化的化,就会一影响下一轮循环的计算 */

       scanf("%d", &n);

       for(i = 0; i < n; i++) scanf("%d", &a[i]);

       scanf("%d", &x);

for (i = 0; i < n; i++) {

if(x==a[i])

{

flag = 1;

break;

}

}

       if(flag != 0) printf( "%d: a[%d]\n", x, i);

       else printf( "%d: not found\n", x);

   }

}

70021    求矩阵各行元素之和


输入2个正整数 m 和 n (1<=m<=6, 1<=n<=6),然后输入矩阵 a(m 行 n 列)中的元素,分别求出各行元素之和,并输出。


输出使用语句:printf("sum of row %d is %d\n", i, sum);


输入输出示例:括号内为说明


输入:


3 2 (m=3,n=2)

6  3

1  -8

3  12


输出:


sum of row 0 is 9

sum of row 1 is -7

sum of row 2 is 15

#include <stdio.h>

int main(void)

{

   int i, j, m, n, sum;

   int a[6][6];

   scanf("%d%d",&m,&n);

   for(i = 0; i < m; i++)    

       for(j = 0; j < n; j++)

           scanf("%d", &a[i][j]);

for(i = 0; i < m; i++){  

sum=0;

for(j = 0; j < n; j++)

sum+=a[i][j];

printf("sum of row %d is %d\n", i, sum);

}

}

70022    矩阵运算


程序填空,不要改变与输入输出有关的语句。


输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:


读入 1 个正整数 n(1≤n≤6), 再读入 n 阶方阵 a , 计算该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。副对角线为从矩阵的右上角至左下角的连线。


输入输出示例:括号内为说明


输入:


1        (repeat=1)

4        (n=4)

2 3 4 1

5 6 1 1

7 1 8 1

1 1 1 1

sum = 35   (2+3+4+5+6+7+8=35)

#include "stdio.h"

int main(void)

{

   int i, j, n, sum;

   int repeat, ri;

   int a[6][6];

   scanf("%d", &repeat);

   for(ri = 1; ri <= repeat; ri++){

       scanf("%d", &n);

       for(i = 0; i < n; i++)

           for(j = 0; j < n; j++)

               scanf("%d", &a[i][j]);

sum=0;

for(i = 0; i < n; i++){

for(j = 0; j < n; j++)

sum+=a[i][j];

}

for(i = 1; i < n-1; i++)

sum-=a[i][n-i-1];  /* 减去副对角线的元素 */

for(j =0; j <n; j++)

sum-=a[n-1][j];   /* 减去最下一行 */

for(i =0; i <n; i++)

sum-=a[i][n-1];   /* 减去最右一列 */

sum=sum+a[n-1][n-1];    /*  右下角元素减了两次,补回一次 */

       printf("sum = %d\n", sum);

   }

}

70023    九九乘法表  


程序填空,不要改变与输入输出有关的语句。


输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:


输入一个正整数 n(0<n<10),输出九九乘法表的前n×n项。


提示:将乘数、被乘数和乘积放入一个二维数组中,再输出该数组。


输入输出示例:括号内为说明


输入:


1       (repeat=1)

3       (n=3)

输出:


*   1   2   3

1   1

2   2   4

3   3   6   9

#include "stdio.h"

int main(void)

{

   int i, j, n;

   int a[10][10];

   int repeat, ri;

   scanf("%d",&repeat);

   for(ri = 1; ri <= repeat; ri++){

       scanf("%d", &n);

for(j = 0; j <= n; j++)

a[0][j]=j;   /* 乘数 */

for(i = 0; i <= n; i++)

a[i][0]=i;   /* 被乘数 */

for(i = 1; i <= n; i++)

           for(j = 1; j <= n; j++)

a[i][j]=i*j;  /* 结果 */

       for(i = 0; i <= n; i++){

           for(j = 0; j <= n; j++)

               if(i == 0 && j == 0) printf("%-4c", '*');

               else if(i == 0 || j <= i) printf("%-4d", a[i][j]);

           printf("\n");

       }

 

}

}

70024    判断上三角矩阵


输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:


输入1 个正整数 n (1≤n≤6)和 n 阶方阵 a 中的元素,如果 a 是上三角矩阵, 输出"YES", 否则, 输出"NO"。上三角矩阵指主对角线以下的元素都为0的矩阵, 主对角线为从矩阵的左上角至右下角的连线。


输入输出示例:括号内为说明


输入:


2       (repeat=2)

3   (n=3)

1  2  3  

0  4  5  

0  0  6

2   (n=2)

1  0  

-8  2  

输出:

YES

NO

#include "stdio.h"

#include "math.h"

int main(void)

{

   int flag, i, j, n;

   int a[6][6];

   int repeat, ri;

   scanf("%d", &repeat);

   for(ri = 1; ri <= repeat; ri++){

       scanf("%d", &n);

       for(i = 0; i < n; i++)

           for(j = 0; j < n; j++)

               scanf("%d", &a[i][j]);

flag=1;

for(i = 0; i < n; i++){

for(j = 0; j < i; j++){    

if(a[i][j]!=0){

flag=0; break;   /* 只要一个数值不满足就可以否定 */

}

}

if (!flag) break;

}

       if(flag != 0)  printf("YES\n");

       else  printf("NO\n");

   }

}

                                                                         


第六章课后习题:谭浩强 C语言程序设计第五版 第六章 习题 答案_月已满西楼的博客-CSDN博客_月已满西楼谭浩强


3. 求一个3 X 3的整形矩阵对角线元素之和

【答案解析】


矩阵:即二维数组,矩阵行和列相等的二维数组称为方阵。


1 2 3


4 5 6


7 8 9


左上角到右下角对角线上数字:行下标和列下标相加


右上角到左下角对角线上数字:列下标减1 行下标加一


通过两个循环来取到对角线上的元素,并对其求和即可。


【代码实现】


#include<stdio.h>

int main()

{

int array[3][3];

int sumLT2RB = 0;  // 标记左上角到右下角对角线元素之和

int sumRT2LB = 0;  // 标记右上角到左下角对角线元素之和

printf("请输入3行3列的矩阵:\n");

for (int i = 0; i < 3; ++i)

{

for (int j = 0; j < 3; ++j)

scanf("%d", &array[i][j]);

}

// 左上角到右下角对角线

for (int i = 0; i < 3; ++i)

sumLT2RB += array[i][i];

for (int i = 0, j = 2; i < 3; ++i, j--)

sumRT2LB += array[i][j];

printf("左上角到右下角对角线元素之和: %d\n", sumLT2RB);

printf("右上角到左下角对角线元素之和: %d\n", sumRT2LB);

return 0;

}

5. 将一个数组中的值按逆序重新存放。例如:原来顺序为8,6,5,4,1。要求改为1,4,5,6,8。

【答案解析】


该题为数组的逆置,具体处理方式如下:


如果begin < end时,则循环进行一下操作


给定两个下标begin和end,begin放在数组起始的位置,end放在数组最后一个元素的位置


交换begin和end位置的元素


begin往后移动,end往前移动


【代码实现】


#include<stdio.h>

int main()

{

int array[5] = {8,6,5,4,1};

int begin = 0, end = 4;

printf("逆序之前数组为:");

for (int i = 0; i < 5; ++i)

printf("%d ", array[i]);

printf("\n");

// 逆序:begin在数组最左侧,end在数组最右侧

// 只要begin < end,将begin和end位置元素进行交换

// 然后begin往后移动一步,end往前移动一步

while (begin < end)

{

int temp = array[begin];

array[begin] = array[end];

array[end] = temp;

begin++;

end--;

}

printf("逆置之后数组为:");

for (int i = 0; i < 5; ++i)

printf("%d ", array[i]);

printf("\n");

return 0;

}


第六章目录回顾:


6.1怎样定义和引用一维数组139


6.1.1怎样定义一维数组140


6.1.2怎样引用一维数组元素140


6.1.3一维数组的初始化142


6.1.4一维数组程序举例142


6.2怎样定义和引用二维数组145


6.2.1怎样定义二维数组146


6.2.2怎样引用二维数组的元素147


6.2.3二维数组的初始化148


6.2.4二维数组程序举例149


6.3字符数组151


6.3.1怎样定义字符数组151


6.3.2字符数组的初始化152


6.3.3怎样引用字符数组中的元素152


6.3.4字符串和字符串结束标志153


6.3.5字符数组的输入输出156


6.3.6使用字符串处理函数157


6.3.7字符数组应用举例162


目录
相关文章
|
4天前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
28 4
|
30天前
|
存储 编译器 C语言
【c语言】数组
本文介绍了数组的基本概念及一维和二维数组的创建、初始化、使用方法及其在内存中的存储形式。一维数组通过下标访问元素,支持初始化和动态输入输出。二维数组则通过行和列的下标访问元素,同样支持初始化和动态输入输出。此外,还简要介绍了C99标准中的变长数组,允许在运行时根据变量创建数组,但不能初始化。
37 6
|
1月前
|
存储 人工智能 BI
C语言:数组的分类
C语言中的数组分为一维数组、多维数组和字符串数组。一维数组是最基本的形式,用于存储一系列相同类型的元素;多维数组则可以看作是一维数组的数组,常用于矩阵运算等场景;字符串数组则是以字符为元素的一维数组,专门用于处理文本数据。
|
1月前
|
存储 算法 C语言
C语言:什么是指针数组,它有什么用
指针数组是C语言中一种特殊的数据结构,每个元素都是一个指针。它用于存储多个内存地址,方便对多个变量或数组进行操作,常用于字符串处理、动态内存分配等场景。
|
1月前
|
存储 C语言
C语言:一维数组的不初始化、部分初始化、完全初始化的不同点
C语言中一维数组的初始化有三种情况:不初始化时,数组元素的值是随机的;部分初始化时,未指定的元素会被自动赋值为0;完全初始化时,所有元素都被赋予了初始值。
|
1月前
|
存储 C语言 C++
深入C语言,发现多样的数据之枚举和联合体
深入C语言,发现多样的数据之枚举和联合体
深入C语言,发现多样的数据之枚举和联合体
|
1月前
|
C语言 C++
保姆式教学C语言——数组
保姆式教学C语言——数组
17 0
保姆式教学C语言——数组
|
1月前
|
C语言
C语言数组
C语言数组
19 0
|
1月前
|
存储 C语言
深入C语言内存:数据在内存中的存储
深入C语言内存:数据在内存中的存储
|
1月前
|
存储 C语言 索引
c语言回顾-数组(全网最详细,哈哈哈) (下)
c语言回顾-数组(全网最详细,哈哈哈) (下)
44 0