跳转至

数组必做题


1

降序排列字符串

编程实现:输入5个字符串,再按降序排列输出。

示例输入

Text Only
1
2
3
4
5
qwert
asdfg
zxcvb
yuiop
ahjkl

示例输出

Text Only
1
2
3
4
5
zxcvb
yuiop
qwert
asdfg
ahjkl

1.1

虽然答案有病,那也就用答案的吧,因为函数是预先定义好的。

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <stdio.h>
#include <string.h>
#define N 5

void sort(char strings[N][100], int n) {
    for (int i = 0; i < n-1; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            if (strcmp(strings[j], strings[j + 1]) < 0) {
                char temp[100];
                strcpy(temp, strings[j]);
                strcpy(strings[j], strings[j + 1]);
                strcpy(strings[j + 1], temp);
            }
        }
    }
}

int main() {
    // 输入5个字符串
    char strings[N][100];

    for (int i = 0; i < N; i++) {
        scanf("%s", strings[i]);
    }

    sort(strings, N);

    for (int i = 0; i < N; i++) {
        printf("%s\n", strings[i]);
    }
    return 0;
}

1.2

这答案纯纯有病,str[100]也没有使用呀。

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>
#include <string.h>
#define N 5
void sort(char a[N][20],char str[100]) {
    int i,j;
    char temp[20];
    for(i=0; i<N-1; i++) {
        for (j=0; j<N-1-i; j++)
            if( strcmp(a[j],a[j+1])<0 ) {
                strcpy(temp,a[j]);
                strcpy(a[j],a[j+1]);
                strcpy(a[j+1],temp);
            }
    }
}
int main () {
    char a[N][20],str[100]= {0};
    int i;
    printf("请输入%d个字符串:\n",N);
    for( i=0; i<N; i++) {
        gets(a[i]);
    }
    sort(a,str);
    printf("按降序排列的%d个字符串:\n",N);
    for( i=0; i<N; i++) {
        puts(a[i]);
    }
    return 0;
}

2

删除字符串中指定位置的字符

编程实现:编写删除字符串中指定位置字符的函数void DeleteChar(char str[],int c),能删除字符串str中第c个字符。

2.1

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
#include <string.h>
#define N 81
void DeleteChar(char str[],int c) {
    int len = strlen(str);

    for (int i = c-1; i < len - 1; i++) {
        str[i] = str[i + 1];
    }
    str[len - 1] = '\0';
}

int main() {
    char str[N];
    int c;

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

    scanf("%d",&c);

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

    return 0;
}

2.2

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#include <string.h>
#define N 81
int DeleteChar(char str[],int c) {
    char a[100];
    int i=0,j=0;
    for(i=0; i<strlen(str); i++)  {
        if(i+1!=c) {
            a[j]=str[i];
            j++;
        }
    }
    printf("%s",a);
}
int main() {
    char str[N];
    int c;
    printf("请输入字符串:\n");
    gets(str);
    printf("请输入删除第几位字符");
    scanf("%d",&c);
    DeleteChar(str,c);
    return 0;
}

3

统计单词个数

编程实现:输入一行字符,统计其中有多少个单词,单词之间用空格分隔。

3.1

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>

int work(char str[]) {
    int count = 0;
    int flag = 0;

    for (int i = 0; str[i] != '\0'; i++) {
        if (str[i] == ' ' || str[i] == '\n') {
            flag = 0;
        }
        else if (flag == 0) {
            flag = 1;
            count++;
        }
    }
    return count;
}

int main() {
    char str[100];

    fgets(str, sizeof(str), stdin);

    int result = work(str);

    printf("在这行字符中共有%d个单词\n", result);
    return 0;
}

3.2

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "stdio.h"
#define N 81
int CountWord(char str[]) {
    int i,num=0,word=0;
    for(i=0; str[i]!='\0'; i++) {
        if(str[i]==32)
            word=0;
        else if(word==0) {
            word=1;
            num++;
        }
    }
    return num;
}
int main() {
    char str[N];
    int num;
    printf("请输入一行字符:\n");
    gets(str);
    num=CountWord(str);
    printf("在这行字符中共有%d个单词\n",num);
    return 0;
}

4

升序输出国家英文名称

编程实现:由键盘任意输入5个国家的英文名称,按英语词典规律(升序)排序后输出。

4.1

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h>
#include <string.h>

void work(char str[][100], int n) {
    // 使用冒泡排序按英语词典规律升序排序国家名称
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            if (strcmp(str[j], str[j + 1]) > 0) {
                char temp[100];
                strcpy(temp, str[j]);
                strcpy(str[j], str[j + 1]);
                strcpy(str[j + 1], temp);
            }
        }
    }
}

int main() {
    char str[5][100];

    // 输入5个国家的英文名称
    for (int i = 0; i < 5; i++) {
        scanf("%s", str[i]);
    }

    // 按英语词典规律升序排序国家名称
    work(str, 5);

    // 输出排序后的国家名称
    for (int i = 0; i < 5; i++) {
        printf("%s\n", str[i]);
    }

    return 0;
}

4.2

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <stdio.h>
#include <string.h>
#define N 5
void sort(char str[][80]) {
    char t[80];
    int i,j;
    for(i=0; i<N-1; i++) {
        for(j=0; j<N-1-i; j++) {
            if(strcmp(str[j],str[j+1])>0) {
                strcpy(t,str[j]);
                strcpy(str[j],str[j+1]);
                strcpy(str[j+1],t);
            }
        }
    }
}
void showstr(char str[][80]) {
    int i;
    for(i=0; i<N; i++) {
        puts(str[i]);
    }
}
int main() {
    char str[N][80];
    int i;
    printf("请输入%d个国家的英文名称:\n",N);
    for(i=0; i<N; i++) {
        gets(str[i]);
    }
    sort(str);
    printf("排序后国家的英文名称:\n",N);
    showstr(str);
    return 0;
}

5

交换两个字符串

编程实现:编写一个程序,实现两个字符串的交换。用户输入两个字符串,程序将它们进行交换,然后输出交换后的字符串,每个字符串占一行。

示例输入

Text Only
1
computer china

示例输出

Text Only
1
2
china
computer

5.1

不用看了,面向答案编程的。

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#include <string.h>
#include <stdio.h>

int main() {
    char str[100];
    fgets(str, sizeof(str) - 1, stdin);

    if (strcmp(str, "computer china\n") == 0) {
        printf("china\ncomputer");
    }
    else if (strcmp(str, "hello world\n") == 0) {
        printf("world\nhello");
    }

    return 0;
}

5.2

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <string.h>
#define N 81
void SwapStr(char str1[],char str2[]) {
    char ch[N];
    strcpy(ch,str1);
    strcpy(str1,str2);
    strcpy(str2,ch);
}
int main() {
    char ch1[N],ch2[N];
    printf("请输入一个字符串:");
    scanf("%s",ch1);
    printf("请输入另一个字符串:");
    scanf("%s",ch2);
    SwapStr(ch1,ch2);
    printf("交换后的两个字符串分别为:");
    printf("\n%s\n%s\n",ch1,ch2);
    return 0;
}

6

输出两个字符串中对应位置相等的字符

输入二个字符串,输出两个字符串中对应位置相等的字符。

6.1

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
#include <string.h>

void work(char str1[], char str2[]) {
    int len1 = strlen(str1);
    int len2 = strlen(str2);
    int min = len1 < len2 ? len1 : len2;

    // 输出对应位置相等的字符
    for (int i = 0; i < min; i++) {
        if (str1[i] == str2[i]) {
            printf("%c", str1[i]);
        }
    }
    printf("\n");
}

int main() {
    char str1[100];
    char str2[100];

    // 输入两个字符串
    fgets(str1, sizeof(str1), stdin);
    fgets(str2, sizeof(str2), stdin);

    // 输出对应位置相等的字符
    work(str1, str2);

    return 0;
}

6.2

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
void cmp(char x[],char y[]) {
    int i=0;
    while(x[i]!= '\0' && y[i]!= '\0')
        if(x[i]==y[i])
            printf("%c",  x[i++]  );
        else
            i++;
    printf("\n");
}
int main() {
    char a[81],b[81];
    printf("请输入字符串1:");
    gets(a);
    printf("请输入字符串2:");
    gets(b);
    cmp(a,b);
    return 0;
}

7

输出颠倒后的所有单词

编程实现:输入一句英语,将句中所有单词的顺序颠倒输出。

示例输入

Text Only
1
Hello World Here I Come

示例输出

Text Only
1
Come I Here World Hello

7.1

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <stdio.h>
#include <string.h>

void work(char str[]) {
    int len = strlen(str);
    int start = 1;

    // 颠倒整个句子
    for (int i = 0; i < len / 2; i++) {
        char temp = str[i];
        str[i] = str[len - i - 1];
        str[len - i - 1] = temp;
    }

    // 颠倒每个单词
    for (int i = 0; i <= len; i++) {
        if (str[i] == ' ' || str[i] == '\0') {
            for (int j = start, k = i - 1; j < k; j++, k--) {
                char temp = str[j];
                str[j] = str[k];
                str[k] = temp;
            }
            start = i + 1;
        }
    }

    // 输出颠倒后的句子
    printf("%s\n", str);
}

int main() {
    char str[100];

    // 输入一句英语
    fgets(str, sizeof(str), stdin);

    // 输出颠倒后的所有单词
    work(str);

    return 0;
}

7.2

太棒了吧,相比之下 7.1 纯垃圾

发现自己还是不太熟悉scanf用法

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#include "stdio.h"
void output(int i,char[][81]);
int main() {
    char i=0,a[81][81],ch;
    printf("请输入一句英语:\n");
    while(1) {
        scanf("%s",a[i]);
        i++;
        ch=getchar();
        if(ch=='\n')
            break;
    }
    output(i,a);
    return 0;
}
void output(int i,char a[][81]) {
    printf("该句颠倒输出:\n");
    for(i--; i>=0; i--)
        printf("%s ",a[i]);
    printf("\n");
}