数组的简单介绍

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>

/*int main()
{
    int i,m, sc[5], n = 5;         //sc[5]有5个数据  sc[0] 到sc[4]地址只到4
    for (i = 0; i < 5; i++)
        scanf("%d", &sc[i]);
    for (m = 0; m < 5; m++)       //等价于for(i=4;i>=0;i--)  i一定要从4 开始 
        printf("%d", sc[m]);
    printf("\n");
    //printf("%d", sc[5]);//没有 随便给一个数
    return 0;
}*/

/*int main()
{
    int sc[12];
    int n = 12;
    int t;
    printf("输入12个整数:\n");
    for (int i = 0; i < 12; i++)
        scanf("%d", &sc[i]);
    for (int i = 0; i < n - 1; i++)
        for (int j = 0; j < n - 1 - i; j++)
            if (sc[j]>sc[j+1])
            {
                t = sc[j]; sc[j] = sc[j + 1]; sc[j + 1] = t;
            }
    printf("第二大的数是:%d\n", sc[10]);
    return 0;

}*/

/*
* 数组初始化的几种:
* int sc[5]={1,2,3,4,5};
* int sc[5]={1,2,3}前3个数据提供初值,后面的2个元素值为0
* int sc[5]={0,0,0,0,0}全部为0
* int sc[]={1,2,3,4,5}数据个数已经确定 可以不用指定数组长度
*/
/*int main()
{
    int sc[10] = { 0 };
    
    for (int i = 0; i < 10; i++)
        printf("%d", sc[i]);
    return 0;
}*/ //10个 0

//从键盘输入5个数,求其中最大值 并且输出
/*int main()
{
    int i, a[5], max;
    int p;
    for (i = 0; i < 5; i++)
        scanf("%d", &a[i]);
    max = a[0];                  //把数组第一个数据给max,利用for一个个比较
    for (i = 1; i < 5; i++)
        if (max < a[i])
        {
            max = a[i];
            p = i;
        }
    printf("最大值为%d,下标为%d\n", max,p);
    return 0;
}*/

//冒泡排序法  对数据进行排序,两两比较决定上升还是下降,得出升序序列还是降序序列
//输入6个数 从小到大排序
/*int main()
{
    int a[6], n = 6;
    int i;
    int j;//内部比较的次数
    int t;//用来进行3部交换
    printf("请输入6个数据:\n");   //输入数据
    for (i = 0; i < n; i++)
        scanf("%d", &a[i]);
    for (i = 0; i < n - 1; i++)//有6个数 所以要比较5(n-1)轮
        for (j = 0; j < n - 1 - i; j++)//内部次数  第一轮5次 第二轮4次 所以为 n-1-i次
            if (a[j] > a[j + 1])
            {
                t = a[j]; a[j] = a[j + 1]; a[j + 1] = t;
            }
    printf("排序后的数据为:\n");
    for (i = 0; i < n; i++)
        printf("%d ", a[i]);
    return 0;
}
*/
/*    第一轮    
输入  次数1       2        3         4         5
16        10        10        10        10          10
10        16        11        11        11        11
11        11      16          16        16          16
17        17      17        17        15        15 
15        15      15        15        17        14
14        14        14        14        14        17//可以理解为把最大的数放在最底下了 下一轮就不需要他了
第二轮
次数  1     2    3    4
10    10    10   10   10
11    11    11   11   11
16    16    16   15   15
15    15    15   16   14
14    14    14   14   16             //两两比较 并且吧最大的放在最下面   
*/
//按照姓名对班上的同学的名字从小到大排序(首字母排序)用冒泡排序法和strcmp()函数来比较字符串大小,用strcpy()函数来进行复制,用来3部交换
/*int main()
{
    char xsname[6][10] = { "张三丰","李思平","王武法","马事顺","白启明" ,"周凯旋" };
    int i, j;
    int n = 6;
    char t[10];//用来交换
    printf("排序前同学的名字为:\n");
    for (i = 0; i < n; i++)
        printf("%s ", xsname[i]);
    //接下来用冒泡排序
    for (i = 0; i < n - 1; i++)//6个同学比较5轮
        for (j = 0; j < n - 1 - i; j++)//每一轮比较5-i次
            if (strcmp(xsname[j], xsname[j + 1]) > 0)
            {
                strcpy(t, xsname[j]); strcpy(xsname[j], xsname[j + 1]); strcpy(xsname[j + 1], t);
            }
    printf("\n排序后同学的名字为:\n");
    for (i = 0; i < n; i++)
        printf("%s ", xsname[i]);
    return 0;
}*/

/*字符数组  定义  char 数组名[常量表达式]
* char c[7]
* c[0]=w c[1]=e c[2]=l  c[3]=z c[4]=b  c[5]=a  c[6]=h   0到6六个下标

* 字符数组的初始化:
* char c[5]={‘H',’e','l','l','o'};
* 若提供的字符个数小于数组长度,则只将这些字赋值给数组中前面的那些元素,其余的元素自动使用\0填充
* 也可以不指定数组长度

* 字符串与字符串结束标志 
* 用null即\0终止  \0即为ASCII码值为0的字符
* char c[6]={"Hello"}; 自动为c[5]使用null字符填充
* 大括号可以省略,数组长度可以省略说明
*/

/*int main()
{
    char c[6] = { 'H','e','l','l','o','\0' };
    int i;
    for (i = 0; i < 5; i++)
        printf("%c", c[i]);//打印字符用%c
    return 0;
}*/
//Hello

/*int main()
{
    char c[6];
    int i;
    for(i=0;i<5;i++)
    scanf("%c", &c[i]);  //注意不要空格 空格也算一个字符
    c[5] = '\0';//字符串结束标志
    for (i = 0; i < 5; i++)
    printf("%c", c[i]);
    return 0;
}*/

/*int main()
{
    char c[6] = { 'H','e','l','l','o','\0' };
    printf("%s", c);  //%s直接输出字符串
    return 0;
}*/

/*int main()
{
    char c[6];
    scanf("%s", c);//可以没有取地址符号 并且系统自动在输入的字符后面加一个’\0'结束符
    printf("%s", c);
    return 0;
}*/

//用gets 和 puts来操作
/*int main()
{
    char c[20];
    printf("请输入字符串\n");
    gets_s(c);
    printf("请输出字符串:\n");
    puts(c);
    return 0;
    }*/

/*字符串连接函数
* strcat(字符数组1,字符数组2) 把2连接到1后面,把1的\0删除 要求1必须足够长,能容纳所有的字符
* 否则会越界
*/

/*int main()
{
    char str1[20] = { "南京信息工程大学" };
    char str2[20] = { "欢迎你" };
    printf("字符串数组1为%s\n", str1);
    printf("字符串数组2为%s\n", str2);
    strcat(str1, str2);//#include<string.h>
    printf("合并之后的字符串为%s\n", str1);//南京信息工程大学欢迎你
    return 0;
}*/

/*字符串复制函数
strcpy(字符数组1,字符数组2);
会把2中的字符串拷贝到1中结束符也被拷贝了

*/

/*int main()
{
    char str1[20] = { "南京信息工程大学" };
    char str2[20] = { "欢迎你" };
    printf("字符串数组1为%s\n", str1);//南京信息工程大学
    printf("字符串数组2为%s\n", str2);//欢迎你
    strcpy(str1, str2);
    printf("复制后,字符串1为:%s\n", str1);//欢迎你
    printf("复制后,字符串2为:%s\n", str2);//欢迎你
    return 0;
}*/

/*字符串长度函数strlen不包括\0
*/
/*int main()
{
    char str1[] = "abcdef";
    printf("%d\n", strlen(str1));
    return 0;//6
}*/


/*strcmp函数 是进行字符串的比较
* strcmp(字符数组1,字符数组2)将各个字符对应的ASCII码值进行比较,从第0个字符开始比较,如果相等就比较下一个字符,直到遇见不同的字符,或者到字符串的末尾 
*字符数组1和2相等,则返回0
* 大于 返回1
* 小于 返回-1
*/

/*int main()
{
    char stra[] = { "abcdef" };
    char strb[] = "ABCDEF";
    char strc[] = "abcde";
    char a[] = "江苏";
    char b[] = "浙江";
    char c[] = { "浙江" };
    printf("stra和strb比较:%d\n", strcmp(stra, strb));
    printf("stra和strc比较:%d\n", strcmp(stra, strc));
    printf("strb和strc比较:%d\n", strcmp(strb, strc));
    printf("a和b比较:%d\n", strcmp(a, b));//江苏的首字母j 浙江首字母z j<z 所以为-1
    printf("b和c比较:%d\n", strcmp(b, c));
    return 0;
}*/

//二位数组的定义和引用
/*例如 int sc[3][4]
* 一个二维数组,可以看作一个一维数组的列表
* sc[0]  sc[0][0] sc[0][1] sc[0][2] sc[0][3] sc[0][4]
* sc[1]  sc[1][0] sc[1][1] sc[1][2] sc[1][3] sc[1][4]
* sc[2]  sc[2][0] sc[2][1] sc[2][2] sc[2][3] sc[2][4]
*/

/*二位数组的初始化

int a[3][4] = { {1,2,3,4},{5,6,7,8},{9,10,11,12} };
int a[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
int a[3][4] = { {1},{2,5},{0,9,7} };
1  0  0  0
2  5  0  0
0  9  7  0
如果对全部的数组元素都赋初值,则定义数组时对1维的长度可以不指定,但是二位的长度不能省略
int a[][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
等价于
int a[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
在定义时也可以支队部分元素赋初值而省略第一维的长度,但应分行赋初值
int a[][4]={{0,2,3},{},{1,10}}
0 2  3 0
0 0  0 0
1 10 0 0
*/

//两种办法输出  *
//             ***
//            *****
//             ***
//              *
/*int main()
{
    char a[5][6] = {"  *"," ***","*****"," ***","  *"};//注意是6而不是5 字符串结尾有/0
    int i;
    for (i = 0; i < 5; i++)
        printf("%s\n", a[i]);//是字符串而不是字符
    printf("\n");
    return 0;
}*/
/*int main()
{
    char a[5][6] = { "  *"," ***","*****"," ***","  *" };
    int i, j;
    for (i = 0; i < 5; i++)
    {
        for (j = 0; j < 5; j++)
            printf("%c", a[i][j]);
        printf("\n");
    }
    return 0;
}*/


//杨辉三角 每一列和最后1列元素为1,其他列元素为其左上方和正上方元素之和,请使用数组输出杨辉三角的前10行
/*
* 1
* 1 1
* 1 2 1
* 1 3 3 1
*/
/*int main()
{
    int a[10][10];
    int i, j;
    for (i = 0; i < 10; i++)//第一列和最后一列全为1
    {
        a[i][0] = 1;
        a[i][i] = 1;
    }
    for (i = 2; i < 10; i++)//从第3行第二列开始有不同
        for (j = 1; j < i; j++)//j<i 就行了后面的不需要
            a[i][j] = a[i - 1][j - 1] + a[i - 1][j];//规律的体现
    for (i = 0; i < 10; i++)
    {
        for (j = 0; j<=i; j++)//j<=i
            printf("%5d", a[i][j]);
            printf("\n");
        }    
    return 0;
}*/
//折半法查找数是否在数组中
/*int main()
{
    int a[7] = { 12,45,67,89,123,-45,71 };
    int n = 7;
    int i, j;
    int t;//先用冒泡排序法进行排序从小到大  不会的博主以前有讲解哦
    for (i = 0; i < n - 1; i++)
        for (j = 0; j < n - 1 - i;j++)
            if (a[j] > a[j + 1])
            {
                t = a[j]; a[j] = a[j + 1]; a[j + 1] = t;
            }
    printf("排序后的数为:\n");
    for (i = 0; i < n; i++)
        printf("%d ", a[i]);//将数组里的数排序好
    //接下来用折半法查找指定的数值
    int number;//你要查找的数
    printf("\n请输入需要查找的数值:");
    scanf("%d", &number);
    int start = 0,middle, end = n - 1;//数组开始和结尾的地址
    middle = ((start + end) / 2);//数组中间的位置
    int x=0;//用来标记是否找到
    while (start <= end)
    {
        if (number == a[middle])

        {
            x = 1; break;//找到就跳出循环
        }//这里给出排序完的数为:-45 12 45 67 71 89 123
        else if (number > a[middle])//假如为number为70 此时a[middle]=67  明显大于 所以在后半部分找(middle+1到end)
            start = middle + 1;//start变为4,middle变为(4+6)/2=5,end不变;  继续   -45 12 45 67 71 89 123 a[middle]=89 70<89应该是下一个else
        else if (number < a[middle])//70<89,就是在前半部分找(原来就是在 71 89 123中找,现在就是在 start到middle-1找)    end 变为middle-1为4,end=start=4;
            end = middle - 1;   //此时中间值也是4 实际上就一个数71了 70<71 又进入第一个else if 之后start变换后大于end 跳出循环 所以这个数不在数组中
        middle = (start + end) / 2;//新的中间的位置
    }
    if (x)
        printf("%d在数组中\n", number);
    else
        printf("%d不在数组中\n", number);
    return 0;
}*/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值