打字

题目传送门

这个题目太lj了,题面没说清楚

首先,这个题目非常简单,有几个地方我没有搞对

1.freopen写错了

大忌!!!!!

千万不要把w写成r,或者点写成逗号

2.只判断了第一个字母是不是大写,并没有判断其他字母是不是都是小写!很重要,不然freopen写对了也只是40分
下面展示错误代码

#include<bits/stdc++.h>
using namespace std;

void gmin(int &x,int y){x=min(x,y);}
void gmax(int &x,int y){x=max(x,y);}

int n;
char s[11][1005][1005];
int len[11][1005],a[11];//len_i,j表示第i句话的第j个单词的长度,a_i表示第i句话有几个单词
 
bool check_alp(char ch){
	if(ch=='.'||ch=='!'||ch=='?'||ch==' '||ch=='\n') return 0;
	return 1;
}

int main(){
	freopen("word.in","r",stdin);
	freopen("word.out","r",stdout);//w写成r了,RTE0!
	int cnt=1;
	a[cnt]=1;
	scanf("%d\n",&n);
	while(1){
		char ch;
		scanf("%c",&ch);
		if(check_alp(ch)){
			s[cnt][a[cnt]][++len[cnt][a[cnt]]]=ch;
		}else{
			if(ch==' '){//纯空格
				a[cnt]++;
			}else if(ch=='.'||ch=='?'||ch=='!'){//标点 
				cnt++;a[cnt]=1;
			}else{
				break;
			}
		}
	}
	for(int i=1;i<=n;i++){
		int ans=0;
		for(int j=1;j<=a[i];j++){
			if(len[i][j]==1){
				char ch=s[i][j][1];
				if('A'<=ch&&ch<='Z') ans++;
				continue;
			}
			char ch1,ch2;
			ch1=s[i][j][1];
			ch2=s[i][j][len[i][j]];
			if('A'<=ch1&&ch1<='Z'){
				if('a'<=ch2&&ch2<='z') ans++;//不知道这里在干什么,不需要判断最后一个字符,我可能是被题面误解了
				//这里还需要判断其他字母
			}
		}
		printf("%d\n",ans);
	}
}

接下来是正解

#include<bits/stdc++.h>
using namespace std;

void gmin(int &x,int y){x=min(x,y);}
void gmax(int &x,int y){x=max(x,y);}

int n;
char s[11][1005][1005];
int len[11][1005],a[11];//len_i,j表示第i句话的第j个单词的长度,a_i表示第i句话有几个单词
 
bool check_alp(char ch){
	if(ch=='.'||ch=='!'||ch=='?'||ch==' ') return 0;
	return 1;
}

int main(){
	freopen("word.in","r",stdin);
	freopen("word.out","w",stdout);//cao!
	int cnt=1;
	a[cnt]=1;
	scanf("%d\n",&n);
	while(1){
		char ch;
		scanf("%c",&ch);
		if(check_alp(ch)){
			s[cnt][a[cnt]][++len[cnt][a[cnt]]]=ch;
		}else{
			if(ch==' '){//纯空格
				a[cnt]++;
			}else if(ch=='.'||ch=='?'||ch=='!'){//标点 
				cnt++;a[cnt]=1;
				scanf("%c",&ch);
				//一定要特判 
				if(ch=='\n') break;
			}
		}
	}
	for(int i=1;i<=n;i++){
		int ans=0;
		for(int j=1;j<=a[i];j++){
			if(len[i][j]==1){
				char ch=s[i][j][1];
				if('A'<=ch&&ch<='Z') ans++;
				continue;
			}
			if('A'<=s[i][j][1]&&s[i][j][1]<='Z'){//判断第一个字母是不是大写的
				bool f=1;
				for(int k=2;k<=len[i][j];k++){//判断剩余字母是不是都是小写的
					f&=('a'<=s[i][j][k]&&s[i][j][k]<='z');
				}
				if(f) ans++;
			}
		}
		printf("%d\n",ans);
	}
}

我不知道为什么这个题目的标点符号是一个半角加一个空格,为什么不能直接是一个空格呢?而且改来改去,这个题属实有一点人机

posted @ 2026-01-24 12:03  zhangruotian_Max  阅读(1)  评论(0)    收藏  举报