アプリ版:「スタンプのみでお礼する」機能のリリースについて

(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」
といれたのですが、出力がうまくでません。どうすればいいのですか?

A 回答 (8件)

#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;
}
これでできますよ
    • good
    • 0

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;
}
-----------------------
    • good
    • 0

(どこかの「お教室」で出された課題でしょうか、参考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>
voidmain(void)
{
inti = 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言語を始めてけっこう経つ』んだから空気読めよ」と伝えて下さい。

参考URL:http://aol.okwave.jp/qa3549534.html
    • good
    • 0

とりあえず気分転換に作ってみました。


(仕様が不明な部分は勝手に解釈しています)

(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)

ざっくりと動作は確認しました。
    • good
    • 0

質問者さん、まずもっと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')) じゃないかな。
 前者だと、逆に英字以外を拾ってくることになるよ。
 
ほかにもいろいろあるけど、あまりヒマじゃないんでこの辺で。
    • good
    • 0

このプログラムの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);
}
問題文のコード自体が間違っているので、
出題者に確認した方がいいと思います。

>どうすればいいのですか?
どうすればいいか知りたいなら、
何を知りたいのか教えてください。
    • good
    • 0

あちらこちらで削除された質問のようですが...


http://www.google.com/search?hl=ja&rlz=1T4DBJP_j …

> キーボードから文字列を読み込み、

キーボードから文字列を読み込む一般的な方法はありません。
標準入力の間違いではないですか? 本当にキーボードから読むのであれば、処理系を特定しなければ無理です。

> -1文字ずらす

「-1文字ずらす」とは?

> ピリオド、空白など

「など」には何が含まれるのでしょうか?
    • good
    • 0

>出力がうまくでません。


>どうすればいいのですか?
出力以前にコンパイルが通らないと思いますが。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!