cin cout string题解报告

hdu1090简单输入输出

题意: 输出 a + b。

scanf代码

#include<stdio.h>
int main(){
    int t, a, b;
    scanf("%d", &t);
    while(t--){
        scanf("%d%d", &a, &b);
        printf("%d\n", a + b);
    }
    return 0;
}

cin代码

#include<iostream>
using namespace std;

int t, a, b;
int main(){
    cin >> t;
    while(t--){
        cin >> a >> b;
        cout << a + b << endl;
    }
    return 0;
}

hdu2002格式输出

题意: 计算球的体积。
  //部分题目用到的pi,自己定义一个精确度到小数点四五位以后的浮点数就够用了。也可以用更精确的办法计算pi的值,这里不具体展开。

printf代码

#include<stdio.h>
const double PI = 3.1415927;

int main(){
	double r, v;
	while(~scanf("%lf", &r)){
        v = (4.0 * PI * r * r * r) / 3;
        printf("%.3lf\n", v);
    }
    return 0;
}

cout代码

  cin、cout本来写起来感觉很方便,但是控制输出格式的时候就不那么方便了,题目要求输出精确到小鼠点后三位,cout用到<< fixed << setprecision(3)来控制输出格式,同时用到头文件#include<iomanip>。可以做个了解,cout的格式输出还有很多,也不展开介绍,感兴趣的可以自行百度,或者参考一些C++语言的书本。

#include<iostream>
#include<iomanip>
using namespace std;
const double pi = 3.1415927;

double r, v;
int main(){
	while(cin >> r){
		v = (4 * pi * r * r * r) / 3;
		cout << fixed << setprecision(3) << v << endl;
	}
	return 0;
}

poj3981字符串替换

题意: 把语句中的you改成we后输出。
题意很简单,代码也很简单,所以直接看代码自行理解,此处不加赘述。

getchar解决

#include<iostream>
using namespace std;

int main(){
	char a, b, c;
	while((a = getchar()) != EOF){
		if(a == 'y')
			if((b = getchar()) == 'o')
				if((c = getchar()) == 'u')
					cout << "we";
				else
					cout << "yo";
			else
				cout << "y" << b;
		else
			cout << a;
	}
	return 0;
}

gets解决

#include<iostream>
using namespace std;

char str[1005];
int main(){
	while(gets(str) != NULL){
		for(int i = 0; str[i] != '\0'; i++){
			if(str[i] == 'y' && str[i + 1] == 'o' && str[i + 2] == 'u'){
				cout << "we";
				i += 2;
			}else
				cout << str[i];
		}
		cout << endl;
	}
	return 0;
}

string解决

string的方法看上去可能会更加高级,用到了string下的两个函数:

  • string.find()如果能再字符串S中找到子串s,则返回子串s的第一个字符的位置,否则返回-1。
  • string.replace()替换函数,目的是把字符串S中某个子串s改成t
#include<iostream>
#include<string>
using namespace std;

int main(){
	int pos;
	string str;
	while(getline(cin, str)){
		while((pos = str.find("you")) != -1)	//如果语句中含有 you
			str.replace(pos, 3, "we");			//字符串替换		you -> we
		cout << str << endl;
	}
	return 0;
}

hdu1062字符串翻转

题意: 将语句中的单词翻转后输出。

string解决

注意点:

  • 输入t之后紧跟的一个回车'\n'会影响到后续语句的读入,所以需要用cin.get();处理。
  • 如果是字符串数组char str[]的整句读入,可以用gets(str),但这里是STL下的string,应该采用getline(cin, s);的形式。
  • string.reverse()将字符串翻转。用到头文件#include<algorithm>
  • 题目要求的是翻转单词,而不是整个语句,所以我们需要遍历整个语句,找到每个单词,然后进行反转操作。
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;

int t;
string s;
int main(){
	cin >> t;
	cin.get();
	while(t--){
		getline(cin, s);
		int begin = 0;					//begin分别记录某个单词首字母的位置
		int len = s.length();
		for(int i = 0; i <= len; i++){
			if(i == len || s[i]==' '){	//遍历到空格'或者句末的时候标志着一个单词的结束
				reverse(s.begin() + begin, s.begin() + i);
				begin = i + 1;			//翻转以后将单词的首字母位置后移到下一个单词
			}
		}
		cout << s << endl;
	}
	return 0;
}

stack解决(作了解)

stack,称作栈(其实就是个坑),其特点是“先进后出”。例如乘坐电梯先进电梯的最后出来。一盒药最先放进盒子的药片位于最底层最后被拿出来。此处用来单词的翻转非常的应景:把某个单词的字符挨个入栈,然后输出(先进后出,出栈时已完成翻转)。可能理解起来有些晦涩,先做了解吧,早晚都会学到的。
注意点:

  • stack用到头文件#include<stack>
  • 同上一题,输入n之后,需要用getchar();来处理回车'\n'
#include<iostream>
#include<algorithm>
#include<stack>
using namespace std;

int n;
char ch;
int main(){
    scanf("%d", &n);
    getchar();
    while(n--){
        stack<char> s;
        while(1){
            ch = getchar();
            if(ch==' ' || ch=='\n' || ch==EOF){	//空格、回车、文件结束都标志着一个单词的结束
                while(!s.empty()){
                    printf("%c", s.top());	//输出“坑”最顶上的字符
                    s.pop();				//所谓的“出栈”,就是从“坑”的最顶上取出一个字符扔掉
                }
                if(ch=='\n' || ch==EOF)		//回车或文件结束都标志着语句结束
                    break;
                printf(" ");
            }
            else
                s.push(ch);					//所谓“入栈”,就是把单词的字符挨个扔到一个“坑”里
        }
        printf("\n");
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值