- 締切済み
c言語の難しい問題について
(c言語の問題) 下記のプログラムを完成させ、キーボードから文字列を読み込み、-1文字ずらすことによって暗号化を行うプログラムを作りなさい。ただし、ピリオド、空白などはそのままにするようにすること。 例)this is a pen. sghr hr @ qdm. #include<stdio.h> #define CHAR_NUM 256 void angou( I ) { II } int main(void) { unsigned char text[CHAR_NUM]; char moji; int i; puts("暗号化する文字を入力しなさい。"); while((moji=getchar()) !=EOF){ text[i]=moji; i++; } angou(text i); printf("%s",text); return(0); } I、IIに入る文を書きなさい。 私はIには「char x[],int y」 IIには 「if('A'<x[i]<'Z' && 'a'<x[i]<'z') int j; for(j=0;j<y;j++) x[j]=x[j]-1 else」 といれたのですが、出力がうまくでません。どうすればいいのですか?
- みんなの回答 (8)
- 専門家の回答
みんなの回答
- gorajue
- ベストアンサー率0% (0/0)
#include <stdio.h> void ango(void){ char n; n=getchar(); while(n){ n=getchar(); if(n=='.' || n==' '){ printf("%c",n); continue; } printf("%c",n-1); } } int main(void){ ango(); return 0; } これでできますよ
- atushi256
- ベストアンサー率62% (10/16)
I ----------------------- char str[], int length ----------------------- II ----------------------- int i; for( i=0; i<length; ++i ){ if( ('A'<str[i] && str[i]<'Z') || ('a'<str[i] && str[i]<'z') ) str[i] = str[i]-1; } -----------------------
(どこかの「お教室」で出された課題でしょうか、参考URLにも似たような・・) >-1文字ずらす → 「100円のものを -1 割引き」って、いくら??? (以前、民放女子アナが沖縄20℃、東京10℃のときに「ちょうど2倍」って言ってたけど、それ以来、札幌-5℃、東京5℃になったとき、なんて言うか楽しみにしている年寄り←回答脱線?) ちなみに、参考URLでは、 >C言語を初めてけっこう立つんですが。 正C言語を始めてけっこう経つんですが。 ご両人「お教室」いっしょの帰国子女?。 (「△起(たつ)」でなくてよかった年寄り←削除対象?) >this is a pen. >sghr hr @ qdm. a(0x61)→@(0x40)、p(0x70)→q(0x71)??? これですと、 rprprp は qqqqqq となり解読は rrrrrr ??? ★★★まっ、それはおいといて、★★★ ソースについては、ご自身で★バグを取ってから★質問しましょう。 というか、最低限のマナーだと思います。 その前に、No4さんがいわれるとおり、 >まずもっとC言語自体を理解した方がいい。 >失礼だけど、根本的にわかってないと思う。 と私も思います。 で、質問文に、 >IIには >if('A'<x[i]<'Z' && 'a'<x[i]<'z') と、すごく理解しがたい(x[i]に何が入っていようが trueになりそうな)if文を使われていますが、 #include<stdio.h> void main(void) { int i = 0; if( i == 1 ){} // (1) if( i = 1 ){} // (2) if( 1 == i ){} // (3) if( 1 = i ){} // (4) } をコンパイルして下さい。 なぜ、こんなメッセージを出すのか★考えて★みて下さい。 ・これからは if文は、(3)のように・・・となればいいのですが。 (まだまだ、いろいろあるけど、でも) 参考URLの方より goto文がないのは、いいですね。 「お教室」で会われましたら、(参考URLNo1さんへの「補足」で) >goto文はやはり使ってはいけないのでしょうか? とありますが、「言語仕様に goto文はあるし『いけない』わけではない。 『C言語を始めてけっこう経つ』んだから空気読めよ」と伝えて下さい。
- jacta
- ベストアンサー率26% (845/3158)
とりあえず気分転換に作ってみました。 (仕様が不明な部分は勝手に解釈しています) (I) void (II) } #include <string.h> #include <ctype.h> int main(void) { static const char t[] = "@abcdefghijklmnopqrstuvwxyz"; int c; while ((c = getchar()) != EOF) { const char *p; p = strchr(t, tolower(c)); if (p != NULL) putchar(&p[-1] < t ? t[sizeof t - 1] : p[-1]); else putchar(c); if (c == '\n') break; } return 0; #define main fake_main #define angou(x) ざっくりと動作は確認しました。
- crew21
- ベストアンサー率26% (58/222)
質問者さん、まずもっとC言語自体を理解した方がいい。 失礼だけど、根本的にわかってないと思う。 だから答えてあげたいけど、答えても分からないと思う。 でもそれだけだと可哀想なので、質問者さんがわかりそうなことを数点書いておきます。 そしてたぶんですが、質問者さんはIとIIの回答を求めていますが、実はmain()の中身も質問者さんが書いたのではないですか? なぜなら、 ・#define CHAR_NUM 256 と書かれていますが、それ以上入力された場合のことが考慮されていない。 ・iが初期化されていない。...ということは、iがいきなり28965とかの値になっている可能性もある(その可能性の方が高い)ということです。 もし、main()の中身が、質問者さんが書かれた通りに書かれていたとしたら、この問題自体が間違っています。 仮にそれを置いておくにしても、 ・IIの部分はコンパイルが通りません。 いきなりx[i]って書かれても、コンパイルは i が何だかわからないです。 ・if('A'<x[i]<'Z' && 'a'<x[i]<'z') は、もし書くなら if(('A'<x[i]<'Z') || ('a'<x[i]<'z')) じゃないかな。 前者だと、逆に英字以外を拾ってくることになるよ。 ほかにもいろいろあるけど、あまりヒマじゃないんでこの辺で。
- aris-wiz
- ベストアンサー率38% (96/252)
このプログラムの1, 2だけを変更して「正常動作できる」 プログラムは、完成できないとわたしは思いますが。。。 #include<stdio.h> #define CHAR_NUM 256 void angou( 1 ) { 2 } int main(void) { unsigned char text[CHAR_NUM]; char moji; int i; puts("暗号化する文字を入力しなさい。"); while((moji=getchar()) !=EOF){ text[i]=moji; /*未定義動作です*/ i++; } angou(text i); printf("%s",text); return(0); } 問題文のコード自体が間違っているので、 出題者に確認した方がいいと思います。 >どうすればいいのですか? どうすればいいか知りたいなら、 何を知りたいのか教えてください。
- jacta
- ベストアンサー率26% (845/3158)
あちらこちらで削除された質問のようですが... http://www.google.com/search?hl=ja&rlz=1T4DBJP_ja___JP222&q=angou+CHAR_NUM+&lr= > キーボードから文字列を読み込み、 キーボードから文字列を読み込む一般的な方法はありません。 標準入力の間違いではないですか? 本当にキーボードから読むのであれば、処理系を特定しなければ無理です。 > -1文字ずらす 「-1文字ずらす」とは? > ピリオド、空白など 「など」には何が含まれるのでしょうか?
- koko_u_
- ベストアンサー率18% (459/2509)
>出力がうまくでません。 >どうすればいいのですか? 出力以前にコンパイルが通らないと思いますが。