C语言练习题

编程题

  1. 输入三个整数作为三角形的三条边,判断如果不能构成一个三角形,则输出“not a triangle”;否则如能构成一个直角三角形,则输出”yes”;否则输出”no”。

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

    int main()
    {
    int a, b, c;
    while(scanf("%d %d %d",&a, &b,&c)!=EOF) //实现多组数据重复输入
    if((a+b>c)&&(a+c>b)&&(b+c>a)) //判断是否构成三角形
    {
    //判断是否构成直角三角形
    if((a*a + b*b == c*c)||(a*a + c*c == b*b)||(b*b + c*c == a*a))
    printf("yes\n");
    else printf("no\n");
    }
    else printf("not a triangle\n");


    return 0;
    }

    复习:C 库函数 - scanf()

  2. 请编程实现从键盘输入10个数,求输入的正数之和。

    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
    #include <stdio.h>

    int main()
    {
    int a[10];
    int i = 0;
    int j = 0;
    int k = 0;
    int b[10];
    int sum;
    while(i < 10)
    {
    scanf("%d", &a[i]); //将10个数依次传递到数组a里
    if(a[i] > 0)
    {
    b[j] = a[i]; //将数组a中符合条件的元素传递到数组b里
    j ++;
    }
    i ++;
    }

    for(k = 0; k < j; k++)
    sum += b[k]; //求和
    printf("%d\n", sum);

    return 0;
    }

    复习:C 数组

  1. 请编程实现输出自然数1到1000中含有数字2的数的个数。

    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>

    int main()
    {
    int i = 0; /*1=<i<=1000*/
    int j = 0; /*控制输出个数为10时换行*/
    int count = 0; /*计数符合要求的数的个数*/
    int one, two, three; /*one(百位) two(十位) three(个位)*/

    for (i=1; i<=1000; i++)
    {
    one = i/100; //提取百位数
    two = i%100/10; //提取十位数
    three = i%10; //提取个位数
    if (2==one || 2==two || 2==three)
    {
    j ++;
    count ++;
    printf("%3d ", i); //%3d表示把结果进行排版
    }
    if (10==j) //每执行10次就再将结果换行输出
    {
    j = 0;
    printf("\n");
    }
    }
    printf("总数为:%d\n", count);
    return 0;
    }

    复习:C语言计数器C语言如何提取个,十,百,千位上的数字

  2. 请编程实现输出1到100以内能被3或5整除,但不能同时被3和5整除的数及其个数。

    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 main( )
    {
    int i = 0;
    int count = 0;
    int j = 0; //将结果换行输出
    for (i = 1;i <= 100;i ++) //从1开始输入数字直到100
    {
    if ((i%3 == 0)||(i%5 == 0)) //判断能否被3或5整除
    {
    if (i%15 != 0) //判断能否被3和5同时整除
    {
    printf("%3d ", i);
    count ++;
    j ++;
    }
    if (6==j) //每行6个结果
    {
    j = 0;
    printf("\n");
    }
    }
    }

    printf("\n个数%d\n", count); //输出个数
    return 0;
    }
  3. 请编程实现求解sum=1+2+3+…..+n<s的最大的sum值,其中s的值由键盘输入。

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

    int main( )
    {
    int i = 1;
    int s = 0;
    int sum = 0;
    scanf ("%d", &s); //键盘输入s
    for (i = 1;i < s;i ++) //for循环求sum的值
    sum += i; //求和
    printf("%d\n", sum);
    return 0;
    }
  4. 请编程实现求解s=1/(1x2)+1/(2x3)+1/(3x4)+……+1/(10x11),输出结果保留两位小数。

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

    int main( )
    {
    float i = 0.000000;
    float n = 0.000000;
    float sum = 0.000000;
    for (i = 1;i <= 10;++ i)
    {
    n = 1/(i*(i+1));
    sum += n;
    }
    printf("%.2f", sum); //结果保留两位小数
    return 0;
    }

    在for循环中,循环变量只能是整型或字符型的吗?

  5. 请编程实现如下问题的求解。猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将第一天剩下的桃子吃掉一半,有多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第 10 天早上想再吃时,发现只剩下一个桃子了。编写程序求猴子第一天摘了多少个桃子。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <stdio.h>

    int main( )
    {
    int x = 1; //第十天剩下一个桃子
    int i = 0; //天数
    for (i= 0; i < 9; ++i) //逆向思维
    x = (x+1)*2;
    printf("桃子总数:%d", x);
    return 0;
    }
  6. 有一分数序列,2/1, 3/2, 5/3, 8/5, 13/8, 21/13,……,请编程求出这个数列的前20项之和。

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

    int main( )
    {
    int i, t, n = 20;
    double a = 2, b = 1, s = 0; //分子为a,分母为b,式子的和为s
    for (i=1; i<=n; i++)
    {
    s = s + a/b;
    t = a; //将前一项的分子的值赋给中间变量t
    a = a+b; // 将前一项分子与分母之和作为下一项的分子
    b = t; // 将前一项的分子作为下一项的分母
    }
    printf("%f", s);
    return 0;
    }
  7. 请编程实现以下功能:读入两个运算数(data1和data2)及一个运算符(op),计算表达式data1 op data2的值,其中op可为+,—,*,/(用switch语句实现)。

    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
    42
    43
    44
    45
    46
    #include<stdio.h>

    int main()

    {
    double data1, data2, data;

    char op;

    scanf("%lf%c%lf", &data1, &op, &data2);

    switch(op)

    {
    case '+':
    data=data1+data2;break;

    case '-':
    data=data1-data2;break;

    case '*':
    data=data1*data2;break;

    case '/':
    {
    if (data2!=0)
    data=data1/data2;

    else
    {
    printf("除数不能为0!\n");
    return 0;
    }
    };break;
    default :
    {
    printf("Error!");
    return 0;
    }
    }

    printf("%g%c%g=%g",data1,op,data2,data);

    return 0;

    }

    复习:C switch 语句

  8. 输入整数n,其中0<n<7,输出用n、n+1、n+2、n+3这4个数字组成的无重复数字的3位数。

    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>

    int main()

    {
    int n;
    int i, j, k;
    printf("请输入n\n");
    scanf("%d", &n);
    if ((n>0)&&(n<7))
    {
    //穷举法全排列
    for (i = n; i <= n + 3; i++)
    {
    for (j = n; j <= n + 3; j++)
    {
    for (k = n; k <= n + 3; k++)
    {
    //当i,j,k中有任意两个相等时
    if (i == j || i == k || j == k)
    continue; //直接开始下一次循环
    printf("%d%d%d ", i, j, k);
    }
    }
    }
    }

    else printf("Error!");

    return 0;

    }

    复习:C continue 语句

  9. 在键盘上输入n(n<100)个整数,试编写程序使该数组中的数按照从大到小的次序排列。其中数组元素排序是通过sortarr函数实现的。其中部分程序已经给出,请把程序补充完整。

    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>
    #include<string.h>
    int main()
    {
    int a[100],n,i,j,temp;
    printf("Input number of integers\n");
    scanf("%d",&n);
    printf("Input integers in order\n");
    for (i=0;i<n;i++)
    scanf("%d",&a[i]); //将数据录入数组
    //冒泡排序
    for (i=0;i<n-1;i++) //外层循环
    for (j=0;j<n-1-i;j++) //内层循环
    if (a[j]>a[j+1]) //比较相邻两个数的大小
    {
    temp=a[j];
    a[j]=a[j+1];
    a[j+1]=temp;
    }
    //将排序后的数组元素依次输出
    for(i=n-1;i>=0;i--) //注意此处for(i=n-1;i>=0;i--)才是把数据从大到小输出
    //for(i=0;i<n;i++)是把数据从小到大输出!!!
    //因为第14行代码用的是'>'
    {
    printf("%d",a[i]);
    printf(" ");
    }
    }

    复习:冒泡排序法

  10. 请编程实现两个字符串的连接(函数strcon内不能使用库函数)。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #include<stdio.h>
    #include<string.h>
    void strcon(char *a, char *b) //传递字符串a和b的首地址
    {
    int i=strlen(a), j; //strlen函数用于计算字符串的长度
    for (j=0; j<=strlen(b); j++)
    a[i++]=b[j];
    }
    int main()
    {
    char a[200], b[100];
    printf("输入一个字符串:\n");
    gets(a);
    printf("输入另一个的字符:\n");
    gets(b);
    strcon(a,b);
    printf("%s",a);
    return 0;
    }

    复习:strlen函数gets函数C语言字符串的输入和输出

  11. 请编程实现如下功能:数组a中存放着本班C语言期末考试的成绩,请把程序补充完整,使其能实现求平均成绩、最高分、最低分(1号学生的成绩存在数组的0号元素中,如果学号对应的同学退学或缺考,则输入分数为-1。注意退学的学生不能计入学生总数)。

    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
    #include<stdio.h>

    int main()
    {
    double ave=0,sum=0;
    int i,a[100],n,t,max,min;
    printf("输入本班人数:\n");
    scanf("%d", &n);
    //录入成绩
    printf("依次输入学生成绩:\n");
    for (i=0;i<n;i++)
    {
    scanf("%d", &a[i]);
    sum += a[i];
    }

    printf("输入退学人数:\n");
    scanf("%d",&t);

    max = a[0]; //假设数组a第一个元素既是最大值也是最小值
    min = a[0]; //注意:max=min=a[0]这种写法是错误的!赋值运算符为双目运算符

    //在数组a中找最高分和最低分
    for (i=0;i<n;i++)
    {
    if (a[i]>max)
    max=a[i];

    if (a[i]<min)
    min=a[i];
    }

    ave=sum/(n-t); //求平均成绩

    printf("平均成绩:%f\n最高分:%d\n最低分:%d",ave,max,min);

    return 0;
    }
  12. 请编程实现求解二维数组a[3][3]={1,2,3,4,5,6,7,8,9}周边元素的和。

    1

    链接:二维数组的周边元素指的是什么?二维数组

  13. 请编程实现求解方阵a[3][3]={1,2,3,4,5,6,7,8,9}上三角(包含对角线)的元素的和。

    1

    链接:求矩阵上三角形元素之和是什么意思?矩阵的上三角元素包括对角线吗?上三角矩阵主对角线

  14. 请编程实现两个字符串的比较(不能使用库函数strcmp)。

    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
    42
    43
    44
    45
    46
    47
    #include <stdio.h>
    #include <string.h>

    void strcmp(char str1[],char str2[]);

    int main()
    {
    puts("请输入两个字符串");
    char str1[100], str2[100];
    gets (str1);
    gets (str2);
    strcmp (str1, str2);

    return 0;
    }
    //编写strcmp函数
    void strcmp (char str1[], char str2[])
    {
    int a = strlen(str1);
    int b = strlen(str2);
    int i, flag=0, max;
    max = a>=b?a:b;
    for (i = 0; i < max; i++)
    {
    if (str1[i] > str2[i])
    {
    printf("%s大于%s", str1, str2);

    break;
    }
    else if (str1[i] < str2[i])
    {
    printf("%s小于%s", str1, str2);

    break;
    }
    if (str1[i] == str2[i])
    {
    flag++;
    }
    }
    //两字符串相等
    if (flag == max)
    {
    printf("%s等于%s", str1, str2);
    }
    }
  15. 已有一个按升序排好的数组,要求输入一个数后,按升序规律插入到数组中。

    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
    42
    43
    44
    #include <stdio.h>
    #include <stdlib.h>

    int main()
    {
    int n, num;

    //确定原数组的长度
    printf("输入数组长度:");
    scanf("%d", &n);
    int nums[n+1]; //插入元素后的数组长度是n+1

    //给原数组的各个元素赋值
    printf("按升序输入 %d 个数值:", n);
    for(int i = 0; i < n; i++)
    scanf("%d", &nums[i]);

    //输入要插入原数组中的新元素
    printf("输入一个插入数值:");
    scanf("%d", &num);

    //查找新元素在原数组中要插入的位置
    for (int i = 0, j = 0; i < n; i++)
    {
    //若nums[i] > num,则说明找到插入位置
    if (nums[i] > num)
    {
    //在nunms[i]前面插入新元素后,新元素后的元素都要后移一位
    for (int j = i; j < n+1; j++)
    {
    nums[j] -= num;
    num += nums[j];
    nums[j] = num - nums[j];
    }
    break; //跳出整个寻找位置的循环
    }
    }

    //把插入新元素后的新数组输出
    for (int i = 0; i < n+1; i++)
    printf("%d ", nums[i]);

    return 0;
    }

    链接:解析

  16. 统计字符数组中各小写字母(忽略大小写,即’A’视为小写’a’)出现的次数,其统计结果放入另一个数组中。

    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
    #include <stdio.h>

    int main()
    {
    char c;
    int str[256] = {0}; //(注意是用int)建数组str[256]={0},分别统计a到z出现的次数;
    int i = 0;
    printf("输入一行字符串,我们将统计各个小写字母(忽略大小写)出现的次数\n");
    while ( ( c = getchar() ) != '\n') //键入字符
    {
    //将A~Z(大写字母)的统计结果整合到对应的小写字母的统计结果中去
    if ( (c > 'A')&&(c < 'Z') )
    str[c+32]++;
    //c所对应的字符的计数器自增1
    else
    str[c]++;
    }

    //用for循环实现a~z的统计结果的输出
    for (int i = 'a'; i < 'z'+1; i++)
    if ( str[i] )
    printf ("%c: %d\n", i, str[i]);

    return 0;
    }

    链接:字符数组

  17. 请编程实现求最长单词的长度(字符串中不包含标点符号,单词之间以空格隔开)。

    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
    42
    43
    44
    45
    #include<stdio.h>

    int main()
    {
    char a[200];
    int b[200], c[200], len=0, i, j, max;
    printf("输入多个单词(单词间用空隔来隔开)\n");
    gets(a);
    for (i = 0, j = 0; i <= 199; i++)
    {
    if (a[i] != 32 && a[i] != '\0')//32代表空格,\0是字符串结束标志
    {
    len++;
    //len用于记录每个单词的长度
    }
    if (a[i-1] != 32 && a[i] == 32)
    {
    c[j] = i;//数组c用于记录每个单词的末尾的位置
    b[j] = len;//把每个单词的长度存入一个数组中
    len = 0;
    j++;//j用于记录单词数,遇到空格时,单词数+1
    }
    if (a[i] == '\0')
    {
    c[j] = i;
    b[j] = len;
    break;
    }

    }

    max=0;

    for (i = 1; i <= j; i++)
    if (b[i] > b[max])
    max = i;//求出单词的最大长度
    for (i = 0; i <= j; i++)
    if (b[i] == b[max])//找出第一个最长的单词
    break;
    for (j = c[i] - b[i]; j < c[i]; j++)//通过数组c找到其位置并输出
    printf("%c", a[j]);
    printf("\n上述单词中长度最长的单词的长度为%d", len);

    return 0;
    }
  18. 猴子选大王。n只猴子围成一圈,每次从第1只开始报数,凡是报到m者退出圈子。最后留在圈子中的猴子为大王。输入n, m,输出猴子出圈的序号。

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    #include <stdio.h>
    #include <stdlib.h>
    struct mon
    {
    int num;
    struct Node *next;
    };

    struct mon *create(int n)
    { // 新建链表,无头结点,并且最后一个结点的next指向第一个结点
    int i;
    struct mon *p,*tail,*head;
    p=(struct mon *)malloc(sizeof(struct mon));
    p->num=1;
    p->next=NULL;
    head= p;
    tail=p;
    for(i=2;i<=n;i++)
    {
    p=( struct mon *)malloc(sizeof(struct mon));
    p->num=i;
    tail->next=p;
    tail=p;
    p->next=NULL;
    }
    tail->next=head;
    return head;
    }

    int sel( struct mon *head,int m,int n)
    {
    int num1=0;//表示猴子报数的计数变量<br> int count =0; //用以统计出圈猴子数目的计数变量
    struct mon *p,*q; //分别指向当前结点及其前驱结点的指针
    q=head;
    while(q->next!=head)
    q= q->next; //第一个结点的前驱结点
    printf("被删除的猴子的序号依次是:");
    while(count<n-1)
    {
    p=q->next;
    num1++;
    if(num1%m==0)
    { //找到一个被删除结点,完成删除、计数、输出
    q->next=p->next;
    printf("%3d",p->num);
    free(p);
    count++;
    }
    else
    q=p;

    }

    return q->num; // 最后一个结点的数据域即为留在圈内猴王的序号

    }
    int main()
    {
    int n,m;
    struct mon * head;
    scanf("%d%d",&n,&m);
    head=create(n);
    printf("\n猴王是%d\n",sel(head,m,n));
    return 0;
    }

    链接:源代码出处