编程练习2(一)

1、从一个字符数组中读出相应的整数、实数

#include<stdio.h>

void read(char *str)
{
    int i = 0;
    int m = 0;
    int n = 0;
    int temp1 = 0;
    float k = 0.1;
    float temp2 = 0.0;
    int a[100] = {0};
    float b[100] = {0};

    while( *(str + i) != '\0' )
    {
        while( (*(str + i) >= '0' && *(str + i) <= '9') || *(str + i) == '.' )  
        //当字符串中的字符大于0小于9或者为小数点时进入循环
        {
            while( *(str + i) >= '0' && *(str + i) <= '9' )//当字符为数字时
            {
                temp1 = temp1 * 10 + *(str + i) - '0';      //将遇到的字符转换为整型数字
                i++;
            }

            if( *(str + i) == '.' )                                     //当遇到小数点时
            {
                temp2 = temp1;                                                  //将之前的整型数字赋给temp2,作为浮点型的整数部分
                i++;
                while( *(str + i) >= '0' && *(str + i) <= '9' )                 //当小数点后为数字时
                {
                    temp2 = temp2 + ( *(str + i) - '0' ) * k;                   //让字符乘以相应的小数位上的单位数值再加给temp2
                    k = k * 0.1;                                                //用来控制相应的小数位上的单位数值
                    i++;
                }
                b[n++] = temp2;                                                 //将所得的浮点型数值传给浮点型数组b
                temp2 = 0;                                                      //让temp2清零
            }

            else
            {
                a[m++] = temp1;                                                 //没有遇到小数点说明是整型数,传给整型数组a
                i++;
                temp1 = 0;                                                      //让temp1清零
            }   
        }
        i++;
    }

    printf("整型数有:\n");
    for( i = 0; i < m; i++ )
    {
        printf("%d   ",a[i]);                                                   //输出整型数组a中的数值
    }
    printf("\n");

    printf("浮点型数有:\n");
    for( i = 0; i < n; i++ )
    {
        printf("%.4f  ",b[i]);                                                  //输出浮点数数组b中的数值,并让数值小数点后输出4位
    }
    printf("\n");
}

int main()
{
    char str[100] = {0};
    printf("please input a string with some numbers:\n");
    scanf("%s",str);                                                            //输入带数字的字符串

    read(str);                                                                  //调用read函数

    return 0;
}

2、将整数转换为相应的一个字符数组。
分析:从个位提取数字,组合字符
符号位的处理 12345=>”12345”

#include <stdio.h>

void convert(int num, char *str)
{
    int i = 0;
    int j = 0;
    while( num != 0 )
    {
        if(num < 0)
        {
            num = -num;                     //如果num < 0,将其变成正数
        }
        i = num % 10 + '0';
        str[j++] = i;
        num /= 10;                          //从最低位开始将num中每一位取出加上'0'变成数字字符并存到str数组中
    }
    while(j--)
    {
        printf("%c",str[j]);                //倒着输出str数组中的字符
    }
    printf("\n");
}

int main()
{
    char str[100] = {0};
    int num = 0;

    printf("please input a number:");
    scanf("%d",&num);                       //输入num的值

    if(num < 0)
    {
        printf("-");                        //如果num < 0,输出一个'-'
    }

    convert(num, str);                      //调用转换函数

    return 0;
}

3、字符串数组的冒泡排序,从小到大

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

void bubble( char **str, int len )
{
    int i = 0;
    int j = 0;
    char *temp = NULL;

    for( i = 0; i < len - 1; i++ )
    {
        for( j = 0; j < len - 1 - i; j++ )
        {
            if(strcmp( str[j],str[j + 1] ) >= 0)                    //调用字符串比较函数比较字符串函数中前后两个字符串的大小
            {
                temp = str[j];
                str[j] = str[j + 1];
                str[j + 1] = temp;
            }                                                       //如果前面的字符串大于后面的字符串,交换两者位置
        }
    }
}

int main()
{
    char *str[10] = {"ertyu","werkt","tyuio","cvbnm","asdfz"};
    int i = 0;
    int len = 5;

    bubble( str, len );                                             //调用bubble函数
    for( i = 0; i < len; i++ )
    {
        printf("%9s",str[i]);                                       //输出排好序的字符串函数,并让每个字符串占9个字节空间
    }
    printf("\n");

    return 0;
}

4、查找介于n1与n2(0

#include <stdio.h>

int prime(int i)
{
    int j = 2;
    for( j = 2; j < i; j++ )
    {
        if( i % j == 0)
        {
            return 0;                                       //如果i能整除比1大,比i小的数说明i不是素数,返回0,不能整除说明是素数返回1
        }
    }
    return 1;
}

int twosame( int i )
{
    int j = 0;
    int m = 0;
    int n = 0;
    int count = 0;
    int a[10] = {0};

    while(i)
    {
        a[j++] = i % 10;
        i /= 10;                                            //将i每一位上的数取出,放入数组a[j]中
    }

    for( m = 0; m < j; m++ )
    {
        for( n = m + 1; n < j; n++ )
        {
            if( a[m] == a[n] )
            {
                count++;                                    //从头开始比较后面的数有没有和前面的相同的,有count+1
            }
        }
    }

    if(count == 1)
    {
        return 1;
    }
    else
    {
        return 0;
    }                                                       //如果count==1,说明a[j]数组中有且只有两个数相等即i的十进制表示中有且仅有两个相同的数字位,返回1,不为1,返回0
}

int main()
{
    int i = 0;
    int count = 0;
    int n1 = 0;
    int n2 = 0;

    printf("please input 2 number(0 < n1 < n2 <32678):");
    scanf("%d,%d",&n1,&n2);                                 //输入n1 n2的值

    printf("The result is:\n");
    for( i = n1; i <= n2; i++ )
    {
        if( (prime(i) == 1) && (twosame(i) == 1) )          //调用prime函数和twosame函数,如果两个函数返回值都为1,执行if语句
        {
            count++;                                        //当一个数满足条件count+1
            printf("%8d",i);                                //输出该数,并让该数占5个字节空间
            if( count % 10 == 0)
            {
                printf("\n");
            }                                               //当count能整除10时,一行已经输出10个值,换行
        }
    }
    printf("\n");

    return 0;
}

5、编写函数void change(char *a,char *b,char*c)。 函数功能是首先把b指向的字符串逆向存放,然后将a指向的字符串和b指向的字符串按排列顺序交叉合并到c指向的数组中,两个字符串中过长的剩余字符接在c指向数组的尾部。
例如,当a指向的字符串为”abcdefg”,b指向的字符串为”1324”时,c指向的数组中字符串应为”a4b2c3d1efg”。

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

void swap( char *b )
{
    int i = 0;
    int temp = 0;
    int len = strlen(b);
    for( i = 0; i < len / 2; i++ )
    {
        temp = b[i];
        b[i] = b[len - 1 - i];
        b[len - 1 - i] = temp;
    }                                                   //逆序函数,将字符串b中的字符逆向存放
}

void change( char *a, char *b, char *c )
{
    swap(b);                                            //调用逆序函数

    while( *a != '\0' && *b != '\0' )
    {
        *c = *a;
        c++;
        a++;
        *c = *b;
        c++;
        b++;
    }                                                   //当字符串a b都不为空时,将a b中的字符交叉存放到字符串c中

    while( *a != '\0' && *b == '\0' )
    {
        *c = *a;
        c++;
        a++;
    }                                                   //当字符串a不为空,b为空时,将a中剩余的字符存放到c中

    while( *a == '\0' && *b != '\0' )
    {
        *c = *b;
        c++;
        b++;
    }                                                   //当字符串a为空,b不为空时,将b中剩余的字符存放到c中
    *c = '\0';
}

int main()
{   
    char a[100] = {0};
    char b[100] = {0};
    char c[100] = {0};

    printf("please input the first string:\n");
    scanf("%s",a);                                      //输入字符串a
    printf("please input the second string:\n");
    scanf("%s",b);                                      //输入字符串b

    change(a,b,c);                                      //调用change函数

    printf("the result is :\n");
    printf("%s\n",c);                                   //输出结果字符串c

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值