PTA-CプログラミングNoB-文字列(12題)
7051 ワード
7-1
統計大文字と小文字
7-2
統計文字の出現回数
7-3
文字列の逆順序
7-4
文字列の大文字と小文字の変換
7-5
指定文字の検索
7-6
文字列を10進数に変換
7-7
大文字と小文字を出力
7-8
重複文字の削除
7-9
文字列置換
7-10
文字変換
7-11
文字列ループ左シフト
7-12
Q進数をT進数に変換
すべての問題は#includeだけで、それぞれ書いていません.
7-1統計大文字アルファベット(15点)
7-2統計文字出現回数(20分)
7-3文字列逆シーケンス(15分)
7-4文字列アルファベット大文字と小文字の変換(15分)
7-5指定文字の検索(15分)
注意したいのは、getchar()で、最初の行の後ろのスペースを読み落とすことです.
7-6文字列を10進数整数(15分)に変換
この問題では、各文字が16進数文字かどうかを判断し、大文字と小文字を区別しないため、3つの状況を判断する必要があります.また、'-'が最初の16進数文字の前に現れるかどうかを判断する必要があります.この二つを判断して解決した.
7-7大文字英字(15点)を出力
26文字が現れたかどうかを1つの配列で記録すればいいだけです.
7-8重複文字の削除(20点)
1文字を読むたびに、すでに保存されている配列の中で適切な位置を探して挿入し、同じものを見つけたらスキップします.重複しているからです.
7-9文字列置換(15分)
アルファベット表を26の大きさの配列で表し、例えばalp[1]は「B」を表し、そして大きさのアルファベットであれば、彼の対応する位置iを25-iにすればよい.対応する位置は彼がなる大きさのアルファベットである.
7-10文字変換(15分)
7-11文字列ループ左シフト(20分)
文字列を読み込んで、後半を出力し、前半を出力すればいいです.
7-12 Q進数をT進数(20点)に変換
この問題は2進数とも2から10の間なので難しくないので、16進数というものがあれば、少し面倒になります.
統計大文字と小文字
7-2
統計文字の出現回数
7-3
文字列の逆順序
7-4
文字列の大文字と小文字の変換
7-5
指定文字の検索
7-6
文字列を10進数に変換
7-7
大文字と小文字を出力
7-8
重複文字の削除
7-9
文字列置換
7-10
文字変換
7-11
文字列ループ左シフト
7-12
Q進数をT進数に変換
すべての問題は#includeだけで、それぞれ書いていません.
7-1統計大文字アルファベット(15点)
int main() {
char ch;
int cnt = 0;
while((ch = getchar()) != '
') // "!=" "=" ,
if(ch >= 'B' && ch <= 'Z' && ch != 'E' && ch != 'I' && ch != 'O' && ch != 'U')
++cnt;
printf("%d
", cnt);
return 0;
}
7-2統計文字出現回数(20分)
int main() {
int cur = 0, cnt = 0;
char str[80];
char ch, target;
while((ch = getchar()) != '
') // ,
str[cur++] = ch;
scanf("%c", &target);
for(int i = 0; i < cur; i++)
if(target == str[i])
++cnt;
printf("%d
", cnt);
return 0;
}
7-3文字列逆シーケンス(15分)
int main() {
int cur = 0;
char str[81], ch;
while((ch = getchar()) != '
')
str[cur++] = ch;
for(int i = cur - 1; i >= 0; i--)
printf("%c", str[i]);
return 0;
}
7-4文字列アルファベット大文字と小文字の変換(15分)
int main() {
char ch;
while((ch = getchar()) != '#') {
if(ch >= 'a' && ch <= 'z') printf("%c", ch + 'Z' - 'z');
else if(ch >= 'A' && ch <= 'Z') printf("%c", ch - 'Z' + 'z');
else printf("%c", ch);
}
return 0;
}
7-5指定文字の検索(15分)
注意したいのは、getchar()で、最初の行の後ろのスペースを読み落とすことです.
int main() {
char ch, target;
int idx = -1, cur = 0;
scanf("%c", &target);
getchar();
while((ch = getchar()) != '
') {
if(ch == target) idx = cur;
++cur;
}
if(idx == -1) printf("Not Found
");
else printf("index = %d
", idx);
return 0;
}
7-6文字列を10進数整数(15分)に変換
この問題では、各文字が16進数文字かどうかを判断し、大文字と小文字を区別しないため、3つの状況を判断する必要があります.また、'-'が最初の16進数文字の前に現れるかどうかを判断する必要があります.この二つを判断して解決した.
int main() {
int flaghex = 0, minus = 0; // 16 ,
int sum = 0;
char ch;
while((ch = getchar()) != '#') {
if(ch >= '0' && ch <= '9') {
flaghex = 1;
sum = sum * 16 + (ch - '0');
}
else if(ch >= 'a' && ch <= 'f') {
flaghex = 1;
sum = sum * 16 + (ch - 'a') + 10;
}
else if(ch >= 'A' && ch <= 'F') {
flaghex = 1;
sum = sum * 16 + (ch - 'A') + 10;
}
else if(ch == '-' && flaghex == 0) // '-'
minus = 1;
}
if(minus == 1) printf("%d
", -sum);
else printf("%d
", sum);
return 0;
}
7-7大文字英字(15点)を出力
26文字が現れたかどうかを1つの配列で記録すればいいだけです.
int main() {
static int alp[26]; // 0, 26
int flag = 0; // Not Found
char ch;
while((ch = getchar()) != '
') {
if(ch > 'Z' || ch < 'A') continue; //
if(alp[ch - 'A'] == 0) { //
printf("%c", ch);
alp[ch - 'A'] = 1;
flag = 1;
}
}
if(flag == 0) printf("Not Found
");
return 0;
}
7-8重複文字の削除(20点)
1文字を読むたびに、すでに保存されている配列の中で適切な位置を探して挿入し、同じものを見つけたらスキップします.重複しているからです.
int main() {
char res[82], ch;
int cur = 0;
while ((ch = getchar()) != '
') {
int flag = 0; // ,
for (int i = 0; i < cur; i++) {
if (res[i] == ch) { // ,
flag = 1;
break;
}
if (res[i] > ch) { // ascii ,
for (int j = cur; j > i; j--) // i
res[j] = res[j - 1];
res[i] = ch; // ch i
++cur; // res
flag = 1;
break;
}
}
if (flag == 0) // , res ch
res[cur++] = ch; // res
}
// res
for (int i = 0; i < cur; i++)
printf("%c", res[i]);
return 0;
}
7-9文字列置換(15分)
アルファベット表を26の大きさの配列で表し、例えばalp[1]は「B」を表し、そして大きさのアルファベットであれば、彼の対応する位置iを25-iにすればよい.対応する位置は彼がなる大きさのアルファベットである.
int main() {
char alp[27] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // '\0'
char ch;
while ((ch = getchar()) != '
') {
if (ch >= 'A' && ch <= 'Z')
printf("%c", alp[25 - (ch - 'A')]);
else
printf("%c", ch);
}
return 0;
}
7-10文字変換(15分)
int main() {
int sum = 0;
char ch;
while ((ch = getchar()) != '
')
if(ch >= '0' && ch <= '9')
sum = sum * 10 + (ch - '0');
printf("%d
", sum);
return 0;
}
7-11文字列ループ左シフト(20分)
文字列を読み込んで、後半を出力し、前半を出力すればいいです.
int main() {
char str[101], ch;
int cur = 0, N;
while ((str[cur++] = getchar()) != '
');
--cur; // '
' ,
scanf("%d", &N);
N %= cur;
// ,
for (int i = N; i < cur; i++) printf("%c", str[i]);
for (int i = 0; i < N; i++) printf("%c", str[i]);
return 0;
}
7-12 Q進数をT進数(20点)に変換
この問題は2進数とも2から10の間なので難しくないので、16進数というものがあれば、少し面倒になります.
int main() {
int Q, T, sum = 0;
scanf("%d", &Q);
getchar(); //
char ch;
while ((ch = getchar()) != '
')
if (ch >= '0' && ch <= ('0' + Q - 1)) // ,2 0 1, 2
sum = sum * Q + (ch - '0'); // sum Q 10
if (sum == 0) {
printf("0
");
return 0;
}
scanf("%d", &T);
if (T == 10) { //
printf("%d
", sum);
return 0;
}
// 10 sum T
int cur = 0, a[100000];
while (sum != 0) {
a[cur++] = sum % T;
sum /= T;
}
for (int i = cur - 1; i >= 0; i--)
printf("%d", a[i]);
return 0;
}