C语言——一维数组

文章介绍了C语言中一维数组的不同表示形式,包括静态存储的`static`关键字的使用。通过示例展示了如何初始化和操作数组,以及如何生成随机数。此外,还详细讲解了冒泡排序和二分查找算法,并提供了具体的代码实现,包括数组的升序和降序排序,以及在已排序数组中使用二分查找法查找特定元素。

一维数组的表现形式

行如:数组名+[常量表达式]

代码展示:

//表现形式1
array[12]//表示共有12个数
//数组下标范围为[0,11]


//表现形式二
#define N 12
array[N]//与array[12]表示的含义相同

静态存储的key word——static

表示的方法:static int a;默认初始化为0,在a被赋值的情况下又不一样

具体可看这个链接,比较详细!http://t.csdn.cn/ozjvGhttp://t.csdn.cn/ozjvG

int f(int n)
{
    static int a=1;//表示a不会被初始化,会被留下来
    n=+a++;
    return n;
}
int main()
{
    int a=3,s;
    s=f(a);//s=3+1=4
    s=s+f(a);//s=4+3+2=9
    printf("%d",s)
}

随机数种子   

随机输入一些数值,在C语言中要用到随机函数rand()和srand()必须使用#include<stdlib.h>和#include<time.h>的头文件 。

如果要生成一个区间内的随机数的写法为:int x=1+rand()%n表示:[1,n-1]

代码展示:

int a[12];
for(int i=0;i<12;i++)
{
    a[i]={60+rand()%146}//表示生成的数组范围在[60,205]

}

一维数组的排序 

  1. 冒泡排序法
  2. 折半排序法

以下的代码将前面两种方法都用到了,而且可以实现多次查询!

代码展示:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 100
int main()
{
	srand(time(NULL));
	int array[N];
	printf("排序前:");
	for (int i = 0; i < N; i++)
	{
		array[i] = { 66 + rand() % 600 };
		printf("%5d", array[i]);
	}
	printf("\n");
	int t;
	printf("由大到小排序:");
	for (int i = 0; i < N; i++)
		for (int j = 0; j < N - 1 - i; j++)
		{
			if (array[j] < array[j + 1])
			{
				t = array[j];
				array[j] = array[j + 1];
				array[j + 1] = t;
			}
		}
	for (int i = 0; i < N; i++)
		printf("%5d", array[i]);
	printf("\n数据查询\n");
	int X;
	int top, mid, bottom, flag = 0, location = 0;
	printf("请输入你要查的数据:");
	while (flag == 0)
	{

		scanf_s("%d", &X);
		top = N - 1;
		bottom = 0;
		while (bottom <= top)
		{
			mid = (bottom + top) / 2;
			if (X == array[mid])
			{
				location = mid;
				printf("%d in array[%d].\n", X, location);
				printf("----查找完成----\n", X, location);
				flag = 1;
				break;
			}
			else if (X < array[mid])
				bottom = mid + 1;
			else
				top = mid - 1;
		}
		if (bottom > top)
			printf(" %d 不存在!\n请重新输入你要查的数据:", X);
	}

	system("pause");
	return 0;
}

小牛试刀🔪

 例1:

        8个学生的大学计算机成绩分别为:78,58,69,87,96,74,81,60。求这八个学生的平均成绩以及大于平均成绩的人数。

#include<stdio.h>
#include<stdlib.h>
#define N 8
int main()
{
    int t,grades[N] = { 78,58,69,87,96,74,81,60 };
    float sum = 0;
    printf("8位大学生的成绩为:");
    for (int i = 0; i < N; i++)
    {
        printf("%5d", grades[i]);
    }
    printf("\n");
    for (int i = 0; i < N; i++)
    {
        sum = sum+grades[i];
    }
    float avergrade = sum / 8.0;
    printf("8位大学生的平均成绩位:%.2f", avergrade);
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N - 1 - i; j++)
        {
            if (grades[j] < grades[j + 1])
            {
                t = grades[j];
                grades[j]= grades[j + 1];
                grades[j + 1] = t;
            }
        }
    }
    printf("\n分数由高到低:");
    for (int i = 0; i < N; i++)
        printf("%5d", grades[i]);
    printf("\n");
    int num = 0;
    for (int i = 0; i < N; i++)
    {
        if (grades[i] > avergrade)
        {
            num = num + 1;
        }
    }
    printf("大于平均成绩的有%d人\n",num);

    system("pause");
    return 0;
}

    例2:                                                                                            使用随机函数初始化一个具有20个元素的一维数组,使其值在60到205之间,输出这20个数组元素,每行输出5个。            

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 20
int main()
{
    srand(time(NULL));
    int array[N];
    int num = 0;
    for (int i = 0; i < N; i++)
    {
        array[i] = { 60 + rand() % 146 };
        printf("%5d", array[i]);
        num++;
        if(num % 5 == 0)
            printf("\n");
    }
    system("pause");
    return 0;
}

 例3:

        有一维整型数组array:{96,35,12,58,78,90,587,21,0,-65,106,52},编程实现用冒泡排序法对array按照由大到小的顺序进行排序,输出排序前后的数组。

#include<stdio.h>
#include<stdlib.h>
#define N 12
int main()
{
    int t,array[12] = { 96,35,12,58,78,90,587,21,0,-65,106,52 };
    printf("排序前:");
    for (int i = 0; i < N; i++)
        printf("%5d",array[i]);
    printf("\n");
    printf("从大到小排序:");
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N - 1 - i; j++)
        {
            if (array[j] < array[j + 1])
            {
                t = array[j];
                array[j] = array[j + 1];
                array[j + 1] = t;
            }
        }
    }
    for (int i = 0; i < N; i++)
        printf("%5d",array[i]);
    printf("\n");
    system("pause");
    return 0;
}

例4:

        某数组已按照从大到小的顺序排列,其数组元素为:{98,87,81,79,52,49,33,21,18,6},编程使用二分查找法查找81是否在该数组中,若在该数组中,输出“81在该数组中的第X位”(X为数组中的第几个数),否则输出“81不在数组中”。

#include<stdio.h>
#include<stdlib.h>
#define N 10
int main()
{
    int top = N - 1;//
    int bottom = 0;//
    int array[N] = { 98,87,81,79,52,49,33,21,18,6 };
    printf("排序前:");
    for (int i = 0; i < N; i++)
        printf("%5d", array[i]);
    int X, location,flag=0;
    printf("\n请输入要查找的值:");
    scanf_s("%d", &X);
    while (bottom <= top)
    {
        int mid = (top + bottom) / 2;
        if (X == array[mid])
        {
            flag = 1;
            location = mid;
            printf("%d为数组中的第%d个数\n", X, location + 1);
            break;
        }
        else if (X > array[mid])
            top = mid - 1;
        else
            bottom = mid + 1;
    }
    if (flag == 0)
        printf("%d不存在!\n", X);
    else
        printf("%d在数组array[%d]中\n", X, location );
    
    system("pause");
    return 0;
}

记得赞+关注哦!收藏不迷路!

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             

评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

是先森丫

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

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

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

打赏作者

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

抵扣说明:

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

余额充值