05==数组(查找,添加,删除,排序)

来源:互联网 发布:网络用语盘点 编辑:程序博客网 时间:2024/06/06 03:07

// int a

// int a[65]

/*

 1:数组:同类型的一组数,在类存上连续分布

 定义数组

 类型 数组名[数组元素的个数];

 int score[65];//里面有65int类型的数据,并且连续分布

 占有的内存=sizeof(类型)*元素个数

 引用数组的元素:数组名[下标],数组的下标从0开始

 数组元素不能越界访问

 

 数组定义后未初始化,里面的内容随机,是不确定的,不能用

 

 数组的下标必须是常量,不可以为变量

 例如 

 int len = 5;

 int a[len] = {1,2,3,4,5};//事件错误的

 

 */



#include <stdio.h>#include <string.h>int main(int argc, const char * argv[]) {    int a[5];//元素a[0]~a[4],可以通过a[i]来访问元素    printf("a[0]=%d\n",a[0]);        //遍历:挨个访问    for (int i = 0; i<5; i++)    {        printf("a[%d]=%d\n",i,a[i]);    }    a[4] = 100;//通过下标,设置数组元素   return 0;}


#include <stdio.h>

#include <string.h>





//int main()

//{

//    int a[5] = {1,2,3,4,5};//完全初始化,用集合的方式,给每个元素赋值

//   // a = {1,2,3,4,5};// 除了初始化,不可以给数组元素以集合方式进行集体赋值;

//    int b[5] = {1,0,0,0,0};//完全初始化

//    int c[5] = {1};//b[5]是等价的,后面的0是可以省略的.叫做部分初始化

//    int d[5] = {};//部分初始化,所有元素都是0,跟不带"="的不一样,

//    int e[ ] = {1,2,3,4,5};

//    int f[ ] = {1};

//    int g[ ] = {};

//    printf("sizeof(d)=%lu\n",sizeof(d));//sizeof(d)=20,他与里面是否存储内容没有关系.

//    printf("sizeof(e)=%lu\n",sizeof(e));//sizeof(e)=20,定义时省略数组的下标,是完全初始化;

//    printf("sizeof(f)=%lu\n",sizeof(f));//sizeof(f)=4,一个元素完全初始化.

//    printf("sizeof(g)=%lu\n",sizeof(g));//sizeof(g)=0,0个元素,完全初始化,不能使用,没有存储空间

//    for (int i = 0 ; i<5; i++)

//    {

//        printf("d[%d]=%d\n",i,d[i]);

//    }

//    return 0;

//}


//int main()

//{

//    int len = 5;

//    int a[5] = {1,2,3,4,5};

//    int a[len] = {1,2,3,4,5} //错误的示范

//    

//}


//int main()

//{

//    double score[5] = {};//score保存的是数组的首个元素地址.数组名是常量,数组元素才是变量,

//    double sum = 0;

//    printf("请输入五位学生成绩\n");

//    for (int i = 0 ; i<5; i++)//编译器是不能检查越界错误    for(int i = 0 ; i<80; i++)

//    {

//        scanf("%lf",&score[i]);

//        sum += score[i];

//    }

//    printf("学生成绩平均值是:%.2lf",sum/5);

//}


//int main()

//{

//    int a[5];

//    int a[5] = {43,54,32,21,7};

//    printf("请输入五个数\n");

//    for (int i = 0 ; i<5; i++)

//    {

//        scanf("%d",&a[i]);

//    }

//    printf("数组元素为:   ");

//    for (int i = 0 ; i<5; i++)

//    {

//        printf("%3d   ",a[i]);

//    }

//    printf(" \n");




//    for (int i = 0 ; i<5-1; i++)

//    {

//        for (int j = i+1 ; j<5; j++)

//        {

//            if (a[i]>a[j])

//            {

//                int temp = a[i];

//                a[i] = a[j];

//                a[j] = temp;

//            }

//        }

//        printf("%d次打印结果",i+1);

//        for (int i = 0 ; i<5; i++)

//        {

//            printf("%3d   ",a[i]);

//        }

//        printf("\n");

//    }

//    printf("排序后打印结果");

//    for (int i = 0 ; i<5; i++)

//    {

//        printf("%3d   ",a[i]);

//    }

    

    /*

    冒泡排序法

     */


//    for (int i = 0 ; i<5-1; i++)

//    {

//        for (int j = 0 ; j<5-i-1; j++)

//        {

//            if (a[j]>a[j+1])

//            {

//                int temp = a[j];

//                a[j] = a[j+1];

//                a[j +1] = temp;

//            }

//        }

//        printf("%d次打印结果",i+1);

//        for (int i = 0 ; i<5; i++)

//        {

//            printf("%3d   ",a[i]);

//        }

//        printf("\n");

//    }

//    printf("排序后打印结果");

//    for (int i = 0 ; i<5; i++)

//    {

//        printf("%3d   ",a[i]);

//    }

//}


//输出1 1 2 3 5 8 13 21 34 55

//a[i]=a[i-1]+a[i-2]



//int main()

//{

//    int a[20] = {};

//    //求数组的元素

//    for (int i = 0; i<20; i++)

//    {

//        if(i==0 || i==1)

//        {

//            a[i]=1;

//        }

//        else

//        {

//            a[i]=a[i-1]+a[i-2];

//        }

//        printf("%d  ",a[i]);//正序打印

//    }

//    printf("\n");

//    //逆序打印

//    for (int i = 19; i>=0; i--)

//    {

//        printf("%d  ",a[i]);

//    }

//}



/*

 数组常用的操作:

 查找,

 */


//int main()

//{

//    //在分数数组里查找是否有60,找到第一个就结束

//    int score[5] = {12,45,60,78,60},number = 60,count = 0;

//    int i;

//    for (i = 0; i<5; i++)

//    {

//        if (score[i] == number)//把所有符合条件的值都遍历出来

//        {

//            printf("score[%d]的成绩符合条件\n",i);

//            count++;//如果有符合的元素就记录一下;

//            continue;

//        }

//    }

//    if (count == 0)//如果遍历真个数组没有符合要找的元素

//    {

//        printf("没有符合条件的值");

//    }

//    return 0;

//}


//int main()

//{

//    int score[] = {12,45,60,78,60,78},max=score[0],count=0,min=score[0],j=0;//max记录最大数字,count记录最大数的角标;

//    for(int i=1;i<6;i++)

//    {

//        if (max<score[i])

//        {

//            max = score[i];//max记录最大数;

//            count = i;

//        }

//        if(min>score[i])

//        {

//            min = score[i];

//            j = i;

//        }

//    }

//    for(int m=0;m<6;m++)//把所有的相同的最大数全部打印出来

//    {

//        if (max == score[m])

//        {

//            printf("\n最大数值是score[%d]=%d",m,max);

//        }

//    }

//    printf("\n最小数值是score[%d]=%d",j,min);

//}


/*

 插入和删除

 有序序列 int a[10] ={23,45,60,88,98};

 删除一个元素60

 删除前 int a[10] ={23,45,60,88,98};

 删除后 int a[10] ={23,45,88,98};

 */

//int main()

//{

//    int a[10] ={23,45,60,88,98},valid = 5;//当前有效的元素个数,人为认为有效

//    int value = 60;

//    int pos = 2;//需要删除的元素的下标

    //1,后面的元素前移

    //待移动a[pos+1],最后一个元素a[valid-1]

    //前移 用前面的元素来接收 a[i-1]=a[i]

    //2,清理最后一个元素残留拷贝

//    for (int i=0; i<valid ; i++)

//    {

//        if (a[i] == value )//查找是否有需要删除的元素,如果有记录当前元素的下标

//        {

//            pos = i;

//        }

//    }

//    for(int i=pos;i<valid;i++)//定义从记录位置到数组末尾

//    {

//        a[i] = a[i+1];//记录位置之后开始依次赋值给前面的元素

//        if (i == valid-1)//当元素到最后的一个位置时,需要清除最后一个元素值

//        {

//            a[i]=0;

//        }

//    }

//    for (int i=0; i<10; i++)

//    {

//        printf("%d ",a[i]);

//    }

//


    

//    for (int i=pos+1; i<valid;i++)

//    {

//        a[i-1]=a[i];

//    }

//    for (int i=0; i<10; i++)

//    {

//        printf("%d ",a[i]);

//    }

//}




/*

 有序序列 int a[10] ={23,45,60,88,98};

 插入 65

 插入前  int a[10] ={23,45,60,88,98};

 插入后  int a[10] ={23,45,60,65,88,98};

 */


//int main()

//{

//    int a[10] ={23,45,60,88,98},valid = 5;

//    int pos = 0;//用来记录插入的下标

//    int value = 65;//用来记录需要插入的数字

//    for (int i=0; i<5; i++)

//    {

//        if (a[valid-1]<value)//判断是否需要插入的元素比数组所有元素大

//        {

//            pos=valid;

//            a[pos]=value;

//        }

//        if (a[i]>=value)//用来查找value插入的位置,并记录

//        {

//            pos = i;

//            break;//当找到这个元素后退出for循环;

//        }

//    }

//    for (int i=valid-1; i>=pos; i--)//需要移动的边界,右边界为valid-1,左边界为pos

//    {

//        a[i+1]=a[i];//把当前的有效元素移动到后一位

//    }

//    a[pos]=value;//原来左边界位置已经移动,直接将需要插入的元素赋值即可

//    for (int i=0; i<10; i++)

//    {

//        printf("%d ",a[i]);

//    }

//}


/*

 字符数组:数组里存储的是字符

 int a[10]

 char str[100]

 */

//int main()

//{

//    char str[100];//字符数组,里面有100char;只定义没有初始化,里面的字符是不确定的

//    char str1[10] = {};//部分初始化,0

//    char str2[10] = {'h','e','l','l','o'};//前面是hello后面是'\0'=0;

//    char str3[10] = "hello";//和上面是等价的,用一个常量字符串来初始化字符数组,部分初始化,

//    char str4[] = "hello";//完全初始化,sizeof(str4)=6,系统给字符串加上一个结束符{'h','e','l','l','o','\0'};

//    //for循环遍历数组的元素

//    printf("sizeof(str4)=%lu\n",sizeof(str4));

//    for (int i=0; i<10; i++)

//    {

//        printf("str3[%d]=%c \n",i,str3[i]);

//    }

//    return 0;

//}



/*

 sizeof() 运算符存储的概念,数据类型或者表达式,数据在内存中占有的字节数,与里面存储的内容没有关系

 strlen() 字符串处理函数 表示字符串的有效长度,从首地址开始到'\0'结束;'\0'不是有效字符,不统计;头文件<string.h>,与当前字符串中存储的字符(内容)有关系.

 */

//int main()

//{

//    char str[10]="hello";

//    char str1[10]="hello\0abc";

//    char str2[]="hello";

//    for(int i=0;i<10;i++)

//    {

//        printf("str1[%d]=%c\n",i,str1[i]);

//    }

//    printf("%s\n",str1);//str地址开始,打印到'\0'结束;

//    printf("sizeof(str2)=%lu\n",sizeof(str2));

//    printf("strlen(str2)=%lu\n",strlen(str2));

//    printf("sizeof(str1)=%lu\n",sizeof(str1));

//    printf("strlen(str1)=%lu\n",strlen(str1));

//}


/*

 练习:char str[100]= "hello";中的l替换成L

 */



//int main()

//{

//    char str[100]= "hello";

//    for(int i=0;i<strlen(str);i++)

//    {

//        if(str[i] == 'l')

//        {

//            str[i] = str[i]-32;

//        }

//    }

//    printf("%s",str);

//}



//int main()

//{

//    int a[10]={23,45,600,88,90};

//    int number = 600;//待插入的数据

//    int pos=5;//插入的位置,默认插入到最后

//    for(int i=0;i<5;i++)

//    {

//        if(a[i]>number)

//        {

//            pos = i;//pos=第一个比number大的数的位置

//            break;

//        }

//    }

//    printf("pos=%d\n",pos);

//}



//int a[5]={60,23,90,88,45}

/*

 选择排序:每一次从待排序的数据元素中选出最小(或最大的)大一个元素,存放在序列的起始位置,直到全部待排序的数据排完

 通过交换把最小的元素放到前面

 

待排序: 60,23,90,88,45

 第一次:23],60,90,88,45.  i=0.无序数列从开始到最后结束a[0]~a[4],选出最小的数,放在a[0]位置

 第二次:23,45],90,88,60//第二次直接从23之后开始对比,23不需要参加排序 i=1.无序数列从a[1]~a[4],选出最小的数,放在a[1]位置

 第三次:23,45,60],88,90   i=2.无序数列从a[2]~a[4]

 第四次:23,45,60,88],90

 

 N个元素的无序数组,每次排序拿出一个添加到有序数组,N-1次排序,剩下一个必然是有序的

 i0开始,每次无序数列a[i]~a[4],选出最小的放在a[i]位置

 */




//int main()

//{

//    int a[5]={60,23,90,88,45};

//    int len = sizeof(a)/sizeof(a[0]);//数组中元素个数

//    int k;

//    int temp;

//    for(int i=0;i<len-1;i++)

//    {

//        k = i;//a[k]是当前最小的数,

//        for (int j=i+1; j<len; j++)

//        {

//            //a[k] a[j]相比,如果a[j]更小,更新k=j

//            if (a[j]<a[k])

//            {

//                k = j;

//            }

//        }

//        //a[k]放到a[i]的位置,交换

//        if(k != i)

//        {

//            temp = a[k];

//            a[k] = a[i];

//            a[i] = temp;

//        }

//    }

//    for (int i=0; i<len; i++)

//    {

//        printf("%d ",a[i]);

//    }

//}



/*

 int a[5]={60,23,90,88,45};

 冒泡排序:从左往右,依次捉对,如果前面的数比后面的数大,就交换

 待排序: 60,23,90,88,45

 第一对: [23,60],90,88,45

 第二对: 23,[60,90],88,45

 第三对: 23,60,[88,90],45

 第四对: 23,60,88,[45,90]-->经过一次排序(4),把最大的数传到了最后面;产生一个有序数,在最后面;每次产生一个最大的数,放在后面有序数列

 

 N个数的数组,N-1次排序,有序数列有N-1,剩下一个必然是最小的;

 

 第一次捉了4=len-1

 a[0]~a[len-1]捉对

 第二次 i=1

 a[0]~a[len-1-1]捉对

 i

 a[0]~a[len-1-i]一共捉len-1-i

 

 */



//

//int main()

//{

//    int a[5]={60,23,90,88,45};

//    int len = sizeof(a)/sizeof(a[0]);//数组中元素个数

//    for(int i=0;i<len-1;i++)

//    {

//        for (int j=i; j<len; j++)

//        {

//            if (a[i]>a[j])

//            {

//                int temp = a[i];

//                a[i] = a[j];

//                a[j] = temp;

//            }

//        }

//    }

//    for (int i=0; i<len; i++) {

//        printf("%d ",a[i]);

//    }

//}


//int main()

//{

//    int a[5]={60,23,90,88,45};

//    int len = sizeof(a)/sizeof(a[0]);//数组中元素个数

//    for(int i=0;i<len-1;i++)//需要排序的次数

//    {

//        //无序数列a[0]~a[len-1-i],去两两捉对比较

//        for(int j=0;j<len-1-i;j++)

//        {

//            //a[j]a[j+1]对比

//            if(a[j]>a[j+1])

//            {

//                int temp = a[j];

//                a[j] = a[j+1];

//                a[j+1] =temp;

//            }

//        }

//    }

//    for (int i=0; i<len; i++)

//    {

//        printf("%d ",a[i]);

//    }

//}


/*

 二维数组:数据的矩阵;

 a[2][3] 23

 int a[2][3];定义

 第一行: {a[0][0],a[0][1],a[0][2];//i=0} = a[0]数组

 第二行: {a[1][0],a[1][1],a[1][2];//i=1} = a[1]数组

 二维数组可以看成是一维数组的数组(行数组)

 */


//int main()

//{

////    int a[2][3] = {1,2,3,4,5,6};//完全初始化;

////    int a[2][3] = {{1,2,3},{4,5,6}};//和上面等价;

////    int b[2][3] = {{1},{2,5}};

//    int c[ ][3] = {1,2,3,4,5,6};//二维数组的省略形式,可以省略行,但是列必须有,告诉系统每行元素个数;

//    //遍历访问

//    for(int i=0;i<2;i++)

//    {

//        for(int j=0;j<3;j++)

//        {

//            printf("c[%d][%d]=%d ",i,j,c[i][j]);

//        }

//        printf("\n");

//    }

//}


/*输出杨辉三角

 

 请输入行数:7

 1

 11

 12 1

 13 3 1

 14 6 4 1

 15 10 10 5 1

 16 15 20 15 61

 */

//int main()

//{

//    int a[20][20]={0};

//    int n;

//    printf("请输入行数:");

//    scanf("%d",&n);

//    for(int i=0;i<n;i++)//行数

//    {

//        for(int j=0;j<=i;j++)//列数

//        {

//            if ((i == j) || (j == 0))//每行的开始,结束赋值为1

//            {

//                a[i][j] = 1;

//            }

//            else

//            {

//                a[i][j] = a[i-1][j] + a[i-1][j-1];//结果为上一行对应前两位的数之和

//            }

//            printf("%d \t",a[i][j]);

//        }

//        printf("\n");

//    }

//}


//int main()

//{

//    char str[100] = {};//一维的字符数组,可以存储一个字符串,有效字符数99,要预留结束符

//    char str1[5] = {};//接收4个有效字符;非常容易出界,不要使用

//    printf("请输入一个字符串\n");

//    scanf("%s",str1);//接收字符串,但是容易越界,例如输入:wwwwwwwww;输出结果是wwwwwwwww;

//    printf("%s",str1);//str1首地址开始,打印到'\0'结束;

//    

//}


//练习: char str[5][10]接收5个字符串

/*

 char str[5][10] 二维数组,5个行数组的数组,每个行数组最多接收99个有效字符

 5个行数组: str[0],str[1],...,str[4]

 */

int main()

{

    char str[5][100] = {};

    for(int i=0;i<5;i++)

    {

        printf("请输入一个字符串:\n");

        scanf("%s",str[i]);//str[i]是个数组,就是str[i][0]的地址,元素str[i][0]~str[i][0]===========>多理解数组地址????

    }

    for(int i=0;i<5;i++)

    {

        printf("%s\n",str[i]);

    }

}

0 0
原创粉丝点击