質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

1506閲覧

paizaの【レベルアップ問題集】辞書データの順序について(C言語)

whitehorse85921

総合スコア34

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2021/05/11 12:37

編集2021/05/11 12:52

前提・実現したいこと

※これはpaizaのスキルチェックではありませんのでご安心ください!レベルアップ問題集に関しては解答を教えあったり、コードを公開することは可能です。

https://paiza.jp/works/mondai/c_rank_level_up_problems/c_rank_dictionary_step3

例えば入力例が下記の通りであったとき
2
MIDORIKAWA
KIRISHIMA
2
KIRISHIMA 1
KIRISHIMA 2

出力例は
3
0
になります。

この時実現したいのが「KIRISHIMA 1」「KIRISHIMA 2」は入力例の上から3行目の「KIRISHIMA」と等しいということを実装したいです。
何とぞご教授お願い致します。

発生している問題・エラーメッセージ

エラーはございません。

該当のソースコード

C

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4int main(void) 5{ 6 //n人の名前s_1,...,s_n 7 int n; 8 scanf("%d", &n); 9 10 char s[n][100]; 11 for (int i = 0; i < n; i++) { 12 scanf("%s", s[i]); 13 } 14 15 //m回の攻撃 16 int m; 17 scanf("%d", &m); 18 19 //p_a[i][1]はp_a[i][0]が受けたダメージを表す数 20 char p_a[n][2][100]; 21 for (int i = 0; i < m; i++) { 22 scanf("%s %s", p_a[i][0], p_a[i][1]); 23 } 24 25 //それぞれの人が受けたダメージを出力 26 int damage = 0; 27 for (int i = 0; i < n; i++) { 28 int j = 0; 29 if (strcmp(s[i], p_a[j][0]) == 0) { //ここが正しく動作しないです。 30 damage += atoi(p_a[j][1]); 31 printf("%s %d\n", p_a[j][0], damage); 32 } else { 33 damage += atoi(p_a[j][1]); 34 printf("%s %d\n", p_a[j][0], damage); 35 } 36 j++; 37 } 38} 39

試したこと

一次元配列と二次元配列を探索できるものと稚拙ながら仮説を立てて「一次元配列 二次元配列 探索」と調べましたが、それらしいことは出てきませんでした。

補足情報(FW/ツールのバージョンなど)

paiza.ioを使っています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

1T2R3M4

2021/05/11 12:46

if (s[i] == p_a[j][0]) は文字列比較しているつもりですか。
whitehorse85921

2021/05/11 12:48

1T2R3M4様 文字列比較してるつもりです。すみません。
whitehorse85921

2021/05/11 12:55

1T2R3M4様 申し訳ございませんでした。文字列比較にstrcmpを使っていませんでした。
guest

回答2

0

ベストアンサー

なるべく元のコードを流用してみた。
但し、人の名前のアルファベットの辞書順に並び替える部分は未作成なので、
コメント部分に追加する必要があります。

さらに問題には以下の条件があるので、エラー処理入れるとなおベター。

・1 ≤ n , a_i ≤ 50 (1 ≤ i ≤ n)
・各 s_i (1 ≤ i ≤ n) はアルファベット大文字からなる長さ 1 以上 50 以下の文字列で、互いに全て異なる

C

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4int main(void) 5{ 6 //n人の名前s_1,...,s_n 7 int n; 8 scanf("%d", &n); 9 10 char s[n][100]; 11 for (int i = 0; i < n; i++) { 12 scanf("%s", s[i]); 13 } 14 15 // ここに人の名前のアルファベットの辞書順に並び替える処理を入れる 16 17 //m回の攻撃 18 int m; 19 scanf("%d", &m); 20 21 //p_a[i][1]はp_a[i][0]が受けたダメージを表す数 22 char p_i[m][100]; 23 int p_a[m]; 24 for (int i = 0; i < m; i++) { 25 scanf("%s %d", &p_i[i][0], &p_a[i]); 26 } 27 28 //それぞれの人が受けたダメージを出力 29 int damage; 30 for (int i = 0; i < n; i++) { 31 damage = 0; 32 for (int j = 0; j < m; j++){ 33 if (strcmp(s[i], p_i[j]) == 0) { 34 damage += p_a[j]; 35 } 36 } 37 printf("%d\n", damage); 38 } 39}

投稿2021/05/11 13:33

kaina

総合スコア418

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

whitehorse85921

2021/05/11 16:13

kaina様 私のコードを尊重しながらのご回答誠にありがとうございます。
guest

0

c

1 //それぞれの人が受けたダメージを出力 2 int damage = 0; 3 for (int i = 0; i < n; i++) { 4 int j = 0; 5 if (strcmp(s[i], p_a[j][0]) == 0) { //ここが正しく動作しないです。 6 damage += atoi(p_a[j][1]); 7 printf("%s %d\n", p_a[j][0], damage); 8 } else { 9 damage += atoi(p_a[j][1]); 10 printf("%s %d\n", p_a[j][0], damage); 11 } 12 j++; 13 }

これだとjは常に0になりますよ
iですべての人物をループ、jでダメージの一覧をループ、の二重ループにしたらどうですかね
あとdamageの加算と表示がstrcmpの結果に関わらず常にされているのでif文の意味がないです
damageの加算回数と表示回数を考えると、この二つの式は同時に出現せず、
別の個所に表れるとおもいます

投稿2021/05/11 13:14

jamjam3

総合スコア165

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

whitehorse85921

2021/05/11 13:21

jamjam3様 ご回答ありがとうございます。 二重ループにしたところ int damage = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (strcmp(s[i], p_a[j][0]) == 0) { //ここが正しく動作しないです。 damage += atoi(p_a[j][1]); printf("%s %d\n", p_a[j][0], damage); } else { damage += atoi(p_a[j][1]); printf("%s %d\n", p_a[j][0], damage); } } } 出力が KIRISHIMA 1 KIRISHIMA 3 KIRISHIMA 4 KIRISHIMA 6 となり思った結果になりませんでした。
jamjam3

2021/05/11 13:32

あとdamageの加算と表示がstrcmpの結果に関わらず常にされているのでif文の意味がないです damageの加算回数と表示回数を考えると、この二つの式は同時に出現せず、 別の個所に表れるとおもいます
whitehorse85921

2021/05/11 13:38

jamjam3様 ありがとうございます。 私もこのif文のところをどう書けばいいのか分かりかねています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問