part.1 验证性部分
1.数据中的数据是连续存放的,5个地址连续
#include <stdio.h>
const int N=5;
int main() {
int a[N] = {1, 2, 3, 4, 5};
int i;
for(i=0; i<N; i++)
printf("%d: %d\n", &a[i], a[i]);
return 0;
}
改变数组类型:
char型
#include <stdio.h>
const int N=5;
int main() {
char a[N] = {'a', 'b', 'c', 'd', 'e'};
int i;
for(i=0; i<N; i++)
printf("%d: %c\n", &a[i], a[i]);
return 0;
}
注意:字母要用单引号以表示字符常量
double型
#include <stdio.h>
const int N=5;
int main() {
double a[N] = {1,2,3,4,5};
int i;
for(i=0; i<N; i++)
printf("%d: %.2lf\n", &a[i], a[i]);
return 0;
}
(为什么实验4里%d是改成%.2f,而不是%.2lf ?)
part.2
一维数组的定义,注意下标从0开始
#include <stdio.h>
int main() {
int a[5];
a[0] = 1;
a[1] = 2;
a[2] = 3;
a[3] = 4;
a[4] = 0;
printf("a[0] = %d\n", a[0]);
printf("a[1] = %d\n", a[1]);
printf("a[2] = %d\n", a[2]);
printf("a[3] = %d\n", a[3]);
printf("a[4] = %d\n", a[4]);
return 0;
}
下面用循环输出,并对数组初始化
#include <stdio.h>
int main() {
int a[5]={1,2,3,4,0};
int i=0;
while(i++<5)
printf("a[%d] = %d\n", i-1, a[i-1]);
return 0;
}
利用循环,程序结构更加清楚。
对数组所有元素初始化时可以省略数组大小不写。
数组也可以部分初始化,从下标为0的数组向后依次初始化,剩下的未被初始化的数组系统自动赋值为0。
(数组a【 】括号里的数是要一个常量。在part.1中,a[N]中N是一个常量;a[5]中5是常量;但a[ i ]中i是一个变量,即使它有值,为什么它还能输出 ?)
part.3 数组作为函数参数
一.数组元素作为函数参数
1.如part.1中的程序,数组作为printf()函数的实际参数。
2.也可以是自己定义的函数
#include <stdio.h>
const int N=5;
void print(int x);//输出数组
int main() {
int score[N] = {99, 82, 88, 97, 85};
int i;
for(i=0; i<N; i++)
print(score[i]);
printf("\n");
return 0;
}
void print(int x) {
printf("%d ", x);
}
二. 数组名作为函数参数
#include <stdio.h>
const int N=5;
void init(int a[],int n, int value);
int main() {
int b[N],i;
init(b,N,-1);
for(i=0;i<N;i++)
printf("%3d",b[i]);
return 0;
}
// 函数功能描述: 把一个含有n个元素的整型数组的元素值全都设为value
void init(int a[], int n, int value) {
int i;
for(i=0;i<n;i++)
a[i]=value;
}
在副函数init()中,int a[ ]表示的是数组地址,主函数中b(可以改成 &b[0] )是数组b[0]的地址,所以对a[ ]初始化就相当于对b[ ]初始化。
数组a[ ]作为形式参数。
part.4 冒泡法对一组数据排序
#include<stdio.h>
const int N=5;
void px(double b[],int n);
int main(){
double a[N];
printf("请输入%d个数据:\n",N);
for(int i=0;i<N;i++){
scanf("%lf",&a[i]);
}
px(a,N);
printf("从小到大:");
for(int i=0;i<N;i++)
printf ("%lf\t",a[i]);
printf("\n");
printf("从大到小:");
for(int i=N-1;i>N-6;i--)
printf ("%lf\t",a[i]);
printf("\n");
return 0;
}
void px(double b[],int n){ //从小到大排序
int i,j;
double m;
for(j=0;j<n-1;j++){
for(i=0;i<n-1-j;i++){
if(b[i]>b[i+1]){
m=b[i];
b[i]=b[i+1];
b[i+1]=m;
}
}
}
}
5个数的排序,每次循环把最大的数往后排
part.5
1.
// 功能描述:输入一组整数,输出最大值
#include <stdio.h>
int findMax(int a[], int n); // 函数声明
const int N=5;
int main() {
int a[N];
int max, i;
printf("输入%d个整数: \n", N);
// 利用循环输入N个整数给数组a
for(i=0;i<N;i++)
scanf("%d",&a[i]);
// 调用子函数max求数组a的最大元素值,并赋值给max
max=findMax(a,N);
// 输出最大值
printf("数组a中最大元素值为: %d\n\n", max);
return 0;
}
// 函数定义
// 功能描述:找出整型数组a中元素的最大值,并返回次此最大值
int findMax(int a[],int n){
int i;
for(i=0;i<n-1;i++)
if(a[i]>a[i+1])
a[i+1]=a[i];
return a[n-1];
}
找最大值只要用冒泡法把最大值移到最后,最后那个元素就是最大值。
2.使用冒泡法从大到小
#include <stdio.h>
const int N=4;
void output(char x[], int n); // 函数声明
// 排序函数声明
void sort(char a[],int n);
int main() {
char string[N] = {'2','0','1','9'};
int i;
printf("排序前: \n");
output(string, N);
// 调用排序函数对字符数组中的字符由大到小排序
sort(string,N);
printf("\n排序后: \n");
output(string, N);
printf("\n");
return 0;
}
// 函数定义
// 函数功能描述:输出包含有n个元素的字符数组元素
// 形参:字符数组,以及字符数组元素个数
void output(char x[], int n) {
int i;
for(i=0; i<N; i++)
printf("%c", x[i]);
}
// 函数定义
// 函数功能描述:对一组字符由大到小排序
// 形参:字符数组,以及字符数组元素个数
void sort(char b[],int n){
int i,j;
char m;
for(j=0;j<n-1;j++){
for(i=0;i<n-1-j;i++){
if(b[i]<b[i+1]){
m=b[i];
b[i]=b[i+1];
b[i+1]=m;
}
}
}
}
和part.4方法一样,比较的是字符对应的ASCII码的大小。
选做:
一个输入函数input(),在part.5第二题基础上做些修改
#任意字符从大到小
#include <stdio.h>
const int N=8;
void output(char x[], int n);//输出函数声明
void input(char x[],int n);//输入函数声明
void sort(char a[],int n);// 排序函数声明
int main() {
char string[N];
input(string,N);
printf("排序前: \n");
output(string, N);
// 调用排序函数对字符数组中的字符由大到小排序
sort(string,N);
printf("\n排序后: \n");
output(string, N);
printf("\n");
return 0;
}
// 函数定义
// 函数功能描述:输入包含有n个元素的字符数组元素
// 形参:字符数组,以及字符数组元素个数
void input(char x[],int n){
int i;
printf("请输入%d个字符:\n",N);
for(i=0; i<N; i++)
x[i]=getchar();
}
// 函数定义
// 函数功能描述:输出包含有n个元素的字符数组元素
// 形参:字符数组,以及字符数组元素个数
void output(char x[], int n) {
int i;
for(i=0; i<N; i++)
printf("%c", x[i]);
}
// 函数定义
// 函数功能描述:对一组字符由大到小排序
// 形参:字符数组,以及字符数组元素个数
void sort(char b[],int n){
int i,j;
char m;
for(j=0;j<n-1;j++){
for(i=0;i<n-1-j;i++){
if(b[i]<b[i+1]){
m=b[i];
b[i]=b[i+1];
b[i+1]=m;
}
}
}
}
字符对应的ASCII码 1.注意空格也是一个字符,而且空格ASCII码为0。。。
@ 64 2.要比较多少字符,改变N的值就好了。
f 102
5 53
P 80
# 35
= 61
* 42
[ 91
感想:数组用起来比以前方便多了,不用设多个变量,自己更容易理清程序逻辑。