谭浩强《C程序设计》书后习题 第十章(下)

最近要复习一下C和C++的基础知识,于是计划把之前学过的谭浩强的《C程序设计》和《C++程序设计》习题重新做一遍。

编译环境为:操作系统32位Win7,编译工具VC++6.0

第十章:指针(注:本文为该章11-21题解)

10.11)在主函数中输入10个等长字符串,用一个函数对它们进行排序。在主函数中输出这10个字符串。

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

void Sort(char s[10][100])
{
    int i, j;
    for(i = 0; i < 10; i++)
    {
        for(j = i + 1; j < 10; j++)
        {
            char temp[100];
            if(strcmp(s[i], s[j]) > 0)
            {
                printf("%s > %s: swap them!\n", s[i], s[j]);
                strcpy(temp, s[i]);
                strcpy(s[i], s[j]);
                strcpy(s[j], temp);
            }
        }
    }
}

void main()
{
    int i, j;

    //输入数组
    char s[10][100];
    for(i = 0; i < 10; i++)
    {
        scanf("%s", s[i]);
    }

    Sort(s);

    //输出排序后的数组
    for(i = 0; i < 10; i++)
    {
        printf("%s\n", s[i]);
    }
}

10.12)用指针数组处理上一题目

VC中不支持这样的声明

char* s; scanf("%s", s);

10.13)分段计算定积分

#include<stdio.h>
#include<math.h>

#define left    0
#define right    1

void main()
{
    double fx = 0, gx = 0, hx = 0;

    double counter;
    for(counter = left; counter < right; counter += 0.00001)
    {
        fx += (sin(counter) + sin(counter)) / 2.0 * 0.00001;
        gx += (cos(counter) + cos(counter)) / 2.0 * 0.00001;
        hx += (exp(counter) + exp(counter)) / 2.0 * 0.00001;
    }

    printf("∫(0→1)sin(x)dx result=%lf\n", fx);
    printf("∫(0→1)cos(x)dx result=%lf\n", gx);
    printf("∫(0→1)exp(x)dx result=%lf\n", hx);
}

10.14)将n个数按输入时的逆序排列,用函数实现

#include<stdio.h>

void ReverseInput(int* array)
{
    int counter = 10;
    while(counter--)
    {
        scanf("%d", array + counter);
    }
}

void main()
{
    int a[10];

    ReverseInput(a);

    int i = 0;
    for(i = 0; i < 10; i++)
    {
        printf("%d\t", a[i]);
    }
    printf("\n");
}

10.15)一个班有4个学生,每个学生都要修5门课,用函数实现:

①:求第一门课程的平均分

②:找出2门以上课程成绩不及格的学生,输出他们的学号和分数

③:找出平均成绩在90以上或全部课程成绩在85以上的学生

#include<stdio.h>

#define STUDTCOUNT    4
#define CROUSCOUNT    5

//函数:求第一门课平均分
void AverageOfCourse1(int matrix[STUDTCOUNT][CROUSCOUNT])
{
    int i, average = 0;
    for(i = 0; i < STUDTCOUNT; i++)
    {
        average += matrix[i][0];
    }
    average /= STUDTCOUNT;
    printf("第一门课平均分:%d\n", average);
}

//找到不及格科目数超过2科者并打印成绩
void Find2PlusFailed(int matrix[STUDTCOUNT][CROUSCOUNT])
{
    int i, j, k;
    for(i = 0; i < STUDTCOUNT; i++)
    {
        k = 0;
        for(j = 0; j < CROUSCOUNT; j++)
        {
            if(matrix[i][j] < 60)
            {
                k++;
            }
            if(k > 2)
            {
                break;
            }
        }
        if(k > 2)
        {
            printf("学生:%d挂掉科目2门以上,成绩如下:\n", i);
            for(j = 0; j < CROUSCOUNT; j++)
            {
                printf("%d\t", matrix[i][j]);
            }
            printf("\n");
        }
    }
}

//找出平均成绩在90分以上或所有成绩在85分以上的学生
void FindAvrgBT90orAllBT85(int matrix[STUDTCOUNT][CROUSCOUNT])
{
    int i, j, k, average;
    for(i = 0; i < STUDTCOUNT; i++)
    {
        k = 1;
        average = 0;
        for(j = 0; j < CROUSCOUNT; j++)
        {
            if(matrix[i][j] < 85)
            {
                k = 0;
                break;
            }
            average += matrix[i][j];
        }
        average /= STUDTCOUNT;
        if(k == 1 || average >= 90)
        {
            printf("学生%d被选中\n", i);
        }
    }
}

void main()
{
    int matrix[STUDTCOUNT][CROUSCOUNT] = 
    {
        { 40, 40, 40, 40, 40 },
        { 80, 80, 80, 80, 80 },
        { 90, 90, 90, 90, 90 },
        { 95, 95, 95, 95, 95 }
    };

    void (*p)(int matrix[STUDTCOUNT][CROUSCOUNT]);

    //指向函数的指针
    p = AverageOfCourse1;
    (*p)(matrix);

    p = Find2PlusFailed;
    (*p)(matrix);

    p = FindAvrgBT90orAllBT85;
    (*p)(matrix);
}

10.16)输入一个字符串,内有数字和非数字字符,将其中的连续数字作为一个整数,依次存放到一个新的数组中。统计共有多少整数,并输出这些数

#include<stdio.h>

void main()
{
    char s[100];
    char num[10][10];

    //测试数据: a123x456 17960?  302tab5876
    gets(s);

    int i = 0, j = 0, k = 0;
    while(s[i] != '\0')
    {
        k = 0;
        //发现数字则将数字整体放到数组
        while(s[i] >= '0' && s[i] <= '9')
        {
            num[j][k] = s[i];
            i++;
            k++;
        }
        if(k != 0) //刚刚发现完数字的情况
        {
            num[j][k] = '\0';
            j++;
            continue;
        }
        else //发现的字符不是数字的情况
        {
            i++;
        }
    }

    //输出全部数字
    printf("共有数字%d个\n", j);
    for(i = 0; i < j; i++)
    {
        printf("%s\n", num[i]);
    }
}

10.17)写一个函数,实现两个字符串比较(即自己实现一个strcmp函数)

#include<stdio.h>

int strcmp(char* p1, char* p2)
{
    int i = 0;
    while(true)
    {
        if(p1[i] == '\0' && p2[i] == '\0')
        {
            return 0;
        }
        if(p1[i] == p2[i])
        {
            i++;
            continue;
        }
        return p1[i] - p2[i];
    }
}

void main()
{
    printf("%d\n", strcmp("1234", "5678"));
    printf("%d\n", strcmp("1111", "1111"));
    printf("%d\n", strcmp("1111", "11112"));
    printf("%d\n", strcmp("11112", "1111"));
}

10.18)输入月份号,输出该月的英文名

#include<stdio.h>

void main()
{
    char* s[12] = 
    {
        "Janurary",  "Febrary",  "March",    "April",
        "May",       "June",     "July",     "August",
        "September", "October",  "November", "December"
    };

    int input;
    scanf("%d", &input);
    printf("%s\n", s[input - 1]);
}

10.20)用指向指针的指针的方法对5个字符串排序并输出

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

void main()
{
    //测试数据: 5687 4567 3465 2345 1234
    char s[5][100];
    scanf("%s", s[0]);
    scanf("%s", s[1]);
    scanf("%s", s[2]);
    scanf("%s", s[3]);
    scanf("%s", s[4]);

    //不能写成 char* s[5] = { "5678", "4567", "3456", "2345", "1234" };

    //从小到大排序
    int i, j, k, l;
    char temp[100];
    for(i = 0; i < 5; i++)
    {
        for(j = i + 1; j < 5; j++)
        {
            k = 0; //遍历用数
            l = 0; //s[i]<s[j]时l<0 s[i]=s[j]时l=0 s[i]>s[j]时l>0
            while(true)
            {
                if(*(*(s + i) + k) == '\0' && *(*(s + j) + k) == '\0')
                {
                    break;
                }
                else if(*(*(s + i) + k) == *(*(s + j) + k))
                {
                    k++;
                    continue;
                }
                else
                {
                    l = *(*(s + i) + k) - *(*(s + j) + k);
                    break;
                }
            }
            //第一个字符串大于第二个字符串则调换位置
            if(l > 0)
            {
                strcpy(temp, s[i]);
                strcpy(s[i], s[j]);
                strcpy(s[j], temp);
            }
        }
    }

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

10.21)用指向指针的指针的方法对n个字符串排序并输出

#include<stdio.h>

#define n    5

void Sort(int* array[n])
{
    int temp;
    int i = 5, j = 5;
    int **tempi = array;
    int **tempj = array;
    for(i = 0, tempi = array; i < n; i++, tempi++)
    {
        for(j = i + 1, tempj = tempi + 1; j < n; j++, tempj++)
        {
            if(**tempi > **tempj)
            {
                temp = **tempi;
                **tempi = **tempj;
                **tempj = temp;
            }
        }
    }
}

void main()
{
    int a[n] = { 5, 4, 3, 2, 1 };
    int *x[n] = { &a[0], &a[1], &a[2], &a[3], &a[4] };
    Sort(x);

    int i;
    for(i = 0; i < n; i++)
    {
        printf("%d\t", *(a + i));
    }
    printf("\n");
}

END


转载于:https://my.oschina.net/Tsybius2014/blog/309826

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值