第9次C练习

  1. 给定一个整书数组,找出其中三个整数,这三个整数进行加减运算结果最大,并返回这三个数字。
    int * maximumNumbers(const int *nums, int numsSize);
    输入:[12, 5, -5, 1, 4]
    返回:[12, 5, -5]
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<math.h>
//只需要求出绝对值最大的三个数
int * maximumNumbers(const int *nums, int numsSize)
{
    int *p = (int *)malloc(sizeof(int ) * 3);
    int i = 0;
    if(NULL == p){
        printf("malloc error");
        return p;
    }
    memset(p, 0, sizeof(int ) * 3);
    for(i = 0; i < numsSize; i++){
        if(abs(nums[i]) > abs(*p)){
            *(p+2) = *(p+1);
            *(p+1) = *p;
            *p = nums[i];
        }
        else if(abs(nums[i]) > abs(*(p+1))){
            *(p+2) = *(p+1);
            *(p+1) = nums[i];
        }
        else if(abs(nums[i]) > abs(*(p+2)))
            *(p+2) = nums[i];
    }

    return p;   
}
  1. 数字加密:将一个整数n换成一个整数x,使得x减去x的每个数位上的数字后不小于n,找出最小的满足条件的x。
    例如:n = 12, 当x=20时,20-2-0 不小于 12
#include <stdio.h>

int secureNum(int n)
{
    int x = n, tmp = 0, step = 0;

    while(tmp < n)//只要计算的差值小于n,继续寻找x
        for(tmp = ++x, step = 1; tmp >= n && x / step; step *= 10)
            tmp -= x / step % 10;

    return x;
}

int main(void)
{
    int value = 0;

    scanf("%d", &value);
    printf("加密后的数字为%d\n", secureNum(value));

    return 0;
}
  1. 给定非负整数a, b, m,利用基本算数运算符(+-*/%)即位运算符,计算a^b mod m.
    输入:一行三个非负整数, 分别为a,b,m的值,m不为0
    输出:a^b mod m的结果
    例:输入 2,10,5 输出 4
#include <stdio.h>

int calculate(int a, int b, int m)
{
    int sum  = 0; 
    if(0 == b)
        return 1 % m;
    if(0 == a)
        return 0;

    sum = a;
    while(--b)      
        sum *= a;

    return sum % m;
}

int main(void)
{
    int a = 0, b = 0, m = 0;

    printf("请输入a,b,m的值:");
    scanf("%d%d%d", &a, &b, &m);
    printf("a^b mod m = %d\n", calculate(a, b, m));

    return 0;
}
  1. 分析程序, 写出输出结果
(1) char *ptr; 
    if ((ptr = (char *)malloc(0)) == NULL) 
        puts("Got a null pointer"); 
    else 
        puts("Got a valid pointer"); 

Got a valid pointer 
系统对于堆内存的管理和维护,一般情况下用链表,在每片被申请的内存前加个表头,存储分配的内存大小和起始地址。malloc返回的就是其中的起始地址,每片内存的可用大小是固定的vc6下是56字节和最后一个零结束标志。当申请0字节空间时,对于起始地址的操作是非法的,因为起始地址就是终止地址,

(2) char * GetStr()
    {
        char *tmp;
        tmp = "123"
        return tmp;
    }
    void main()
    {
        printf("%s.\n", GetStr());
    }

123
因为字符串"123"不是在栈中存放,不随函数调用结束消失,所以指针指向的空间仍有效。
  1. 输入一个正整数,输出原数并逆序打印出各位数字。
    //例如:原数:123456 逆序:654321
    //逆序函数原型:int invers_int(int x)(需要用到递归实现)
int invers_int(int x)
{
    int a = 1;
    if(x < 10)
        return x;

    while(x/a > 9)
        a *= 10;
    return x % 10 * a + invers_int(x/10);
}
#include <stdio.h>

int invers_int(int x)
{
    if(x < 10){
        printf("%d", x);
        return 0;
    }else{
        printf("%d", x % 10);
        invers_int(x / 10);
    }
    return x;
}

int main(void)
{
    int num = 0;
    printf("输入一个正整数:");
    scanf("%d", &num);
    printf("逆序是");
    printf(" 原数是%d\n", invers_int(num));

    return 0;
}
  1. 按以下规律翻译密码:将每一个字母变成它后面的字母,例如,将A变成B,B变成C,…,Z变成A,非字母字符不变,“!”作为电文结束标志。
void translateCodes(char value[])
{
    int i = 0;

    while(value[i] != '!'){
        if(value[i] >= 'A' && value[i] < 'Z' || value[i] >= 'a' && value[i] < 'z')
            value[i]++;
        else if(value[i] == 'Z' || value[i] == 'z')
            value[i] -= 25;
        i++;
    }   
}
  1. 编写程序:读入一个在字母C和X之间的字符,打印出该字母在中间的相邻五个字母。
    如:输入F,则输出DEFGH.
    函数原型:void func(char ch)
void func(char ch)
{
    printf("%c%c%c%c%c\n", ch - 2, ch - 1, ch, ch + 1, ch + 2);
}
  1. 一个球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第十次反弹多高。
#define H   100
void func1(int n)
{
    int i = 0;
    float sum = 0, step = 0;

    step = H;
    for(i = 0; i < n; i++)
    {
        sum += step + step / 2; //每次返回最高点所经过的距离
        step /= 2;
    }
    printf("第%d次落地共经过%f米,反弹%f米高\n", n, sum - step, step);
}
  1. 编写一个函数,要求输入年月日时分秒,输出该年月日时分秒的下一秒。如输入2004年12月31日23时59分59秒,则输出2005年1月1日0时0分0秒。
    函数原型:PS:故意这么写的,别给乱换
    void show_time(int *year, int *month, int *date, int *hour, int *minute, int *second)
void show_time(int *year, int *month, int *date, int *hour, int *minute, int *second)
{
    unsigned char flag = 0; 

//  (++*second) > 59 ? (flag = 1, *second = 0) : (flag = 0);    
    if(++*second > 59){
        flag = 1;
        *second = 0;    
    }
    if(flag)
        if(++*minute > 59)
            *minute = 0;
        else
            flag = 0;
    if(flag)
        if(++*hour > 23)
            *hour = 0;
        else 
            flag = 0;
    if(flag){
        if(*month != 2 && *month != 4 && *month != 6 && *month != 9 && *month != 11)
            if(++*date > 31)
                *date = 0;
            else
                flag = 0;   
        else if(*month != 2)
            if(++*date > 30)
                *date = 1;
            else
                flag = 0;   
        else
            if(*year % 100 ? *year % 4 : *year % 400)
                if(++*date > 29)
                    *date = 1;
                else
                    flag = 0;   
            else
                if(++*date > 28)
                    *date = 1;
                else
                    flag = 0;
    }
    if(flag)
        if(++*month > 12)
            *month = 1;
        else
            flag = 0;
    if(flag)
        ++*year;

    printf("下一秒是:%d%d%d%d%d%d秒。\n", *year, *month, *date, *hour, *minute, *second);
}
#define H_M_S_isOverflow(a, b, f)    (f) && (++(a)) > (b) ? (f = 1, a = 0) : (f = 0)
#define Y_M_D_isOverflow(a, b, f)    (f) && (++(a)) > (b) ? (f = 1, a = 1) : (f = 0)

void show_time(int *year, int *month, int *date, int *hour, int *minute, int *second)
{
    unsigned char flag = 1;
    H_M_S_isOverflow(*second, 59, flag);
    H_M_S_isOverflow(*minute, 59, flag);
    H_M_S_isOverflow(*hour, 23, flag);
    if(*month!=2 && *month!=4 && *month!=6 && *month!=9 && *month!=11)
        Y_M_D_isOverflow(*date, 31, flag);
    else if(*month != 2)
        Y_M_D_isOverflow(*date, 30, flag);  
    else
        if(*year % 100 ? *year % 4 : *year % 400)
            Y_M_D_isOverflow(*date, 29, flag);
        else
            Y_M_D_isOverflow(*date, 28, flag);  
    Y_M_D_isOverflow(*month, 12, flag);
    Y_M_D_isOverflow(*year, 9999, flag);

    printf("下一秒是:%d%d%d%d%d%d秒。\n", *year, *month, *date, *hour, *minute, *second);
}
  1. 改错:
    (a)、void test1()
    {
        char string[10];
        char *str1 = "0123456789";
        strcpy(string, str1);
    }

char string[11];

    (b)、
    void test2()
    {
        char string[10], str1[10];
        for (i=0; i<10; i++){
            str1[i] = 'A';
        }
        strcpy(string, str1);
    }

    char string[11], str1[11];
    for (i=0; i<10; i++){
        str1[i] = 'A';
    }
    str1[i] = 0;
    strcpy(string, str1);

    (c)、void test3(char *str1)
    {
        char string[10];
        if (strlen(str1)<=10)
        {
            strcpy(string, str1);
        }
    }

char string[11];
或者if(strlen(str1)<10)
  1. 找赛手:2个羽毛球队比赛,各出3人,每个人只比一次。甲队为A,B,C三人,乙队为X,Y,Z三人。有人打听比赛名单,A说他不和X比,C说不和X,Z比。编程找出三队赛手的名单.
void competitionList(void)
{
    char a = 0, b = 0, c = 0;

    if(c != 'X' && c != 'Z')
        c = 'Y';
    if(a != 'X' && c == 'Y')
        a = 'Z';
    if(a == 'Z' && c == 'Y')
        b = 'X';
    printf("aVS%c, bVS%c, cVS%c\n", a, b, c);
}
  1. 用C语言实现字符串中子字符串的替换, 成功返回0,失败返回-1.例如:“ABCDEFG”这个字符串,把其中”BCD”替换成“9527”这个子串,结果变成:“A9527EFG”
    函数原型:
    int str_replace(char str, char replaced_str, char *new_str)
int str_replace(char *str, char *replaced_str, char *new_str)
{
    unsigned int i = 0, j = 0, k = 0, m = 0, l = 0;

    //在原字符串中找要替换的字符串
    while(str[i]){
        if(str[i] == replaced_str[j]){
            k = i;
            while(str[++i] == replaced_str[++j] && str[i])
                ;   
        }
        else
            i++;

        if(0 == replaced_str[j]) //j == strlen(replaced_str)
            break;
        else
            j = 0;
    }
    if(replaced_str[j])
        return -1;  

    //复制
    l = strlen(str);

    for(i = 0; new_str[i] && i < j; i++)
        str[k++] = new_str[i];
    if(0 == new_str[i])                        //新字符串长度小于所替换的字符串
        while(str[k++] = str[k + j - i])
            ;
/*      do{
            str[k] = str[k + j - i];           //k+j-i表示str中所替换字符串的下一个字符的下标 
        }while(str[(k++)+j-i]);
*/  
    else //假设str数组空间足够大
        for(m = l - k + 1; i < strlen(new_str); i++, l++){  //加上'\0',m = l - k + 1
            for(k = 0, j = l + 1; k < m; k++, j--)          //加上'\0',j = l + 1
                str[j] = str[j-1];
            str[j] = new_str[i];
        }

    return 0;
}
int main(void)
{
    char str[100] = "aabbcdefg";

    printf("%d, %s\n", str_replace(str, "bc", "12345"), str);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值