数组习题

//

//  main.m

//  练习

//

//  Created by zhangxueming on 14/12/26.

//  Copyright (c) 2014年 zhangxueming. All rights reserved.

//



#import <Foundation/Foundation.h>

//

//  main.c

//  字符串练习

//

//  Created by zhangxueming on 14/12/24.

//  Copyright (c) 2014年 zhangxueming. All rights reserved.

//



#include <stdio.h>

//*****************************/

//                            */

//          数组习题           */

//*****************************/



#include <stdio.h>



//1.给定某个字符数组,统计数组中所有英文字符的个数,比如“123fdd”中有 3 个。

//int main(int argc, const char * argv[]) {

//    char str[100]={};

//    int cnt=0;

//    int len=0;//统计字母的个数

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

//        str[i] = getchar();

//        if (str[i]=='\n') {

//            str[i]='\0';//让字符数组中的字符以'\0'结束

//            break;

//        }

//        cnt++;

//    }

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

//        if ((str[i]>='A' && str[i]<='Z') || (str[i]>='a'&& str[i]<='z')) {

//            len++;

//        }

//    }

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

//    return 0;

//}



//3.给定某个拥有 5 个元素的字符数组,数组的成员都有阿拉伯字符构成,试着将该数

//组转换成一个整数,比如字符数组的内容是:{‘1’,’2’,’3’,’3’,’2’} 则将被转换成 12332。

//#include <stdlib.h>

//#include <ctype.h>

//

//int main(int argc,const char *argv[])

//{

//    //atoi("123")//把字符串转换成整型数据"123"  ==> 123

//    //printf("%d\n", atoi("-12345adc"));

//    //printf("%d \n",digittoint('9'));//把0~f --> 0 ~ 15

//    char ch[5]={};

//    int num=0;

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

//        ch[i]=getchar();

//        ch[i]=ch[i]-48;

//        num=num*10+ch[i];

//    }

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

//    return 0;

//}



//5.给定一个完全由英文字符构成的数组,将数组中下标为偶数的字符都转换为大写(如

//果原来是大写则不变)。



//int main(int argc,const char *argv[])

//{

//    char ch[100]={};

//    int cnt =0;

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

//        ch[i]=getchar();

//        if(ch[i]=='\n')

//        {

//            ch[i]='\0';

//            break;

//        }

//        cnt++;

//    }

//

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

//        if (!(i%2) && (ch[i]>='a' && ch[i]<='z')) {

//            ch[i]-=32;

//        }

//        printf("%c", ch[i]);

//    }

//    printf("\n");

//    return 0;

//}



//6.给一个完全由英文字符构成的字符数组加密,加密原则如下,除了字符‘Z’和‘z’

//之外,每个字符变成 ASCII 码值比它大 1 的字符,也就是‘A’变成‘B’。‘Z’或

//者‘z’转化为‘A’或者‘a’。



//int main(int argc, const char *argv[])

//{

//    char ch[100]={};

//    int cnt=0;

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

//        ch[i]=getchar();

//        if (ch[i]=='\n') {

//            ch[i]='\0';

//            break;

//        }

//        cnt++;

//    }

//

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

//        if ((ch[i]>='A' && ch[i]<'Z')||(ch[i]>='a'&&ch[i]<'z')) {

//            ch[i]+=1;

//        }

//        else if(ch[i]=='Z')

//        {

//            ch[i] ='A';

//        }

//        else if(ch[i]=='z')

//        {

//            ch[i]='a';

//        }

//

//        printf("%c", ch[i]);

//    }

//    printf("\n");

//    return 0;

//}



//7.计算某个由英文、数字以及标点符号构成的数组的总宽度,其中英文字符的宽度为

//1cm,数字宽度为 0.5cm、标点符号宽度为 0.8cm。



float lengthChar(char ch)

{

    if ((ch>='A'&&ch<='Z')  || (ch>='a'&&ch<='z')) {

        return 1.0;

    }

    else if(ch>='0'&&ch<='9')

    {

        return 0.5;

    }

    else

    {

        return 0.8;

    }

}



//int main(int argc,const char *argv[])

//{

//    char ch[100]={};

//    int cnt=0;

//    float len=0;

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

//        ch[i]=getchar();

//        if (ch[i]=='\n') {

//            ch[i]='\0';

//            break;

//        }

//        cnt++;

//    }

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

//        len+=lengthChar(ch[i]);

//    }

//    printf("len = %.2f\n", len);

//

//    return 0;

//}



//8.接上题,如果规定行的宽度为 10cm,将某个字符长度超过 50 的字符串截断,恰好 使 10cm 宽的行能容纳。输出这个被截断的子数组。

//1234asd!@#$rtyukl;fghjk

//int main(int argc,const char *argv[])

//{

//    char ch[100]={};

//    char str[100]={};

//    int cnt=0;

//    float len=0;

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

//        ch[i]=getchar();

//        if (ch[i]=='\n') {

//            ch[i]='\0';

//            break;

//        }

//        cnt++;

//    }

//

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

//        len+=lengthChar(ch[i]);

//        if (len>10) {

//

//            break;

//        }

//        str[i]=ch[i];

//        printf("%c", str[i]);

//    }

//    printf("\n");

//    return 0;

//}



//9.给定某个整型数组,计算该数组所有偶数的和。

//10.给某个整型数组赋值,赋值规律如下,下标能被 3 整除的都赋值为 1,能被 5 整除

//的都赋值为 2,能被 7 整除的都赋值为 3,能被 3、5、7 任意两个或者 3 个都能整除

//的数赋值为 8,其余都赋值为 0.



//int main(int argc,const char *argv[])

//{

//    int a[100];

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

//        if (i%3==0) {

//            a[i]=1;

//            if (i%5==0||i%7==0) {

//                a[i]=8;

//            }

//        }

//        else if(i%5==0)

//        {

//            a[i]=2;

//            if (i%7==0) {

//                a[i]=8;

//            }

//        }

//        else if(i%7==0)

//        {

//            a[i]=3;

//        }

//        else

//        {

//            a[i]=0;

//        }

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

//    }

//    printf("\n");

//    return 0;

//}



//11.通过终端输入 10 个整数并将其保存在一个整型数组中,数字保存在数组中的顺序与

//下标正好相反,也就是第一个被输入的数放在数组最后一个元素中,最后一个输入

//的数字放到第一个元素中。

#include <stdio.h>



//int main(int argc,const char *argv[])

//{

//    int a[10];

//    for (int i=10-1; i>=0; i--) {

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

//    }

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

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

//    }

//    printf("\n");

//    return 0;

//}



//13.给定一个 5 个元素构成的整型数组,每个元素的值都在 0-9 之间,按照位置将其组

//成一个 5 位数并输出,例如 int a[5] = {1,2,2,3,7};则输出 73221。



//int main(int argc, const char *argv[])

//{

//    int a[5];

//    int num=0;

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

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

//    }

//    for (int i=4; i>=0; i--) {

//        num = num*10+a[i];

//    }

//    printf("%d\n", num);

//    return 0;

//}



//17.给定一个有 10 个整形数的元素,将前 5 个元素跟后 5 个元素做整体交换,比如

//{1,1,1,1,1,2,3,2,2,2}->{2,3,2,2,2,1,1,1,1,1}。

//int main(int argc, const char *argv[])

//{

//    int a[10];

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

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

//    }

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

//        int temp = a[i];

//        a[i]=a[i+5];

//        a[i+5]=temp;

//    }

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

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

//    }

//    return 0;

//}



//18.判断一个整型数组是否是对称数组,例如{1,2,3,3,2,1}和{1,6,8,1,8,6,1}都是对称数组。



//int main(int argc,const char *argv[])

//{

//    int a[100]={};

//    int cnt = 0;

//    int flag =0;//标志变量

//

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

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

//        cnt++;

//        if (getchar()=='\n') {

//            break;

//        }

//    }

//

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

//        if (a[i]!=a[cnt-i-1]) {

//            flag =1;

//        }

//    }

//

//    if (flag) {

//        printf("不是对称数组\n");

//    }

//    else

//    {

//        printf("是对称数组\n");

//    }

//    return 0 ;

//}



//int main(int argc,const char *argv[])

//{

//    int a[5];

//    int b[5];

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

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

//    }

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

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

//    }

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

//        a[i]=b[i]=a[i]+b[i];

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

//    }

//    printf("\n");

//    return 0;

//}



//21.给定一个能容纳 10 个元素的整型数组,现有 9 个元素,现在第 5 个元素的位置插入

//一个数字 88,后面的数字顺序后移。



//int main(int argc, const char *argv[])

//{

//    int a[10]={};

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

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

//    }

//

//    for (int j=8; j>=4; j--) {

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

//    }

//    a[4]=88;

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

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

//    }

//    return 0;

//}



//22.给定一个 10 个元素的整型数组,现在将第 2 个元素删除,后面的数组顺序前移。

//int main(int argc,const char *argv[])

//{

//    int a[10]={};

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

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

//    }

//    for (int i=1; i<9; i++) {

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

//    }

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

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

//    }

//    return 0;

//}



//25.给定一个整型数组,求该数组中第二大的数的下标。

//int main(int argc,const char *argv[])

//{

//    int a[20];

//    int cnt=0;

//    int max;

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

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

//        cnt++;

//        if (getchar()=='\n') {

//            break;

//        }

//    }

//    max=a[0];

//    for (int i=1; i<cnt; i++) {

//        if (a[i]>max) {

//            max = a[i];

//        }

//    }

//    int k=-1;//

//    int temp=0;

//    for (int i=0; i<cnt; i++) {//找到第一个不等于max的值赋值给temp

//        if (a[i]==max) {

//            continue;

//        }

//        temp = a[i];

//        k=i;

//        break;

//    }

//    if (k==-1) {//判断是否有第二大的值

//        return -1;

//    }

//

//    for (int i=0; i<cnt; i++) {//找第二大的值,记录下标

//        if (max==a[i]) {

//            continue;

//        }

//        if (temp<a[i]) {

//            temp = a[i];

//            k=i;

//        }

//    }

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

//    return 0;

//}



//30.给定一个英文句子,单词之间用 1 个空格分开,求出第 2 个单词的偏移位置。例如

//“Professor du comes from Korea”的偏移位置是 10。



//int main(int argc,const char *argv[])

//{

//    char str[100];

//    int cnt=0;

//    int index=0;

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

//        str[i]=getchar();

//        if (str[i]=='\n') {

//            str[i]='\0';

//            break;

//        }

//        cnt++;

//    }

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

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

//            index = i;

//            break;

//        }

//    }

//    printf("index = %d\n", index+1);

//    return 0 ;

//}



//32.给定两个字符数组,将这两个拼接起来放在第一个数组中(假定第一个数组足够长),

//比如“abc”和“123”构成“abc123”。

#include <string.h>



//int main(int argc,const char *argv[])

//{

//    char str1[100]={};

//    char str2[50]={};

//    scanf("%s%s",str1,str2);

//    int len1= (int)strlen(str1);//求字符串有效字符个数"qianfeng"

//    int len2= (int)strlen(str2);

//

//    for (int i=len1; i<len1+len2; i++) {

//        str1[i]=str2[i-len1];

//    }

//    printf("%s\n", str1);

//    return 0 ;

//}



//34.给定一个整型数组,数组的长度为 N(N>3),从数组中寻找一个连续的长度为 3 的

//子数组,要求该子数组的和最大。

//12345

//



//int main(int argc,const char *argv[])

//{

//    int a[100];

//    int cnt = 0;

//    int max;

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

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

//        cnt++;

//        if (getchar()=='\n') {

//            break;

//        }

//    }

//    if (cnt<=3) {

//        return -1;

//    }

//    max = a[0]+a[1]+a[2];

//    int k=0;

//    for (int i=1; i<cnt-2; i++) {

//        if (max<a[i]+a[i+1]+a[i+2]) {

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

//            k=i;

//        }

//    }

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

//

//    return 0 ;

//}



//35.给定两个长度一样的整型数组,判断两个数组是否相同,相同的原则是数组中的每 一个相互对应的元素的“和值”相同,“和值”是指元素对应的整数所有位的合,例 如:a[0]的值是 1112,b[0]的值是 23,则这两个元素“相同”。



int sumBit(int num)

{

    int sum=0;

    while (num) {

        sum+=num%10;

        num/=10;

    }

    return sum;

}



//int main(int argc, const char *argv[])

//{

//    int a[5];

//    int b[5];

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

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

//    }

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

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

//    }

//

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

//        if (sumBit(a[i])!=sumBit(b[i])) {

//            printf("两个数组不相等\n");

//            return -1;

//        }

//    }

//    printf("两个数组相等\n");

//    return 0;

//}



//36.给定两个字符数组,比较这两个字符数组的大小,比较的原则是字符数组中所有字 符的 ASCII 值相加后的和值,和值越大则字符数组越大。



//int main(int argc,const char *argv[])

//{

//    char str1[100];

//    char str2[100];

//    scanf("%s%s",str1,str2);

//    int sum1=0,sum2=0;

//    int len1 = (int)strlen(str1);

//    int len2 = (int)strlen(str2);

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

//        sum1+=str1[i];

//    }

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

//        sum2+=str2[i];

//    }

//    if (sum1 < sum2) {

//        printf("str1 < str2\n");

//    }

//    else if(sum1 == sum2)

//    {

//        printf("str1 == str2\n");

//    }

//    else

//    {

//        printf("str1 > str2\n");

//    }

//

//    return 0;

//}





//输入一串小写字母(以"."为结束标志),统计出每个字母在该字符串中出现的次数(若某字母不出现,则不要输出)。

//int main(int argc,const char *argv[])

//{

//    //aaabbabbccccc

//    //4004000050000

//    //

//    char str[100];

//    int cnt[100];

//    int len=0;

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

//        str[i]=getchar();

//        if (str[i]=='.') {

//            str[i]='\0';

//            break;

//        }

//        len++;

//        cnt[i]=1;

//    }

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

//        if (cnt[i]!=0) {

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

//                if (cnt[j]!=0 && str[i]==str[j]) {

//                    cnt[i]++;

//                    cnt[j]=0;

//                }

//            }

//        }

//    }

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

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

////    }

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

//        if (cnt[i]) {

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

//        }

//    }

//

//    return 0;

//}



//41.编写函数将一个n*n矩阵转置,例如:(****)

//1 2 3 4     1 5 3 4

//5 6 7 8 ->  2 6 2 7

//3 2 5 9     3 7 5 2

//4 7 2 3     4 8 9 3

//*/



//int main(int argc,const char *argv[]){

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

//                 {5,6,7,8},

//                 {3,2,5,9},

//                 {4,7,2,3}};

//

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

//        for (int j=i; j<4; j++) {

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

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

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

//        }

//    }

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

//        for (int j=0; j<4; j++) {

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

//        }

//        printf("\n");

//    }

//    return 0;

//}



//3.输入十个数,任意相邻的两个数不同,输出所有的递增,递减序列

//比如:

//输入:1 5 9 8 12 21 3 0 -1 9

//输出:

//1 5 9

//9 8

//8 12 21

//21 3 0 -1

//-1 9

//

//输入: 3 9 8 -11 4 21 8 -3 0 2

//输出:

//3 9

//9 8 -11

//-11 4 21

//21 8 -3

//-3 0 2



//int main(int argc, const char *argv[])

//{

//    int a[10];

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

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

//    }

//

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

//    for (int i=1; i<=8; i++) {

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

//        if ((a[i]>a[i-1] && a[i]>a[i+1]) || (a[i]<a[i-1] && a[i]<a[i+1])) {

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

//        }

//    }

//    printf("%d\n",a[9]);

//

//    return 0;

//}



//1. 有m个人围成一圈,开始报数,报道n,退出,问最后剩下的是几号。(从1号开始)

//比如:

//输入:5 3

//输出:

//4

//

//输入: 6 2

//输出:

//5



//0 0 0 4 0

//



//int main(int argc, const char *argv[])

//{

//    int a[100];

//    int m, n;

//    int cnt=0;//统计出局人数

//    int k=0;

//    int i;

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

//    if (m>100) {

//        return -1;

//    }

//    for (i=0; i<m; i++) {

//        a[i]=i+1;

//    }

//    i=0;

//    while (cnt<m-1) {

//        if (a[i]) {//计数

//            k++;

//        }

//        if (k==n) {//统计出局人数

//            k=0;

//            a[i]=0;

//            cnt++;

//        }

//        i++;

//        if (i==m) {//处理边界

//            i=0;

//        }

//    }

//    i=0;

//    while (!a[i++]);

//    

//    printf("%d\n", a[i-1]);

//    

//    return 0;

//}





//2. 输入两个数,第一个数决定一个nXn的矩阵,第二个数决定从1开始赋值,赋值的上限

//比如:

//输入:5 18

//输出:p q

//1  2  3  4  5

//16 17 18 0  6

//15 0  0  0  7

//14 0  0  0  8

//13 12 11 10 9

//

//输入: 4 12

//输出:

//1  2  3  4

//12 0  0  5

//11 0  0  6

//10 9  8  7



//#define RIGHT   1

//#define DOWN    2

//#define LEFT    3

//#define UP      4

//

//int main(int argc, const char * argv[]) {

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

//    int n, m;

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

//    if (n<1||m<1||m>n*n||n>20) {

//        return -1;

//    }

//    int type=RIGHT;//1:从左往右赋值 2:从上往下赋值 3:从右往左赋值4:从下往上赋值

//    int p=0,q=0;

//    int s1=n-1;

//    int s2=n-1;

//    int s3=0;

//    int s4=1;

//    int i=1;

//    while (i<=m) {

//        a[p][q]=i;

//        switch (type) {

//            case RIGHT:

//                if (++q==s1) {//判断是否到边界

//                    type = DOWN;

//                    s1--;

//                }

//                break;

//            case DOWN:

//                if (++p==s2) {

//                    type = LEFT;

//                    s2--;

//                }

//                break;

//            case LEFT:

//                if (--q==s3) {

//                    type = UP;

//                    s3++;

//                }

//                break;

//            case UP:

//                if (--p==s4) {

//                    type=RIGHT;

//                    s4++;

//                }

//                break;

//            default:

//                break;

//        }

//        i++;

//    }

//

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

//        for (int j=0; j<n; j++) {

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

//        }

//        printf("\n");

//    }

//    return 0;

//}





//4..输入10个数,找出出现次数最多的数 (如果多个并列,则按数字出现顺序分别输出)

//比如:

//输入:1 2 2 3 4 5 6 7 8 9

//输出:2

//数据结构: 定义一个整型数组 int count[10] 存储每个元素的个数, 开始时每个元素个数初始化为1

//

//算法:

//(1) 利用双层循环, 每一个元素都与后面一个元素比较, 如果两者相同, 则该元素次数+1,

//(2) 以上的算法中两个相同的元素的次数是一样的, 优化如下, 比较两个元素的时候, 如果两者相等, 则该元素次数+1, 后面的元素次数设置为0, 比较的时候再判断这个元素是否已经比较

//

//伪代码:

//

//定义数组保存每个元素次数

//

//使用双层循环遍历数组

//如果当前元素后后面元素相等, 并且后面的元素次数不为0

//当前元素次数+1, 后面的元素次数设置为0

//

//从保存每个元素次数的数组中查找最大的值



//a[10]

//1 2 2 3 4 3 4 5 8 5

//count[10]

//1 2 0 4 2 0 0 0 1 0

//

//int main(int argc,const char *argv[])

//{

//    int a[10];

//    int count[10];

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

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

//        count[i]=1;

//    }

//

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

//        if (count[i]) {

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

//                if (a[j]==a[i]) {

//                    count[i]++;

//                    count[j]=0;

//                }

//            }

//        }

//    }

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

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

////    }

//    //找最大值

//    int max = count[0];

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

//        if (max<count[i]) {

//            max=count[i];

//        }

//    }

//    //查找cnt最大值对应的数

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

//        if (max==count[i]) {

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

//        }

//    }

//    printf("\n");

//    return  0;

//}



//5.魔方阵是一个古老的智力问题,它要求在一个m*m的矩阵中填入1~m^2的数字(m为奇数),使得每一行、每一列、每条对角线的累加和都相等。请编程实现输入m,输出m*m的魔方阵出来。

//比如:

//输入:3

//输出:

//6 1 8   上一个数i=0 下一个数i=n-1  j--

//7 5 3   上一个数j=n-1 下一个数j=0  i--

//2 9 4   i++;

//(1)将1放在第一行中间一列;

//(2)从2开始直到n×n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列数加1/减1(例如上面的三阶魔方阵,5在4的上一行后一列);

//(3)如果上一个数的行数为1,则下一个数的行数为n(指最下一行);例如1在第一行,则2应放在最下一行,列数同样加1;

//(4)当上一个数的列数为1时,下一个数的列数应为n,行数减去1。例如2在第3行最后一列,则3应放在第二行第一列;

//(5)如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。例如按上面的规定,4应该放在第1行第2列,但该位置已经被占据,所以4就放在3的下面;



//int main(int argc,const char *argv[])

//{

//    int a[19][19]={};

//    int n;

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

//    if (!(n%2) || n>19 || n<3) {

//        return -1;

//    }

//    int k=1;

//    int i=0,j=n/2;

//    int tempi,tempj;//保存上一次的位置

//    while (k<=n*n) {

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

//        tempi =i;

//        tempj =j;

//        i--;

//        j--;

//        if (tempi==0) {

//            i=n-1;

//        }

//        if (tempj==0) {

//            j=n-1;

//        }

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

//            i=tempi+1;

//            j=tempj;

//        }

//        k++;

//    }

//

//    for (i=0; i<n; i++) {

//        for (j=0; j<n; j++) {

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

//        }

//        printf("\n");

//    }

//    return 0;

//}



//随机数问题

#include <stdlib.h>

#include <unistd.h>

#include <time.h>



/*int main(int argc,const char *argv[])

{

    //void     srand(unsigned);

    //int     rand(void);

    while (1) {

        //

        //time_t time(time_t *);

        //time(NULL)

        //srand((unsigned)time(NULL));//利用系统时间产生随机数种子

        int num = rand()%101;

        printf("num = %d\n" , num);

        sleep(1);

        //usleep(1000);

        

    }

    //    int a[100];

    //    srand((unsigned)time(NULL));

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

    //        a[i]=rand()%100;

    //    }

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

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

    //    }

    return 0;

}

*/





//atoi函数的实现



//实现一个函数,传递一个字符数组,返回字符数组中的整数值,并在main函数中输出。

//例如:

//输入:134a231b

//输出:134

//输入:-129cde

//输出:-129

/*#include <stdlib.h>

 

 int myatoi(char *src)

 {

 char *pstr=src;

 int num=0;

 int flag=1;

 while (*pstr==' ') {

 pstr++;

 }

 if (*pstr=='+') {

 pstr++;

 }

 else if (*pstr=='-') {

 flag=-flag;

 pstr++;

 }

 while (*pstr>='0' && *pstr<='9') {

 num =num*10+(*pstr-48);

 pstr++;

 }

 num*=flag;

 return num;

 }

 

 

 int main(int argc, const char * argv[]) {

 

 printf("%d\n", myatoi("123abe"));

 

 return 0;

 }*/





//实现一个函数,传递一个有10个整形元素的数组,将数组中的0全部移动到数组末尾,将非0的值移至开始(保持原来顺序不变),并在main函数中将转换的结果输出。

//例如:

//输入: 5 9 -1 0 2 8 0 3 7 0

//5 9 -1 2 8 0 3 7 4 0



//输出: 5 9 -1 2 8 3 7 4 0 0



//void  func(int *arr, int len)

//{

//    //int *p = arr;

//    int cnt = 0;//统计0的个数

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

//        if (*(arr+i)==0) {

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

//                *(arr+j) = *(arr+j+1);

//            }

//            *(arr+len-cnt-1)=0;

//            cnt++;

//            i--;

//        }

//    }

//}

//void  func(int *arr, int len)

//{

//    int *p = arr;

//    int cnt = 0;//统计0的个数

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

//        if (!(*p)) {

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

//                *(p+j) = *(p+j+1);

//            }

//            *(p+len-cnt-i-1)=0;

//            cnt++;

//            p--;

//            i--;

//        }

//        p++;

//    }

//}

//

//int main(int argc,const char *argv[])

//{

//    int a[10]={5,0,-1,0,2,8,0,3,7,0};

//    func(a, 10);

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

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

//    }

//    printf("\n");

//    return 0;

//}









//*****************************************/

//              字符串练习

//*****************************************/

//注:字符串的习题中有的地方用了 sscanf 跟sprintf 这两个函数,大纲中没有要求这两个函数,但是希望大家可以通过看官方文档自己把这两个函数学习下





#include <string.h>

//实现一个函数,传递两个字符数组,输出第二个字符数组在第一个字符数组中出现的次数。

//比如:

//输入:

//abcdfewabcssaba

//abc

//输出:2

//int main(int argc, const char *argv[])

//{

//    char *str1="abcdfewabcssaba";

//    char *str2="abc";

//    int cnt = 0;

//    char *pstr=str1;

//

//    while ((pstr = strstr(pstr, str2))) {

//        cnt++;

//        pstr+=strlen(str2);

//    }

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

//

//    return 0;

//}





//查找一个字符串2在字符串1中第一次出现的位置

//比如:

//输入

//asdfwd

//df

//输出为

//3

//

//输入

//hhff

//hf

//输出为

//2

#include <stdlib.h>

#include <string.h>

/*

 int main(int argc, const char * argv[]) {

 char *str = (char *)malloc(100*sizeof(char));

 char *substr = (char *)malloc(100*sizeof(char));

 if (!str || !substr) {

 return -1;

 }

 scanf("%s%s", str,substr);

 int index=0;

 

 char *pstr = strstr(str,substr);

 if (pstr) {

 index = (int)(pstr-str+1);

 }

 printf("%d\n", index);

 

 return 0;

 }*/



//int main(int argc,const char *argv[])

//{

//    char *str = (char *)malloc(100*sizeof(char));

//    if (!str) {

//        return -1;

//    }

//

//    //方法一

////    gets(str);

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

//    //方法二

//    //scanf("%[^\n]",str);

//    scanf("%[A-Z,a-z,0-9]",str);//必须是A-Z之间

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

//    return 0;

//}



//int main(int argc,const char *argv[])

//{

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

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

////    char ch;

////    //fflush(stdin);

////    getchar();

////    scanf("%c", &ch);

////    if (ch =='\n') {

////        printf("hello world\n");

////    }

////    printf("%s %c\n", str,ch);

//

//    char ch1 ;

//    ch1 = getchar();

//    printf("%c\n", ch1);

//

//    return 0;

//}



//查找一个字符串2在字符串1中所有出现的位置

//比如:

//输入

//asdfdfdfwd

//df

//输出为

//3 5 7

//

//输入

//hhfhf

//hf

//输出为

//2

//4



//int searchStringIndex(char *src, char *substr, int *index)

//{

//    int count = 0;

//    int len = (int)strlen(substr);

//    char *pstr = src;

//    while ((pstr = strstr(pstr, substr))) {

//        index[count++] = (int)(pstr-src)+1;

//        pstr+=len;

//    }

//    return count;

//}

//int main(int argc,const char *argv[])

//{

//    char *str = malloc(100*sizeof(char));

//    char *substr = malloc(100*sizeof(char));

//    int index[100]={};

//    if (!str || !substr) {

//        exit(-1);

//    }

//    scanf("%s %s", str,substr);

//

//    int cnt = searchStringIndex(str,substr,index);

//

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

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

//    }

//    printf("\n");

//

//    return 0;

//}



//int main(int argc,const char *argv[])

//{

//    int len = (int)strlen(NULL);//不能传入NULL

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

//    return 0;

//}



//字符串原地压缩。题目描述:“eeeeeaaaff" 压缩为 "e5a3f2"。

//字符串压缩算法,把s字符串压缩处理后结果保存在res中

//

//比如:

//输入

//aaaaeefggg

//输出为

//a4e2f1g3

//

//输入

//hhfhhhhff

//输出为

//h2f1h4h2



//char * compress(char *src, char *buf)

//{

//    char *pstr = src;

//    int cnt = 1;

//    char *pbuf = buf;

//    while (*pstr) {

//        if (*pstr == *(pstr+1)) {

//            cnt++;

//        }

//        else

//        {

//            pbuf += sprintf(pbuf,"%c%d", *pstr,cnt);

//            cnt = 1;

//        }

//        pstr++;

//    }

//    return buf;

//}

//

//int main(int argc,const char *argv[])

//{

//    char str[100]={};

//    char buf[200]={};

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

//

//    printf("%s\n", compress(str, buf));

//    return 0;

//}



//int main(int argc,const char *argv[])

//{

//    int a=100;

//    char *str = "hello world";

//    float f = 3.14;

//

//    char buf[100]={};

//    int len = sprintf(buf, "%f",f);

//    printf("%s\n", buf);

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

//

//    return 0;

//}



//字符串原地压缩。题目描述:"e5a3f2" 解压缩为 “eeeeeaaaff"。

//字符串压缩算法,把s字符串压缩处理后结果保存在res中

//

//比如:

//输入

//a14e2f1g3

//输出为

//aaaaeefggg

//

//输入

//h2f1h4h2

//输出为

//hhfhhhhff

//#include <ctype.h>

//

//int main(int argc,const char *argv[])

//{

//    char str[100]={};

//    char buf[1000]={};

//

//    char ch;

//    int cnt=0;

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

//

//    char *pbuf = buf;

//    char *pstr = str;

//    while (*pstr) {

//        sscanf(pstr,"%c%d",&ch,&cnt);

//        memset(pbuf, ch, cnt);

//        pbuf+=cnt;

//        pstr++;

//        while (isdigit(*pstr)) {

//            pstr++;

//        }

//    }

//    printf("%s\n",buf);

//

//    return 0;

//}



//求一个字符串s的最大连续递增数字子串。

//

//

//比如:

//输入

//f123fffwf3256789:abcd

//输出为

//123

//

//输入

//abcd345bbw1357f123

//输出为

//123



//#include <ctype.h>

//

//int main(int argc,const char *argv[])

//{

//    char str[100]={};

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

//    char *pstr = str;

//    int max=0;

//    char *pmax = NULL;

//    int cnt=0;

//    while (*pstr) {

//        if (isdigit(*pstr)) {

//            cnt = 1;

//            while ((*pstr == *(pstr+1)-1) && (*pstr!='9')) {

//                cnt++;

//                pstr++;

//            }

//            pstr++;

//            if (max < cnt) {

//                max = cnt;

//                cnt = 0;

//                pmax = pstr-max;

//            }

//        }

//        else

//        {

//            pstr++;

//        }

//    }

//    if (pmax) {

//        *(pmax+max)='\0';

//        printf("%s\n", pmax);

//    }

//    return 0;

//}





//字符串排序。比较三个字符串的大小,然后按从小到大的顺序将字符串输出。

//比如:

//输入

//asdfwd

//ddrwf

//ffweff

//输出为

//asdfwd

//ddrwf

//ffweff

//

//输入

//sgfgeasdfw

//aabbe

//wrwwdfaf

//输出为

//aabbe

//sgfgeasdfw

//wrwwdfaf



/*

 int main(int argc, const char *argv[])

 {

 char *pstr[20]={NULL};

 int cnt = 0;

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

 pstr[i] = calloc(100, sizeof(char));

 if (pstr[i]) {

 scanf("%s", pstr[i]);

 cnt++;

 }

 if (getchar() == '\n') {

 break;

 }

 }

 //排序

 for (int i=0; i<cnt-1; i++) {

 for (int j=0; j<cnt-i-1; j++) {

 if (strcmp(pstr[j], pstr[j+1])>0) {

 char *ptemp = pstr[j];

 pstr[j]= pstr[j+1];

 pstr[j+1] = ptemp;

 }

 }

 }

 for (int i=0; i<cnt; i++) {

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

 free(pstr[i]);

 pstr[i]=NULL;

 }

 return 0;

 }

 */



//memmem()

//void    *memmem(const void *srcmem, size_t size1, const void *submem, size_t size2)

//srcmem: 源内存块的地址

//size1:源内存块的大小

//submem: 子内存块的首地址

//size2: 查找字节个数



void *my_memmem(const void *srcmem,size_t len1,const void *submem,size_t len2)

{

    char *psrc = (char *)srcmem;

    

    for (int i=0; i<len1; i++) {

        char *ptmp = psrc;

        char *psub = (char *)submem;

        int j=0;

        while (*psrc == *psub) {

            psrc++;

            psub++;

            j++;

            if (j==len2) {

                return ptmp;

            }

        }

        psrc = ptmp+1;

    }

    return NULL;

}



//int main(int argc,const char *argv[])

//{

//    char srcmem[100]="hello world qian feng";

//    char submem[20]="world";

//    printf("%s\n", my_memmem(srcmem, 100, submem, 6));

//

//    return 0;

//}

//返回在两字符串中第一个相同的子串(大于1个字符),并将子串输出

//

//

//比如:

//输入

//adbAFEHHFS

//acwfagAFEf

//输出为

//AFE

//

//输入

//qfdgJKlin

//qdfgJKwfo

//输出为

//gJK



/*

 int main(int argc,const char *argv[])

 {

 char str1[100]={};

 char str2[100]={};

 scanf("%s%s", str1,str2);

 

 int len1 = (int)strlen(str1);

 int len2 = (int)strlen(str2);

 char *pstr = str2;

 char *ptmp=NULL;

 

 for (int i=0; i<len2-1; i++) {

 if ((ptmp = (char *)my_memmem(str1, len1,  pstr, 2))) {

 //printf("%s\n",ptmp);

 int j=2;

 while (*(ptmp+j) == *(pstr+j)) {

 j++;

 }

 *(ptmp+j)='\0';

 printf("%s\n",ptmp);

 break;

 }

 pstr++;

 }

 return 0;

 }*/





//泛型算法

//实现排序整型, 浮点 ,字符型

//从小到大

//冒泡排序



/*

 #include <math.h>

 

 int compare_int(void *a, void *b)

 {

 return *(int *)a-*(int *)b;

 }

 

 int compare_float(void *a, void *b)

 {

 

 if (fabs(*(float *)a-*(float *)b)<0.00005) {

 return 0;

 }

 else if(*(float *)a>*(float *)b)

 {

 return 1;

 }

 else

 {

 return -1;

 }

 }

 

 int compare_char(void *ch1, void *ch2)

 {

 return *(char *)ch1-*(char *)ch2;

 }

 

 //7 6 4 5 3

 //第一次

 //6 7 4 5 3

 //6 4 7 5 3

 //6 4 5 7 3

 //6 4 5 3 7

 

 //第二次

 //4 6 5 3 7

 //4 5 6 3 7

 //4 5 3 6 7

 

 void sort_data(int (*pfunc)(void *, void *), void *pdata,size_t len,size_t size)

 {

 char *p_i = (char *)pdata;

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

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

 if (pfunc(p_i+j*size, p_i+(j+1)*size) > 0)

 {

 char temp[size];

 memcpy(temp, p_i+j*size, size);

 memcpy(p_i+j*size, p_i+(j+1)*size, size);

 memcpy(p_i+(j+1)*size, temp, size);

 }

 }

 }

 }

 

 int main(int argc,const char *argv[])

 {

 //    int a[10]={7,6,4,5,3};

 //    sort_data(compare_int, a, 5, sizeof(int));

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

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

 //    }

 

 //    float a[10]={7.8,6.7,4.3,5.2,3.0};

 //    sort_data(compare_float, a, 5, sizeof(float));

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

 //        printf("%.2f ", a[i]);

 //    }

 char a[10]="hello";

 sort_data(compare_char, a, 5, sizeof(char));

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

 printf("%c ", a[i]);

 }

 return 0;

 }*/





//输入一个字符串,然后返回连续最大的字符串

//

//比如demo

//1,3,3,3,4,4,4,4,4,0,0,0,4,4,4,4

//,此例中由5个连续的4为最大连续子串,返回结果为44444.

//1,3,3,3,4,4,4,4,4,0,0,0,5,5,5,5 返回44444;

//1,3,3,3,5,5,5,5,5,4,4,4,4,4,0,0,0,0,0,0,4,4,4,4},返回000000;



//int main(int argc, const char * argv[]) {

//    @autoreleasepool {

//        char str[100]={};

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

//        char *pstr = str;

//        while (*pstr) {

//            if (*pstr == ',') {

//                int len = (int)strlen(pstr+1);

//                memmove(pstr, pstr+1, len);

//                *(pstr+len)='\0';

//                pstr--;

//            }

//            pstr++;

//        }

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

//        pstr = str;

//        int cnt = 1;

//        int max =0;

//        char *pmax = NULL;

//        while (*pstr) {

//            while(*pstr == *(pstr+1)) {

//                cnt++;

//                pstr++;

//            }

//            if (cnt>max) {

//                max = cnt;

//                pmax = pstr-cnt+1;

//            }

//            cnt = 1;

//            pstr++;

//        }

//        *(pmax+max) = '\0';

//        printf("%s\n", pmax);

//    }

//    return 0;

//}

//从键盘输入个数不定的字符串(不超过10个),以最后一个字符串整体连接到每两个字符串之间,组成一个新的字符串,并且输出这个字符串;

//比如:

//输入:

//I am Optimus Prime!

//:

//输出为

//I:am:Optimus:Prime!

//输入:

//Hi welcome to qianfeng

//#@

//输出为

//Hi#@welcome#@to#@qianfeng

//输入

//abc def ghi jkl heihei haha mygod

//**

//输出为

//abc**def**ghi**jkl**heihei**haha**mygod

//int main(int argc,const char *argv[])

//{

//    char *pstr[10]={NULL};

//    char demi[10]={};

//    char *pbuf = (char *)malloc(1000*sizeof(char));

//    int cnt = 0;

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

//        pstr[i]=(char *)malloc(100*sizeof(char));

//        scanf("%s", pstr[i]);

//        cnt++;

//        if (getchar() =='\n') {

//            break;

//        }

//    }

//    scanf("%s", demi);

//    char *p = pbuf;

//    int length =(int)strlen(demi);

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

//        strcat(p, pstr[i]);

//        p+=(int)strlen(pstr[i]);

//        if (i<cnt-1) {

//            strcat(p, demi);

//            p+=length;

//        }

//    }

//    printf("%s\n", pbuf);

//

//    return 0;

//}

//输入两个字符串,以第二个字符串整体作为分割条件把第一个字符串进行分割,然后输出分割之后的单词。

//比如:

//输入:

//I:am:Optimus:Prime!

//:

//输出:

//I

//am

//Optimus

//Prime!

//输入:

//Hi#@welcome#@to#@qianfeng#@

//#@



//int main(int argc, const char *argv[])

//{

//    char str[100]={};

//    char substr[10]={};

//    scanf("%s%s", str,substr);

//    char *p,*q;

//    p = q = str;

//    int len = (int)strlen(substr);

//    while ((p = strstr(p, substr))) {

//        *p = '\0';

//        printf("%s\n",q);

//        p += len;

//        q = p;

//    }

//    if(*q!='\0')

//    {

//        printf("%s\n", q);

//    }

//    

//    return 0;

//}

 

你可能感兴趣的:(数组)