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

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

目录

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

怎样定义和引用一维数组

用数组来求fibonacci数列问题:

冒泡排序例题:

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

*交换行和列*

6.3字符数组

6.3.1怎样定义字符数组

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

6.3.5字符数组的输入输出

6.3.6使用字符串处理函数

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

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

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

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

Strcmp——字符串比较函数

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

6.3.7字符数组应用举例

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

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

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

第六章目录回顾:


C语言总结(一维数组、二维数组、字符数组和字符串)_快乐的兔子1的博客-CSDN博客_c语言一维数组 字符串 比较icon-default.png?t=MBR7https://blog.csdn.net/csuft20164442/article/details/86602115?ops_request_misc=%7B%22request%5Fid%22%3A%22167219819516782427421300%22%2C%22scm%22%3A%2220140713.130102334..%22%7D&request_id=167219819516782427421300&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-86602115-null-null.142^v68^control,201^v4^add_ask,213^v2^t3_esquery_v2&utm_term=%E6%95%B0%E7%BB%84&spm=1018.2226.3001.4187

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

  1. 数组是一组有序数据的集合。数组中各数据的排列是有一定规律的,小标代表数据在数组中的序号。
  2. 用一个数组名(如s)和下标(如15)来唯一地确定数组中的元素,如s15来唯一地确定数组中的元素,如s15 就代表第十五个学生的成绩。
  3. 数组中的每一个元素都属于同一个数据类型。不能把不同类型的数据(如学生的成绩和学生的性别)放在同一个数组中。
  4. 在计算机中只能输入有限的单个字符而无法表示上下标,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. 字符数组1必须足够大,以便容纳连接后的新字符串
  2. 连接两个字符串的后面都有‘\0’,连接时将字符串1后面的‘\0’取消,只在最后保留‘\0’。

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

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

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

Strcpy(str1;str2);

说明:

  1. 字符数组1必须足够大,以便容纳连接后的新字符串
  2. “字符数组1”必须写出数组名形式如(str1),“字符串2”可以是字符数组名,也可以是一个字符串常量。

Strcmp——字符串比较函数

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

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

  1. 如全部字符相同,则认为两个字符串相等;
  2. 若出现并不相同的字符,则以第1对不相同的字符的比较结果为准。

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

  1. 如果字符串1与字符串2相同,则函数值为0。
  2. 如果字符串1>字符串2,则函数值为一个正整数
  3. 如果字符串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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

时雨h

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

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

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

打赏作者

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

抵扣说明:

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

余额充值