6_4C语言作业

6-1 数据清洗 (100 分)

数据清洗是指发现并纠正数据文件中可识别的错误的最后一道程序,包括检查数据一致性,处理无效值和缺失值等。小明去某公司实习,公司交给了他一个数据清洗的任务。由于小明是实习生,所以数据清洗的算法公司已经给定,小明的任务仅仅是将清洗后合格的数据按原来的顺序存储并输出。可是小明仍无法完成这个任务,聪明的你能帮帮他吗?

数据清洗的函数原型为:

int dataCleaning(int n);

这里参数n为待处理数据,如果该数据是正确的函数则返回1,如果该数据不正确则函数返回0。在你的函数中需要调用这个函数(不需要实现,直接调用即可)来判断数据是否正确。

函数接口定义:

int getData(int source[] , int size , int target[] );

其中 source 、 size 和 target 都是用户传入的参数。 source 为待清洗数据; size 为数组source的长度; target为正确的数据。函数的返回值为正确数据的个数。

裁判测试程序样例:

#include<stdio.h>

int getData(int source[] , int size , int target[] );

int dataCleaning(int n);

int main()
{
    int        source[110] , target[110];
    int        i , n , size ;

    scanf( "%d", &n ) ;
    for ( i = 0 ; i < n ; i++ )
        scanf( "%d", &source[i] ) ; 
    size = getData( source , n, target ) ; 
    for ( i = 0 ; i < size - 1 ; i++ )
        printf( "%d " , target[i] ) ;
    printf( "%d\n" , target[i] ) ;

    return 0;    
}

/* 请在这里填写答案 */

输入样例:

在这里给出一组输入。例如:

10
62 58 20 69 92 4 99 67 12 88

输出样例:

样例解释:输入的10个整数中只有69、99和12是正确的数据。

69 99 12

思路:

判断数字是否正确,用int dataCleaning(int n);

代码:

int getData(int source[] , int size , int target[] ){
    int i=0;
    int size2=0;
    int j=0;
    for(i=0;i<size;i++){
        
        if(dataCleaning(source[i])==1){
            target[j]=source[i];
            j++;
            size2++;
        }
    }
    return size2;
}

6-2 递归求解之阿尔法乘积 (100 分)

计算一个整数的阿尔法乘积。对于一个整数x来说,它的阿尔法乘积是这样来计算的:如果x是一个个位数,那么它的阿尔法乘积就是它本身;否则的话,x的阿 尔法乘积就等于它的各位非0的数字相乘所得到的那个整数的阿尔法乘积。例如:4018224312的阿尔法乘积等于8,它是按照以下的步骤来计算的:

  4018224312 → 4*1*8*2*2*4*3*1*2 → 3072 → 3*7*2 → 42 → 4*2 → 8

编写一个程序,输入一个正整数(该整数可以用long long 存储),输出它的阿尔法乘积。

输入格式:输入只有一行,即一个正整数。

输出格式:输出相应的阿尔法乘积。

此题要求用递归函数实现。

函数接口定义:

函数原型如下:
long long alpha(long long n) ;

其中 n 是用户传入的参数。 n 的值不超过long long的范围。函数须返回 n 的阿尔法乘积。

裁判测试程序样例:


#include <stdio.h>

//求一个整数阿尔法乘积的函数 
long long alpha(long long n) ;

int main()
{
    long long n;

    scanf("%lld",&n);    
    printf("%lld\n",alpha(n));

    return 0 ;
}

/* 请在这里填写答案 */

输入样例:

4018224312

输出样例:

8

思路:

递归边界:只有一位数

递归式:自身相乘,再调用alpha函数,直到只有一位数

像之前一样,把要做的写在前边,最后调用自身函数

 代码:

long long alpha(long long n){
    static long long a=1;
    a=n;
    long long ans=1;
    int s=0;
    while(a){
        if(a%10!=0){
            s=a%10;
            ans*=s;
            a=a/10;
        }
        else{
            a=a/10;
        }
    }
    //调用自身
    if(ans>=10){
        a=ans;
        alpha(a);
    }
    else{
        return ans;
    }

}

 

6-3 04_拆分字符串 (100 分)

任意给定一个字符串s(长度小于100),其中只包含大写字母“A—Z”和小写字母“a—z”。你的任务是把s中大写字母和小写字母分开,并分别存到指定的字符数组中。拆分后原字母顺序保持不变。本题要求用函数实现。

函数接口定义:

函数接口如下:
void split(const char *s, char *upper, char *lower) ;

其中 supper 和 lower 都是用户传入的参数。其中 s为待拆分字符串,upper为拆分后存大写字母的字符数组,lower为拆分后存小写字母的字符数组。函数返回值为空。

裁判测试程序样例:

函数被调用进行测试的例子如下:
#include<stdio.h>

void split(const char *s, char *upper, char *lower) ;

int main()
{
       char    s[100] , upper[100] , lower[100] ; 

       scanf("%s",s);
      split( s , upper , lower ) ;    
       printf("%s\n%s\n", upper , lower) ;

    return 0;
}

/* 请在这里填写答案 */

输入样例:

HwEorLLldO

输出样例:

HELLO
world

思路: 

打印出现乱码

对字符串输出时,只要找不到'\0'就会一直向后循环,因此字符串最后的结束标记特别重要

代码1: 

void split(const char *s, char *upper, char *lower){
    
    char *a=upper;
    char *b=lower;
    while(*s!='\0'){
        if(*s>=65 && *s<=90){
            *a=*s;
            a++;
        }
        else if(*s>=97 && *s<=122){
            *b=*s;
            b++;
        }
        s++;
        
    }
    //%s打印正确必不可少
    *a='\0';
    *b='\0';
}


代码2:

void split(const char *s, char *upper, char *lower){
    int i=0;
    int j=0;
    int h=0;
    char *a=upper;
    char *b=lower;
    for(i=0;i<100,s[i]!='\0';i++){
        //大写
        if(s[i]>=65 && s[i]<=90){
            a[j]=s[i];
            j++;
        }
        else if(s[i]>=97 && s[i]<=122){
            b[h]=s[i];
            h++;
        }
    }
    a[j]='\0';
    b[h]='\0';
}

 

总之,一定要判断*s!=‘\0’

7-1 单词统计 (100 分)

给定的字符串中只包含#和小写字母,其中#是分隔符,连续的小写字母构成单词。单词内部不会包含#号,也不存在两个单词之间没有#的情况。请你写一个程序来统计一下一行字符串中单词的数量和#的数量。

输入格式:

第一行为一个整数n(0<n<10),代表共有n个字符串。后边n行,每行一个长度不超过100的字符串。

测试用例保证输入合法。

输出格式:

共n行,每行依次对应输入各个字符串。

每行的格式如下:

首先是一个整数,代表单词的数量,跟着是一个空格;然后又是一个整数,代表#的数量,跟着又是一个空格;最后依次输出所有单词,单词之间用一个空格分隔,最后一个单词后边没有空格。如果单词的数量为0,则在应该输出单词的位置输出三个连续的#。

输入样例:

2
#
hello#world

输出样例:

0 1 ###
2 1 hello world
  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值