第六周

/* 
3去除字符串首尾多余的空格(20分)
题目内容:
用户输入一个字符串,首尾有多余的空格,编写程序来去除这些多余的空格。要求必须使用指针来完成本题。

输入格式:
一个首尾有多余空格字符串。为了便于标识出尾部的空格,在字符串尾部额外添加了个#号表示字符串结束。
字符串内部保证不会出现#号。

输出格式:
去除空格后的字符串,同样在在字符串尾部额外添加了个#号表示字符串结束。

输入样例:
  my score    #

输出样例:
my score#
*/

#include <iostream>  
#include <cstring>
using namespace std;

int main(int argc, char**argv)  
{  
    char str[300];
    cin.getline(str,300);  
    char *s = str; 
    
    while( *s == ' '){
    	s++;
	}
	int len = strlen(s);
	
	for( int i = len - 1 ; i >= 0; i--){ 
		if(s[i - 1] == ' '){
			s[i - 1] = '#';
			s[i] = '\0';
		}
		else{
			break;
		}
	}
	cout<<s;
	return 0;

}  


/*
7(本题只记3分)十进制点分IP转换为32位二进制IP(3分)
题目内容:
编写程序,将十进制点分的IP转换为32位二进制IP地址。程序要能验证输入的十进制点分IP地址的合法性。
用户输入的IP不和法时,输出"data error"。

请使用模块化程序设计的思想,将功能模块编写成函数。通过指针传递参数,操作数据,返回结果。
在主函数中输入IP地址,调用函数进行合法性验证和转换,在主函数中输出32位二进制IP。

输入格式:
十进制点分IP地址(英文句点)

输出格式:
32位二进制数(二进制字符串)

输入样例:
202.151.96.33

输出样例:
11001010100101110110000000100001

提示:十进制转换为二进制。对整数部分,除2取余,直到商为0。例如
13/2=6.....1(低位)
6/2=3......0
3/2=1......1
1/2=0......1
转换后的二进制数位1101
*/

#include <iostream>
#include <iomanip>
#include <cstring>
#include <cmath>

using namespace std;

int getDec(char *p); 
void dec2Bin(int ipDec);
bool isLegal(char *p);

int main(){
	char ipOrig[100];
	cin.getline(ipOrig, 100);
	int len = strlen(ipOrig);
	
	if(isLegal(ipOrig)){
		int ipDec = getDec(ipOrig);	
		dec2Bin(ipDec); 
		
		for(int i = 0; i < len; i++){
			if( ipOrig[i] ==  '.'){
				ipDec = getDec(ipOrig + i + 1);	
				dec2Bin(ipDec); 
			}
			else if( ipOrig[i] != '.'){
				
			}
		}
	}
	else{
		cout<<"data error";
	}
	return 0;
}

int getDec(char *p){
	int num = 0, sum = 0;
	for(int i = 0; p[i] != '.' && p[i] !='\0'; i++){
		num = p[i] - '0';
		sum = sum * 10 + num;
	}
	return sum;
}

void dec2Bin(int ipDec){
	int ipBin = 0, i = 0;
	int remainder = 0;
	
	while(ipDec != 0){
		remainder = ipDec % 2;
		ipDec = ipDec / 2;
		ipBin += remainder * pow(10, i);
		i++;
	}
	cout<<setfill('0')<<setw(8)<<ipBin;
}

bool isLegal(char *p){
	int num = 0;
	int digit = 0;
    int len = strlen(p);
    
	if(*p <'0' || *p >'9'){
			return false;
		}
    
	for (int i = 0; i < len; i++){
        if (p[i] == '.'){  
            num++; 
			digit = 0;
			if(p[i+1] == '.'){
				return false;
			}
        }  
        else if( p[i] <'0' || p[i] >'9'){
        	return false;
		}
		else{
			digit++;
			if(digit > 3){
            	return false;
			}
		}
    } 

    if( num != 3){
    	return false;
	}
	
	int ipDec = getDec(p);
	if(ipDec >255){
		return false;
	}
	for(int i = 0; i < len; i++){
		if( p[i] ==  '.'){
			int ipDec = getDec(p + i + 1);	
			if(ipDec > 255){
			return false;
			}
		}
	}
	return true;
}






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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值