信息学奥赛一本通:1139:整理药名

【题目描述】

医生在书写药品名的时候经常不注意大小写,格式比较混乱。现要求你写一个程序将医生书写混乱的药品名整理成统一规范的格式,即药品名的第一个字符如果是字母要大写,其他字母小写。如将ASPIRIN、aspirin整理成Aspirin。

【输入】

第一行一个数字n,表示有n个药品名要整理,n不超过100。

接下来n行,每行一个单词,长度不超过20,表示医生手书的药品名。药品名由字母、数字和-组成。

【输出】

n行,每行一个单词,对应输入的药品名的规范写法。

【输入样例】

4
AspiRin
cisapride
2-PENICILLIN
Cefradine-6

【输出样例】

Aspirin
Cisapride
2-penicillin
Cefradine-6

【参考程序一】

方法:使用字符串数组

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n,len=0;
	cin>>n;
	string a[n];
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
		len=a[i].size();			 
		if(a[i][0]>='a'&&a[i][0]<='z')
		{
			a[i][0]=a[i][0]-32;
		}

		for(int j=1;j<len;j++)
		{
			if(a[i][j]>='A'&&a[i][j]<='Z')
			{
				a[i][j]=a[i][j]+32;
			}

		 } 
		 cout<<a[i]<<endl;
	}
	return 0;
}

【参考程序二】

tolower和toupper的用法

作用:

C库函数 int tolower(int c)转换给定的字母为小写。

C库函数 int toupper(int c)转换给定的字母为大写。

头文件:在VC6.0可以是ctype.h或者stdlib.h,常用ctype.h

目前在头文件iostream中也可以使用,C++ 5.11已证明。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n, len;
    char s[25];
    cin >> n;
    for(int i = 0; i < n; ++i)
    {
        cin >> s;
        len = strlen(s);
    	s[0] = toupper(s[0]);
    	for(int j = 1; j < len; ++j)
        	s[j] = tolower(s[j]);
        cout << s << endl;
    }
    return 0;
}

 

【参考程序三】

getchar()函数

(1)用法

该函数声明在stdio.h头文件中,使用的时候要包含stdio.h头文件。如:

#include<stdio.h>

int getchar(void);

(2)语法:int getchar(void);

(3)返回值:getchar函数的返回值是用户输入的第一个字符的ASCII码,如出错返回-1,且将用户输入的字符回显到屏幕。如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取。

也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完为后,才等待用户按键。

(4)作用:从标准输入流只读取一个字符(包括空格、回车、tab),读到回车符('\n')时退出,键盘输入的字符都存到缓冲区内,

键入回车getchar就进入缓冲区读取字符,一次只返回第一个字符作为getchar函数的值,如果有循环或足够多的getchar语句,就会依次读出缓冲区内的所有字符直到'\n'。

要理解这一点,之所以你输入的一系列字符被依次读出来,是因为循环的作用使得反复利用getchar在缓冲区里读取字符,而不是getchar可以读取多个字符,事实上getchar每次只能读取一个字符。

如果需要取消'\n'的影响,可以用getchar()来清除,如:while((c=getchar())!='\n'),这里getchar();只是取得了'\n'但是并没有赋给任何字符变量,所以不会有影响,相当于清除了这个字符。

ing namespace std;
char a[101][21];
int main()
{
	int n,len=0;
	cin>>n;
	getchar();//读取回车占位 
	for(int i=0;i<n;i++)
	{
		cin.getline(a[i],21);
	}
	for(int i=0;i<n;i++)
	{
		len=strlen(a[i]);			 
		if(a[i][0]>='a'&&a[i][0]<='z')
		{
			cout<<char(a[i][0]-32);
		}
		else
		{
			cout<<a[i][0];
		 } 
		for(int j=1;j<len;j++)
		{
			if(a[i][j]>='A'&&a[i][j]<='Z')
			{
				cout<<char(a[i][j]+32);
			}
			else
			{
				cout<<a[i][j];
			}
		 } 
		 cout<<endl;
	}


	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芷水无棱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值