无冗余输入字符并过滤--2015

无冗余的输入一个字符串

1)输出该字符串 
2)对于不是首次出现的字符,对其进行过滤,例如 abcdacdef,过滤后为 abcdef 
3)对于字符 0-9,A-F,a-f,将其对应的 ASCII 码的低 4 位进行对调,例如将 1011,转 换为 1101,并将对应的 ACSII 码对应的字符输出,若为字母,转换为大写。

难点:第二问中的过滤,开辟两个字符串指针p,q,p存储原始字符串并输出,q存储过滤后的字符串,首先将p的首位字符赋值给q,再在两层for循环中,外层i从1到len-1为被比较层,内层j从0到i-1为比较层,若发现p+j的值==p+i的值,说明p+i处是已经重复了的值,退出循环,并设置标志位为0,此处也要注意的是,需写完整if-else结构,大概是因为其中有break,否则报错;最后再q添加’\0’;整个输出即可;
第三问中,构造ASCII函数,将单个字符转换为ASCII码并对调低四位,这个利用转化为二进制的方法即可,还得重新在转化为10进制,并输出对应的字符,其中int 型对应的字符可直接强制转化char bb=char(b);同时转化为大写,用<ctype.h>中的函数toupper();
代码:

#include <iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<ctype.h>
using namespace std;
void ASCII(char ch){
    int x=int(ch);
    int a[8]={0},b=0,i=0;
    while(x>0){
        a[i]=x%2;
        x=x/2;
        i++;
    }
    for(int k=0;k<2;k++){
        int temp=a[k];
        a[k]=a[3-k];
        a[3-k]=temp;
    }
    int j=0;
    for(i=7;i>=0;i--){
        cout<<a[i];
        b=b+pow(2,i)*a[i];
    }

    cout<<endl;
    char bb=char(b);
    if(bb>='a'||bb<='z'){
        bb=toupper(bb);
    }
    cout<<b<<" "<<bb<<endl;
}


int main()
{
    char ch;
    char *p=(char*)malloc(sizeof(char));
    int len1=1;
    while((ch=getchar())!='\n'){
        p=(char*)realloc(p,sizeof(char)*len1);
        *(p+len1-1)=ch;
        len1++;
    }
    *(p+len1)='\0';
    cout<<p<<endl;

    char *q=(char*)malloc(sizeof(char));
    int len2=1;
    *(q)=*(p);
    int flag=1;
    for(int i=1;i<len1;i++){
        for(int j=i-1;j>=0;j--){
            if(*(p+i)==*(p+j)){
                flag=0;
                break;
            }
            else flag=1;
        }
        if(flag==1){
            q=(char*)realloc(q,sizeof(char)*(len2+1));
            *(q+len2)=*(p+i);
            len2++;
        }
    }
    *(q+len2)='\0';
    cout<<q<<endl;

    for(int i=0;i<len2;i++){
        if(((*(q+i)>='0')&&(*(q+i)<='9'))||((*(q+i)>='a')&&(*(q+i)<='z'))||((*(q+i)>='A')&&(*(q+i)<='Z'))){
            ASCII(*(q+i));
        }
    }

    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值