解決済み

作ったプログラミングC何だけど、評価していただけませんが?不足があれば、教えてください!

  • 困ってます
  • 質問No.4183541
  • 閲覧数881
  • ありがとう数103
  • 気になる数0
  • 回答数5
  • コメント数0

お礼率 66% (4/6)

文字列「abc」の各アルファベットを1文字ずらすと文字列「bcd
」になり、
文字列「nisidate」の各アルファベットを2文字ずらすと文字
列「pkukfcvg」となる。さらに、
文字列「kibishii」の各アルファベットを2文字ずらすと文字
列「mkdkujkk」となる。
このような、任意の文字列の各要素を任意の文字数ずらすプロ
グラムを作成する、なお、zを1文字ずらしたとき
のアルファベットはaとする。

#include <stdio.h>
#include <string.h>

int main(void)
{
char str[27]="abcdefghijklmnopqrstuvwxyz",str1[50], str2[50];
int x,i,j,len;

printf("文字列を入力---> ");
scanf("%s", str1);

printf("何文字ずらすかを入力---> ");
scanf("%d",&x);

len=strlen(str1);

for(i=0;i<len;i++)
{
for(j=0;j<27;j++)
{
if(str1[i]=='z')
{
str2[i]=str[x-1];
}
if(!(str1[i]=='z'))
{
if(str1[i]==str[j])
{
str2[i]=str[j+x];
}
}
}
}

printf("%d文字ずらした文字列は%sです\n", x, str2);

return 0;

よろしくお願いします!!

質問者が選んだベストアンサー

  • 回答No.4

ベストアンサー率 52% (391/751)

#3です。
指摘だけでも、不親切なので。
以下、模範解答。
修正点は以下の通り。
ずらしの文字は、右側だけだが、左側にも対応。(左側の場合、マイナスの値を指定)
ずらじの文字数が、26以上でも対応する。2600のずらし等もOK。
zの文字のみを特殊な扱いにしない。yを2文字ずらして、aになるようにする。
以下ソース。
---------------------------------------------
#include <stdio.h>
#include <string.h>
//shfit_count :ずらし数(26以上を許す)負の数でも良い
//char_in :入力文字(1文字)
//戻り値:ずらした結果の1文字
char shift_char(int shift_count,char char_in)
{
char str[27] = "abcdefghijklmnopqrstuvwxyz";
int i,j;
//入力文字の位置を検索
for (i = 0; i < 26; i++){
if (char_in == str[i]) break;
}
//入力文字がa~z以外ならaとみなす
if (i == 26) i = 0;
//ずらした後の文字の位置を求める。26の余りを求めるのは、26以上のずらしに対応するため
j = (i + shift_count)%26;
//左へのずらしに対応する
if (j < 0) {
j += 26;
}
//これで 0<=j<=25であることが保証されるので、この位置の文字を返す
return str[j];
}
int main(void)
{
char str[27]="abcdefghijklmnopqrstuvwxyz",str1[50], str2[50];
int x,i,j,len;

printf("文字列を入力---> ");
scanf("%s", str1);

printf("何文字ずらすかを入力---> ");
scanf("%d",&x);

len=strlen(str1);

for(i=0;i<len;i++)
{
str2[i] = shift_char(x,str1[i]);
}
//終端にNULLを付加する
str2[i] = '\0';
printf("%d文字ずらした文字列は%sです\n", x, str2);

return 0;
}
--------------------------------------------------------
お礼コメント
lw3695

お礼率 66% (4/6)

勉強になりました、
詳しくて教えてこころより感謝します!
投稿日時 - 2008-07-18 13:07:23

その他の回答 (全4件)

  • 回答No.5

ベストアンサー率 22% (50/220)

#include <stdio.h>

void shift(const char *s1, char *s2, int n)
{
char *a = "abcdefghijklmnopqrstuvwxyz";
int i, j;

if(n < 0) n = 26 - (-n % 26);
for(j = 0; s2[j] = s1[j]; j ++){
for(i = 0; i < 26; i ++){
if(s2[j] == a[i]){
s2[j] = a[(i + n) % 26];
break;
}
}
}
}

int main(void)
{
char s1[64], s2[64];
int n;

printf("文字列を入力---> ");
scanf("%63[^\n]%*[^\n]%*c", s1);
printf("何文字ずらすかを入力---> ");
scanf("%d", &n);
shift(s1, s2, n);
puts(s2);
return 0;
}
お礼コメント
lw3695

お礼率 66% (4/6)

教えれいただいて、本当にありがどうございます!
投稿日時 - 2008-07-18 13:03:54
  • 回答No.3

ベストアンサー率 52% (391/751)

#2のかたがいわれているようにyを2文字ずらした場合が、考慮されていません。
以下、実行結果です。
case1
文字列を入力---> az
何文字ずらすかを入力---> 2
2文字ずらした文字列はcbです
これはOKです。
case2
文字列を入力---> ay
何文字ずらすかを入力---> 2
2文字ずらした文字列はcです
これは、NGです。
お礼コメント
lw3695

お礼率 66% (4/6)

Thank you very much!
投稿日時 - 2008-07-18 13:09:07
  • 回答No.2

ベストアンサー率 47% (287/608)

・str2が閉じられていない(文字列の末尾にNULL文字がない
・入力の制限だとずらす文字数制限はないがこのプログラムだと問題がでるのでは?
 例えば,zを1文字ずらせばaは考慮されているが,だが27文字ずらせば?
 yを1文字ずらせばzだが,2文字ずらせば?
 
剰余を使った添字を指定を使えばもう少し簡潔にかけませんか?
(25 + 1) % 26 = 0
  • 回答No.1

ベストアンサー率 31% (1589/5031)

例題の文字列でテストしてみましたか?
それから、'z'を特別扱いしている理由は何ですか?
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する

特集


OKWAVE若者応援スペシャル企画

ピックアップ

ページ先頭へ