#1
by asahi » 5年前
課題を解きましたが、別の解き方がないか探しています。
課題内容:
入力された英単語を複数形にするプログラムを作成する
やりたいこと
a 入力された英単語をそれぞれ配列english_words[]に保存
b english_words[]に保存さえた英単語を複数形に変換してenglish_words_plural[]に保存
c 出力
example
入力文字
cat
dog
処理a
english_wordsの配列0番目にcatを保存する
english_wordsの配列1番目にdogを保存する
処理b
english_words_pluralの配列0番目にcatsを保存する
english_words_pluralの配列1番目にdogsを保存する
処理c
出力
しかし、文字列の2次元配列の扱い方がわかりませんでした。
どなたかよい書き方ありましたらご教授お願いいたします。
<↑のやり方がわからなかったので一回ループ事に判定させたプログラム>
コード:
#include <stdio.h>
#include <string.h>
#define WORDS_NUM_MAX 256
#define WORDS_LENGTH_MAX 256
#define WORDS_LENGTH_MAX_BYTE WORDS_LENGTH_MAX/8
int main(void){
// 自分の得意な言語で
// Let's チャレンジ!!
int words_num = 0; /*入力単語数*/
int words_mem_i = 0;
int word_length = 0; /*英単語文字数*/
int plural_offset = 0; /*複数形にするための文字オフセット*/
char english_words[WORDS_NUM_MAX]; /*入力英単語*/
char english_words_plural[WORDS_NUM_MAX]; /*複数形英単語*/
scanf("%d",&words_num);
for(words_mem_i = 0;words_mem_i<words_num; words_mem_i++)
{
memset(english_words_plural,'\0',WORDS_LENGTH_MAX_BYTE);
scanf("%s",english_words);
//printf("入力文字は%s\n", english_words);
/*文字列長さ判断*/
word_length = strlen(english_words);
plural_offset = word_length -1;
/*確認*/
//printf("文字長さ%d\n",word_length);
/*文字判断*/
if(strstr(english_words+plural_offset,"s") != '\0' || strstr(english_words+plural_offset-1,"sh") != '\0' || strstr(english_words+plural_offset-1,"ch") != '\0' || strstr(english_words+plural_offset,"o") != '\0' ||strstr(english_words+plural_offset,"x") != '\0')/*末尾が s, sh, ch, o, x のいずれかである英単語の末尾に es を付ける*/
{
/*複数形*/
strcpy(english_words_plural,english_words);
strcat(english_words_plural,"es");
printf("%s\n",english_words_plural);
}
else if(strstr(english_words+plural_offset,"f") != '\0')/*末尾が f, fe のいずれかである英単語の末尾の f, fe を除き、末尾に ves を付ける*/
{
/*複数形*/
strncpy(english_words_plural,english_words,word_length-1);
strcat(english_words_plural,"ves");
printf("%s\n",english_words_plural);
}
else if(strstr(english_words+plural_offset-1,"fe") != '\0')
{
/*複数形*/
strncpy(english_words_plural,english_words,word_length-2);
strcat(english_words_plural,"ves");
printf("%s\n",english_words_plural);
}
else if(strstr(english_words+plural_offset,"y") != '\0' && (strstr(english_words+plural_offset-1,"a") == '\0' && strstr(english_words+plural_offset-1,"i") == '\0' && strstr(english_words+plural_offset-1,"u") == '\0' && strstr(english_words+plural_offset-1,"e") == '\0' && strstr(english_words+plural_offset-1,"0") == '\0'))/*末尾の1文字が y で、末尾から2文字目が a, i, u, e, o のいずれでもない英単語の末尾の y を除き、末尾に ies を付ける*/
{
/*複数形*/
strncpy(english_words_plural,english_words,word_length-1);
strcat(english_words_plural,"ies");
printf("%s\n",english_words_plural);
}
/*上のいずれの条件にも当てはまらない英単語の末尾には s を付ける*/
else
{
/*複数形*/
strcpy(english_words_plural,english_words);
strcat(english_words_plural,"s");
printf("%s\n",english_words_plural);
}
//printf("リセットenglish %s\n",english_words_plural);
}
return 0;
}
課題を解きましたが、別の解き方がないか探しています。
課題内容:
入力された英単語を複数形にするプログラムを作成する
やりたいこと
a 入力された英単語をそれぞれ配列english_words[]に保存
b english_words[]に保存さえた英単語を複数形に変換してenglish_words_plural[]に保存
c 出力
example
入力文字
cat
dog
処理a
english_wordsの配列0番目にcatを保存する
english_wordsの配列1番目にdogを保存する
処理b
english_words_pluralの配列0番目にcatsを保存する
english_words_pluralの配列1番目にdogsを保存する
処理c
出力
しかし、文字列の2次元配列の扱い方がわかりませんでした。
どなたかよい書き方ありましたらご教授お願いいたします。
<↑のやり方がわからなかったので一回ループ事に判定させたプログラム>
[code]
#include <stdio.h>
#include <string.h>
#define WORDS_NUM_MAX 256
#define WORDS_LENGTH_MAX 256
#define WORDS_LENGTH_MAX_BYTE WORDS_LENGTH_MAX/8
int main(void){
// 自分の得意な言語で
// Let's チャレンジ!!
int words_num = 0; /*入力単語数*/
int words_mem_i = 0;
int word_length = 0; /*英単語文字数*/
int plural_offset = 0; /*複数形にするための文字オフセット*/
char english_words[WORDS_NUM_MAX]; /*入力英単語*/
char english_words_plural[WORDS_NUM_MAX]; /*複数形英単語*/
scanf("%d",&words_num);
for(words_mem_i = 0;words_mem_i<words_num; words_mem_i++)
{
memset(english_words_plural,'\0',WORDS_LENGTH_MAX_BYTE);
scanf("%s",english_words);
//printf("入力文字は%s\n", english_words);
/*文字列長さ判断*/
word_length = strlen(english_words);
plural_offset = word_length -1;
/*確認*/
//printf("文字長さ%d\n",word_length);
/*文字判断*/
if(strstr(english_words+plural_offset,"s") != '\0' || strstr(english_words+plural_offset-1,"sh") != '\0' || strstr(english_words+plural_offset-1,"ch") != '\0' || strstr(english_words+plural_offset,"o") != '\0' ||strstr(english_words+plural_offset,"x") != '\0')/*末尾が s, sh, ch, o, x のいずれかである英単語の末尾に es を付ける*/
{
/*複数形*/
strcpy(english_words_plural,english_words);
strcat(english_words_plural,"es");
printf("%s\n",english_words_plural);
}
else if(strstr(english_words+plural_offset,"f") != '\0')/*末尾が f, fe のいずれかである英単語の末尾の f, fe を除き、末尾に ves を付ける*/
{
/*複数形*/
strncpy(english_words_plural,english_words,word_length-1);
strcat(english_words_plural,"ves");
printf("%s\n",english_words_plural);
}
else if(strstr(english_words+plural_offset-1,"fe") != '\0')
{
/*複数形*/
strncpy(english_words_plural,english_words,word_length-2);
strcat(english_words_plural,"ves");
printf("%s\n",english_words_plural);
}
else if(strstr(english_words+plural_offset,"y") != '\0' && (strstr(english_words+plural_offset-1,"a") == '\0' && strstr(english_words+plural_offset-1,"i") == '\0' && strstr(english_words+plural_offset-1,"u") == '\0' && strstr(english_words+plural_offset-1,"e") == '\0' && strstr(english_words+plural_offset-1,"0") == '\0'))/*末尾の1文字が y で、末尾から2文字目が a, i, u, e, o のいずれでもない英単語の末尾の y を除き、末尾に ies を付ける*/
{
/*複数形*/
strncpy(english_words_plural,english_words,word_length-1);
strcat(english_words_plural,"ies");
printf("%s\n",english_words_plural);
}
/*上のいずれの条件にも当てはまらない英単語の末尾には s を付ける*/
else
{
/*複数形*/
strcpy(english_words_plural,english_words);
strcat(english_words_plural,"s");
printf("%s\n",english_words_plural);
}
//printf("リセットenglish %s\n",english_words_plural);
}
return 0;
}
[/code]