C语言程序设计实践-数组初步

简介: 【项目1 - 数组大折腾】 (1)创建一个有20个元素的整型数组,通过初始化,为数组中的前10个元素赋初值,然后通过键盘输入后10个元素的值,从前往后(从第0个到第19个)输出数组中元素的值,每5个元素换一行。int main( ) { int a[20]={...}; //初始化前10个元素 //键盘输入后10个元素的值

【项目1 - 数组大折腾】
(1)创建一个有20个元素的整型数组,通过初始化,为数组中的前10个元素赋初值,然后通过键盘输入后10个元素的值,从前往后(从第0个到第19个)输出数组中元素的值,每5个元素换一行。

int main( )  
{  
    int a[20]={...};  //初始化前10个元素  
    //键盘输入后10个元素的值  

    //由前往后输出数组中所有元素的值  
    printf("由前往后,数组中的值是:\n");  

    return 0;  
}  

(2)创建一个长度为10的整型数组并初始化,由后往前(由第9个元素向第0个元素方向)输出数组中所有元素的值,改变数组元素的值,令所有的数据加倍,输出改变后的值。
(3)创建一个长度为16的整型数组a并初始化,先输出数组中元素值为3的倍数的数,再输出所有下标为3的倍数的元素值。输出如图示。
这里写图片描述
(4)创建一个长度为16的整型数组a并初始化,删除数组中所有能被3整除的元素(数组中实际有效使用的元素将不足16),输出删除后数组中的全部元素。
(5)创建一个长度为16的整型数组a并初始化前15个元素,输入一个整数b,将b插入到a[0]位置(原有的数据往后“移动”)。
参考解答

【项目2 - 成绩处理函数版】
  在数组score中将要存储了某小组C程序设计的成绩,请设计实现下面的各功能函数,并在main函数中调用,组合成一个完整的应用:
(1)输入小组人数及成绩,要保证成绩在0-100之间;
(2)输出该小组的最高成绩、最低成绩、平均成绩;
(3)输出考得最高成绩和最低成绩的同学的人数;
(4)输出考得最高成绩和最低成绩的同学的学号(设数组下标即学号,可能有相同的成绩)。
(5)求出所有同学成绩的标准偏差,标准偏差公式为这里写图片描述,其中 xi 为样本(即某同学成绩),这里写图片描述为均值(前面已经求出), N 为样本数目;
界面参考见图
这里写图片描述

  “成绩处理”是该功能不用函数的实现。本项目要求输入、求最大/小值等所有功能都通过自定义函数完成。这种设计貌似比不用函数的方法麻烦,但这只是对函数不熟悉时的感觉。而实际上,采用函数的做法,在结构有更多的优点,尤其是当程序的规模更大时。通过这个项目,学会将数组名用作函数的参数解决问题的方法。
  下面是建议的自定义函数的声明和main()函数,你需要定义这些函数。

void input_score(int s[], int n); //将小组中n名同学的成绩输入数组s  
int get_max_score(int s[], int n);  //返回数组s中n名同学的最高成绩值  
int get_min_score(int s[], int n);  //返回数组s中n名同学的最低成绩值  
double get_avg_score(int s[], int n);  //返回数组s中n名同学的平均成绩值  
double get_stdev_score(int s[], int n); //返回数组s中n名同学成绩值的标准偏差  
int count(int x, int s[], int n);  //返回在数组s中n名同学中有多少人得x分(实参给出最高/低时,可以求最高/低成绩的人数)  
void output_index(int x, int s[], int n); //在函数中输出数组s中n名同学中得x分的学号(下标)  

int main( )  
{  
    int score[50]; //将score设为局部变量,通过数组名作函数参数,传递数组首地址,在函数中操作数组  
    int num;       //小组人数也设为局部变量,将作为函数的实际参数  
    int max_score,min_score;  
    printf("小组共有多少名同学? ");  
    scanf("%d", &num);  
    printf("请输入学生成绩:\n");  
    input_score(score, num);  //要求成绩在0-100之间  
    max_score=get_max_score(score, num);  
    printf("最高成绩为:%d,共有 %d 人\n", max_score, count(max_score, score, num ));  
    min_score=get_min_score(score, num);  
    printf("最低成绩为:%d,共有 %d 人\n", min_score, count(min_score,score, num ));  
    printf("平均成绩为:%.2f\n", get_avg_score(score, num));  
    printf("标准偏差为:%.2f\n",get_stdev_score(score, num));  
    printf("获最高成绩的学生(学号)有:");  
    output_index(max_score,score, num);  
    printf("\n获最低成绩的学生(学号)有:");  
    output_index(min_score,score, num);  
    printf("\n");  
    return 0;  
} 

参考解答

【项目3-折腾二维数组】
  创建一个5行4列的二维整型数组,通过初始化,为数组中的前两列的10个元素赋初值,然后:

  • 通过键盘输入,使后两列的10个元素获得值;
  • 按行序优先输出数组元素;
  • 将所有元素值乘以3后保存在数组中;
  • 按列序优先输出(输出的第一行是数组中的第一列……,其实输出的就是“转置”);
  • 将数组“倒”着输出(即最后一行最后一列的最先输出,第0行第0列的最后输出);
  • 输出数组中的所有偶数;
  • 输出所有行列下标之和为3的倍数的元素值。
#include <stdio.h>  
int main( )  
{  
    int i,j;  
    //创建数组,为数组中的前两列的10个元素赋初值  
    int a[5][4]= {{0,1},{4,5},{8,9},{12,13},{16,17}};  


    //键盘输入后两列10个元素的值  
    printf("请输入10个整数:\n");  


    //按行序优先输出  
    printf("数组中的值为:\n");  


    //将所有元素值乘以3后保存在数组中  
    printf("现在将所有元素乘以3倍...";  


    //按行序优先输出  
    printf("行序优先输出:\n");  


    //按列序优先输出(见题目描述)  
    printf("列序优先输出:\n");  


    //将数组“倒”着输出(见题目描述)  
    printf("倒着输出:\n");  


    //输出数组中的所有偶数  
    printf("数组中的偶数:\n");  


    //输出所有行列下标之和为3的倍数的元素值  
    printf("行列下标之和为3的倍数的元素:\n");  


    return 0;  
}  

提示:编程时,可以做一点,调一点。参考的运行界面如图:
这里写图片描述
参考解答

【项目4-矩阵运算】
  在数学中,一个矩阵由若干行和若干列数据组成,可以直接存储为一个二维数组。
(1)矩阵相加
  两个矩阵相加,要求其行、列数均相等。运算规则为:一个n行m列的矩阵A加上另一个n行m列的矩阵,得到的结果是一个n行m列的矩阵C,C中的第i行第j列位置上的数等于A和B矩阵第i行第j列上数相加的和。例如:
这里写图片描述
  请编程序,实现两个矩阵的加法。

(2)矩阵相乘
  一个n行m列的矩阵可以乘以一个m行p列的矩阵,得到的结果是一个n行p列的矩阵,其中的第i行第j列位置上的数等于前一个矩阵第i行上的m个数与后一个矩阵第j列上的m个数对应相乘后所有m个乘积的和。
  例如,下面的算式表示一个2行3列的矩阵乘以3行4列的矩阵,其结果是一个2行4列的矩阵:
这里写图片描述
  按二维数组习惯,从第0行第0列开始计数,结果中第1行第2列的元素是9,是通过左矩阵中的第1行(2 0 3),乘以右矩阵中的第2列(3 2 1),对应数相乘并加起来,就得到了9,即2×3-0×2+3×1=9。请将这个矩阵乘手工计算一下,规则不复杂。
  请编程序,实现两个矩阵的乘法。
参考解答

目录
相关文章
|
3天前
|
存储 编译器 C语言
【C语言】数组(一维、二维数组的简单介绍)
【C语言】数组(一维、二维数组的简单介绍)
|
28天前
|
存储 编译器 C语言
【C语言基础考研向】09 一维数组
数组是一种有序集合,用于存储相同类型的数据,便于统一操作与管理。例如,将衣柜底层划分为10个格子存放鞋子,便于快速定位。在C语言中,数组定义格式为 `类型说明符数组名[常量表达式];`,如 `int a[10];` 表示定义了一个包含10个整数的数组。数组初始化时可以直接赋值,也可以部分赋值,且数组长度必须固定。数组在内存中连续存储,访问时需注意下标范围,避免越界导致数据异常。数组作为参数传递时,传递的是首地址,修改会影响原数组。
|
28天前
|
存储 C语言
【C语言基础考研向】10 字符数组初始化及传递和scanf 读取字符串
本文介绍了C语言中字符数组的初始化方法及其在函数间传递的注意事项。字符数组初始化有两种方式:逐个字符赋值或整体初始化字符串。实际工作中常用后者,如`char c[10]=&quot;hello&quot;`。示例代码展示了如何初始化及传递字符数组,并解释了为何未正确添加结束符`\0`会导致乱码。此外,还讨论了`scanf`函数读取字符串时忽略空格和回车的特点。
|
2天前
|
存储 编译器 C语言
【C语言篇】数组和函数的实践:扫雷游戏(附源码)
【C语言篇】数组和函数的实践:扫雷游戏(附源码)
8 0
|
3天前
|
程序员 编译器 数据处理
【C语言】深度解析:动态内存管理的机制与实践
【C语言】深度解析:动态内存管理的机制与实践
|
3天前
|
编译器 C语言
【C语言】指针篇-深入探索数组名和指针数组- 必读指南(2/5)
【C语言】指针篇-深入探索数组名和指针数组- 必读指南(2/5)
|
1月前
|
存储 C语言
C语言程序设计核心详解 第十章:位运算和c语言文件操作详解_文件操作函数
本文详细介绍了C语言中的位运算和文件操作。位运算包括按位与、或、异或、取反、左移和右移等六种运算符及其复合赋值运算符,每种运算符的功能和应用场景都有具体说明。文件操作部分则涵盖了文件的概念、分类、文件类型指针、文件的打开与关闭、读写操作及当前读写位置的调整等内容,提供了丰富的示例帮助理解。通过对本文的学习,读者可以全面掌握C语言中的位运算和文件处理技术。
|
1月前
|
存储 C语言
C语言程序设计核心详解 第七章 函数和预编译命令
本章介绍C语言中的函数定义与使用,以及预编译命令。主要内容包括函数的定义格式、调用方式和示例分析。C程序结构分为`main()`单框架或多子函数框架。函数不能嵌套定义但可互相调用。变量具有类型、作用范围和存储类别三种属性,其中作用范围分为局部和全局。预编译命令包括文件包含和宏定义,宏定义分为无参和带参两种形式。此外,还介绍了变量的存储类别及其特点。通过实例详细解析了函数调用过程及宏定义的应用。
|
1月前
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。
|
1月前
|
存储 C语言
C语言程序设计核心详解 第九章 结构体与链表概要详解
本文档详细介绍了C语言中的结构体与链表。首先,讲解了结构体的定义、初始化及使用方法,并演示了如何通过不同方式定义结构体变量。接着,介绍了指向结构体的指针及其应用,包括结构体变量和结构体数组的指针操作。随后,概述了链表的概念与定义,解释了链表的基本操作如动态分配、插入和删除。最后,简述了共用体类型及其变量定义与引用方法。通过本文档,读者可以全面了解结构体与链表的基础知识及实际应用技巧。