ページ 1 / 1
課題のわからない所の質問
Posted: 2010年7月10日(土) 02:01
by 大学生
http://www.dotup.org/uploda/www.dotup.org1017832.jpg
において質問です。
#include<stdio.h>
int main(void)
{
char *str;
int s,i;
double t;
str="abcdefghijklmnopqrstuvwxyz";
printf("整数を入力せよ\n");
scanf("%d",&s);
printf("入力した整数は%d\n\n",s);
if(s>27)
{
printf("error\n");
}
else {
for(i=1;i<27;i++)
{
t=i%s;
if(t==0)
{
printf("入力した値%dで1から26を順に割るとき\nあまりが0になる数字は%d\n",s,i);
}
}
printf("ああああああああ\n");
while( *str !='\0')
{
if (*str=='3' )
{
printf("@");
str++;
}
printf("%c",*str);
str++;
}
}
return 0;
}
というプログラムをつくりました。置換するアルファベットの番号をどうやって文字になおすのですか?
Re:課題のわからない所の質問
Posted: 2010年7月10日(土) 03:16
by Poco
> 置換するアルファベットの番号をどうやって文字になおすのですか?
こんなことする必要ないです。
今何文字目の処理を行っているかを記録しておき、それが入力された数字の倍数になっているか
判定して、出力する文字をアルバベットか、@にすれば良いだけです。
Re:課題のわからない所の質問
Posted: 2010年7月10日(土) 07:57
by へろりくしょん
もう一息ですね。
n倍数の文字を@に置き換えるのですから、判定するのは文字では無く、何番目の文字であるかです。
それよりも、インデントはそろえた方が見やすいですよ。
#include<stdio.h>
int main(void)
{
char *str;
int s,i;
double t;
str = "abcdefghijklmnopqrstuvwxyz";
printf("整数を入力せよ\n");
scanf("%d", &s);
printf("入力した整数は%d\n\n", s);
if(s > 27){
printf("error\n");
}else{
for(i = 1; i < 27; i++){
t = i % s;
if(t == 0){
printf("入力した値%dで1から26を順に割るとき\nあまりが0になる数字は%d\n", s, i);
}
}
printf("ああああああああ\n");
while(*str != '\0'){
if(*str == '3'){
printf("@");
str++;
}
printf("%c", *str);
str++;
}
}
return 0;
}
Re:課題のわからない所の質問
Posted: 2010年7月10日(土) 08:28
by box
余分な空白行が多いため、間延びして見えます。
また、字下げを全く意識していないため、全体的に見づらいです。
ご自分でも、何がどうなっているかわかりづらくないですか?
Re:課題のわからない所の質問
Posted: 2010年7月10日(土) 09:08
by 大学生
修正してみました。
1文字ずつ置換してみました。
多少、見やすいようにしてみました。
これでいいですか?
#include<stdio.h>
int main(void)
{
char *str;
int s,i;
double t;
str="abcdefghijklmnopqrstuvwxyz";
printf("整数を入力せよ\n");
scanf("%d",&s);
printf("入力した整数は%d\n\n",s);
if(s>27)
{
printf("error\n");
}
else{
t=1%s;
if(t==0)
{
if (*str=='a' )
{
printf("@");
str++;
}
}
else if(t!=0)
{
if (*str=='a' )
{
printf("a");
str++;
}
}
t=2%s;
if(t==0)
{
if (*str=='b' )
{
printf("@");
str++;
}
}
else if(t!=0)
{
if (*str=='b' )
{
printf("b");
str++;
}
}
t=3%s;
if(t==0)
{
if (*str=='c' )
{
printf("@");
str++;
}
}
else if(t!=0)
{
if (*str=='c' )
{
printf("c");
str++;
}
}
return 0;
}
メッセージが長いとエラーがでるので、以下4から26までつづけます。
Re:課題のわからない所の質問
Posted: 2010年7月10日(土) 09:47
by へろりくしょん
>多少、見やすいようにしてみました。
>これでいいですか?
やっぱりインデントがそろってません。
> t=1%s;
変数 t は double 型ですね。
たとえば 5/3は、1と余り2なわけですから、2は整数です。
ですから、t も int 型で問題ありません。
後は概ねそれで問題ないと思いますよ。
ただ、aは1文字目、bは2文字目って決まってますから、わざわざ文字で判定せずとも、ループで回してあげたら楽になると思います。
ぶっちゃけこんな感じです。
#include <stdio.h>
int main(void)
{
char *str = "abcdefghijklmnopqrstuvwxyz";
int i, n;
scanf("%d", &n);
printf("after: ");
for(i = 0; i < 26; i++){
printf("%c", (i + 1) % n ? str : '@');
}
printf("\nbefore: %s\n", str);
return 0;
}
動作確認はしてません。
スペースの入り方がなんかおかしかったのでちょっと修正しました。 
Re:課題のわからない所の質問
Posted: 2010年7月10日(土) 15:54
by 大学生
発展のサンプルをコンパイルして実行すると
abcdefghijklmnopqrstuvwxyz
bcdefghijklmnopqrstuvwxyz
cdefghijklmnopqrstuvwxyz
defghijklmnopqrstuvwxyz
efghijklmnopqrstuvwxyz
fghijklmnopqrstuvwxyz
ghijklmnopqrstuvwxyz
hijklmnopqrstuvwxyz
ijklmnopqrstuvwxyz
jklmnopqrstuvwxyz
klmnopqrstuvwxyz
lmnopqrstuvwxyz
mnopqrstuvwxyz
nopqrstuvwxyz
opqrstuvwxyz
pqrstuvwxyz
qrstuvwxyz
rstuvwxyz
stuvwxyz
tuvwxyz
uvwxyz
vwxyz
wxyz
xyz
yz
z
この実行結果がよくわからないので解説を頼みます。
Re:課題のわからない所の質問
Posted: 2010年7月10日(土) 17:24
by box
str = "abcdefghijklmnopqrstuvwxyz";(初期状態)
では、ポインター変数strは'a'の位置を指しています。
printfで出力すると、abcdefghijklmnopqrstuvwxyz と出力します。
str++; で、指す位置を1個進めると、'b'の位置を指します。
printfで出力すると、bcdefghijklmnopqrstuvwxyz と出力します。
str++; で、指す位置を1個進めると、'c'の位置を指します。
printfで出力すると、cdefghijklmnopqrstuvwxyz と出力します。
(途中省略)
str++; で、指す位置を1個進めると、'z'の位置を指します。
printfで出力すると、z と出力します。
str++; で、指す位置を1個進めると、'z'の次にある'\0'の位置を指します。
ここで、while文の継続条件を満たさなくなります。
Re:課題のわからない所の質問
Posted: 2010年7月10日(土) 21:21
by 大学生
strは'a'を指定すると\0までの文字が出力され
そしてstrで'b'を指定したときはaを飛ばして\0まで
文字が出力されるのですね。
みなさま、ありがとうございました。