【最大10000ポイント】当たる!!質問投稿キャンペーン!

#include <stdio.h>

main()
{
int i, n;
for( i = 1, n = 0; n < i; i++ )
   {
if(i%3 == 2 && i%4 == 1 && i<1000 )
{
 printf("%4d,",i);
  if(i%10==0)
       printf("\n");
   n++;
      }
   }

printf("\n");
}


このプログラムは、3で割ると2余り、4で割ると1余る自然数で1000より小さいものを小さい順に表示するもので、 一行に10個ずつ表示して改行したいのですが、どうすればいいでしょうか?
if文が間違っていると思うのですが・・・

A 回答 (3件)

↓こういうことなんじゃないでしょうか?



#include <stdio.h>

void main(void)
{
int i, n;

n = 0;
for( i = 1; i < 1000; i++ ) {
if( i%3 == 2 && i%4 == 1 ) {
printf("%4d,",i);
n++;
if( n%10 == 0 )
printf("\n");
}
}
printf("\n");
}
    • good
    • 6
この回答へのお礼

このプログラムを実行してみたところ
見事に、きちんと表示されました!!
どうもありがとうございます((*´∀`*))

自分のプログラムと見比べてみて勉強しなおします!!

お礼日時:2007/06/20 00:44

if(i%10==0)の文をif(i=10)に変更してくださいこれでうまくいくと思います。

    • good
    • 0
この回答へのお礼

回答していただいてありがとうございました。
さっそく修正してみたのですが、
何も変わりませんでした・゜・(PД`q。)・゜・

問題はif文ではないということなのでしょうか・・・

お礼日時:2007/06/20 00:22

>一行に10個ずつ表示して改行したいのですが


1 から 1000 まで回しているループ i とは別に、表示した個数を保存する変数を作成/管理して下さい。
    • good
    • 0
この回答へのお礼

回答していただいて、どうもありがとうございます。
その方法で一度やってみます!!

お礼日時:2007/06/20 00:45

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q*をユーザーが入力した数字の数だけ表示するプログラムの作り方を教えてください

はじめまして。
現在C言語の勉強している大学生です。

『*』をユーザーが入力した数字の数だけ表示するプログラムの作り方を教えてください。
例えばユーザーが5と入力したら*****とでるもの。

(本に載っている演習なのですが答えがのっていないのです。)
whileかforを使うのだと思うんですが。。
よろしくお願い致します。

Aベストアンサー

これで、OKです。
とても簡単なプログラムです。

#include<stdio.h>
int main(void)
{
int i,num;
printf("何個表示しますか?->");scanf("%d",&num);

for(i=0;i<num;i++)
{
printf("*");
}
printf("\n");

return 0;
}

Q○個ずつ改行

C言語を学び始めた初心者です。

エラトステネスのふるいをつかって素数を2から997まで表示するところまで理解できました。
しかし、すべて並べて表示したり、1ずつ改行して表示したりすることはできるのですが、
たとえば10個ずつ改行したいと思った場合どのように変数を設定しループを組み立てればうまくいくでしょうか?

よろしくお願いします

Aベストアンサー

出力した素数の個数を数える変数を用意します。
素数を1個出力したら、個数を1増やします。
個数が10の倍数になったとき、改行コードを出力します。

Q複数桁10進数の*桁目だけを抽出したい

タイトルがすべてと言えてしまうのですが、
例えば、int宣言された"4287"(この値は変動します)という数値があったとして、1桁目の"7"だけを別の変数へ引き抜きたいのですが、その場合にはANDによるマスク処理による演算で処理可能なのでしょうか?
また、他に良い方法などありましたら教えていただけますでしょうか?

Aベストアンサー

★10進数ですので AND は使えませんね。
・簡単なサンプルを載せますので読み取って下さい。

サンプル1:
int value = 4287;
int a[ 4 ];

a[0] = (value % 10); value /= 10; // 1桁目を取り出す
a[1] = (value % 10); value /= 10; // 2桁目を取り出す
a[2] = (value % 10); value /= 10; // 3桁目を取り出す
a[3] = (value % 10); value /= 10; // 4桁目を取り出す

サンプル2:
int value = 4287;
int a;

a = (value % 10);
value -= a;

value → 4280
a → 7
になります。

Q1~100までの数字を表示し、かつその中から2の倍数を表示する

一つ前の質問で、for文を使って1~100までの数字を表示できるようになったのですが、タイトルのとおり、さらに条件を加えるにはどうしたら良いでしょうか、教えてください。

Aベストアンサー

おはようございます。
i%2の結果をご存知のようですので、
これを使えばよいかと思います。

i%2は2で割ったあまりを出力しますので、
0になれば2の倍数であるといえます。

制御文の中で条件分岐をすれば問題ありません。

if文はご存知でしょうか。
(javaでは「==」である点に注意してください。)

// 1から100まで。
for (int i = 1; i <= 100; i++) {
// 偶数であれば出力します。
if (i % 2 == 0) {
System.out.println(i);
}
}

参考URL:http://www.javaroad.jp/java_control2.htm

Qcharと%c , %s の関係について

char型の変数の扱いで悩んでいます。
具体的には以下の二つのプログラムの差異についてです。

----------------------
char c;

scanf("%c", &c);
printf("%c\n", c);

-----------------------
char c;

scanf("%s", &c);
printf("%s\n", &c);

-----------------------


上のプログラムは正しいと思うのですが、下のプログラムが正しいのかどうか、わかる方に教えていただきたいと思い質問させていただきました。

どちらのプログラムも問題なく動作します。
僕自身は 下のプログラムの printf 関数については間違った使い方なのではないかと思っています。

scanf("%s", &c) は入力された文字のうち、終端文字の手前までの文字を引数のポインタが示すオブジェクトへ順に格納していく関数だと理解しているので、入力された文字が一文字だった場合、&cの示すオブジェクトに文字が代入されると考えたからです。

逆に printf("%s", &c) は、&cの示すオブジェクトから”ヌル文字”の手前までの文字列を順に表示する関数だと理解しているので、問題なく動作しているのは&cで示されるオブジェクトの後ろの領域が偶然'\0'だったからではないかと考えたからです。

何かの本で、未使用の領域は0である確率が高いという記述をみたことがあり、'\0'は0と同じだということなので問題なく動作する率が高いのではないかと思っています。


僕の考え方がどの程度正しくて、正確にはどうなのかを教えて欲しいです。


ちなみに、

-----------------------
char c;
char str[100];

scanf("%s", str);
scanf("%c", &c);
------------------------

と書くと c には改行文字が代入されてしまいます。
scanf("%s", str);
において"aasssdd "と最後に空白を入れると
c には空白文字が代入されます。

しかし、
--------------------------
char str1[100];
char str2[100];

scanf("%s", str1);
scanf("%s", str2);
--------------------------
においては、
scanf("%s", str1);
で "asdfg "と最後に空白を入れても次のstr2が空白で始まることはありません。


この辺りの処理がどのような法則で実行されているのかが分かりづらくて悩んでいます。
おそらく、
scanf("%s", str);
の場合には最初の文字が空白や改行文字でも、その次に有効な文字があればそれらの改行や空白を無視するのではないかと思っています。


分かる方がいましたら回答をよろしくお願いします。

char型の変数の扱いで悩んでいます。
具体的には以下の二つのプログラムの差異についてです。

----------------------
char c;

scanf("%c", &c);
printf("%c\n", c);

-----------------------
char c;

scanf("%s", &c);
printf("%s\n", &c);

-----------------------


上のプログラムは正しいと思うのですが、下のプログラムが正しいのかどうか、わかる方に教えていただきたいと思い質問させていただきました。

どちらのプログラムも問題なく動作します。
僕自身は 下...続きを読む

Aベストアンサー

> char c;
> scanf("%s", &c);
char c では1文字分の領域しか確保されていないので、
1文字以上の文字列を無理矢理格納すると
他のデータが存在しているかもしれない領域を書き換えてしまいます。(メモリ破壊)

なお、'\0'はscanfが(本来書き込んではいけない領域に対してですが)書き込んでいます。


> と書くと c には改行文字が代入されてしまいます。
最初のscanfが改行文字を読み込んでいないからです。
以下のページに書かれている内容と本質的には同じ。
http://www9.plala.or.jp/sgwr-t/c/sec05.html#s5-

> 最初の文字が空白や改行文字でも、その次に有効な文字があればそれらの改行や空白を無視するのではないかと思っています。
そう考えて問題ないと思います。

Q1~100までの数字を表示したい

私は、JAVA歴2日の初心者です。質問集を見て、ようやくコンパイルができるようになり、今は単体の数字や文字ができる程度のレベルです。タイトルのとおり1~100までの複数の文字を表示するにはどうすればよいか教えてください。

Aベストアンサー

単体の数字や文字が出力できるレベルということですので、System.out.print()やSystem.out.println()で出力しているということでしょうか。
100回出力をしてももちろん出力はされますが、制御文を使ったほうが良いかと思います。

制御文のfor文を使用した場合は...
System.out.println(1);
System.out.println(2);
System.out.println(3);



System.out.println(100);

for (int i=1; i<=100; i++){
System.out.println(i);
}

といった感じで記載します。

参考URL:http://www.javaroad.jp/java_control1.htm

Qファイル出力で改行を入れたい!

data.txtにファイル出力を行うのですが、gets(c)で入力した一語一語に改行を入れてdata.txtに出力したいのですがどうすればよいでしょうか。
返答のほどよろしくお願いいたします。
include<stdio.h>
#define SIZE 20
void main(void)
{
char c[SIZE], *p;
FILE *fp;

fp = fopen("data.txt","w+");
p = c;
while(gets(c) != NULL){
fputs(p,fp);
}

fclose(fp);
printf("data.txtへ出力しました\n");

}

Aベストアンサー

一語一語ってのは、1回の入力毎って事でしょうか?
とするならば、これでどうでしょうか?

#include <stdio.h>
#define SIZE 20
void main(void)
{
  char c[SIZE], *p;
  FILE *fp;
  
  fp = fopen("data.txt","w+");
  p = c;
  while(gets(c) != NULL){
    fputs(p,fp);
    fputc('\n', fp);
  }
  
  fclose(fp);
  printf("data.txtへ出力しました\n");
  
}

Q最大値と最小値を表示したいのですが・・・

double numに入っている数字から最大値と最小値を求めたいのですが、このままだと両方とも1.000になってしまうんです・・・
どうやったらちゃんと最大値と最小値が表示されるのでしょうか??
初心者なものでスイマセンが教えてください!!


#include<stdio.h>

int main(void)
{
int i,j;
double num[]={4.5,3.1,7.0,9.2,1.0,5.7,9.3,2.3,0.3,1.0};
double max,min;

for(i=0; i<10; i++)
{
for(j=0; j<10; j++)
{
if(num[i]>num[j])
max=num[i];
}
}

for(i=0; i<10; i++)
{
for(j=0; j<10; j++)
{
if(num[i]<num[j])
min=num[i];
}
}
printf("最大値は%fです。",max);
printf("最小値は%fです。",min);

return 0;
}

double numに入っている数字から最大値と最小値を求めたいのですが、このままだと両方とも1.000になってしまうんです・・・
どうやったらちゃんと最大値と最小値が表示されるのでしょうか??
初心者なものでスイマセンが教えてください!!


#include<stdio.h>

int main(void)
{
int i,j;
double num[]={4.5,3.1,7.0,9.2,1.0,5.7,9.3,2.3,0.3,1.0};
double max,min;

for(i=0; i<10; i++)
{
for(j=0; j<10; j++)
{
if(num[i]>num[j])
max=num[i];
}
}

for(i=0; i<10;...続きを読む

Aベストアンサー

なぜforループが2重になっているのかよくわかりませんが、
考え方として、
・とりあえず配列の最初の値を暫定の最大値としてセットする
・forループで配列を調べていき、配列の値が暫定の最大値より大きな場合、それを暫定の最大値とする。
・forループを抜けると、暫定の最大値は暫定ではなく、その配列の最大値となっている。
という流れが普通のやり方です。

以上を踏まえてコーディングを手直しすると、以下のようになります。

#include<stdio.h>

int main(void)
{
int i;
double num[]={4.5,3.1,7.0,9.2,1.0,5.7,9.3,2.3,0.3,1.0};
double max,min;

max=num[0];
for(i=0; i<10; i++)
{
if(num[i]>max)
max=num[i];
}

min=num[0]
for(i=0; i<10; i++)
{
if(num[i]<min)
min=num[i];
}

printf("最大値は%fです。",max);
printf("最小値は%fです。",min);

return 0;
}

なぜforループが2重になっているのかよくわかりませんが、
考え方として、
・とりあえず配列の最初の値を暫定の最大値としてセットする
・forループで配列を調べていき、配列の値が暫定の最大値より大きな場合、それを暫定の最大値とする。
・forループを抜けると、暫定の最大値は暫定ではなく、その配列の最大値となっている。
という流れが普通のやり方です。

以上を踏まえてコーディングを手直しすると、以下のようになります。

#include<stdio.h>

int main(void)
{
int i;
double num[]={4....続きを読む

Qint型からchar型への変換

タイトル通り、int型からchar型への変換の仕方がわかりません!><
どうしたらいいのでしょうか?

Aベストアンサー

#include <stdio.h>


char buf[5];
int no;

no = 10;
sprintf(buf, "%d", no);

QC言語 While文(ループ)内の文字入力

While文で、1文字入力をやれば思うようにうまくいかない。数字(データ)入力や、文字列入力の場合(%d 及び %s)ならうまくいく。文面で説明するより実際のプログラムを見た方が分かりやすいと思うので、以下にプログラムとその実行結果、実行結果に対する私が意図している結果とを示します。

【プログラム部分】
#include<stdio.h>

int main(void)
{
   char a;

   while(1)
   {
   printf("1文字を入力:");
   scanf("%c",&a);

   if(a == 'x')
     break;

   printf("入力したのは %c です。\n",a);
   }

   return 0;
}

【実行結果(キーボードからは「 e 」と入力」)】
1文字を入力:e
入力したのは e です。
1文字を入力:入力したのは
です。
1文字を入力:

【私が意図している結果】
1文字を入力:e
入力したのは e です。
1文字を入力:


 ちなみにC言語の環境は、インターネットで無料で入手できる試食版です。(LSI C-86 Ver3.30c 試食版)
 上記プログラムを見てもらえればお分かりだと思いますが、「xを入力するまで、永遠と1文字入力とその表示を行う」ことを意図しています。しかし実際の結果は意図に反しています。
 1回目は正常に動作しているようですが、問題は2回目以降。scnafで入力待ちをすることなく、なぜかscanfをスルーする形で3回目のscanf入力待ちとなっています。この理由を教えてください。お願いします。

While文で、1文字入力をやれば思うようにうまくいかない。数字(データ)入力や、文字列入力の場合(%d 及び %s)ならうまくいく。文面で説明するより実際のプログラムを見た方が分かりやすいと思うので、以下にプログラムとその実行結果、実行結果に対する私が意図している結果とを示します。

【プログラム部分】
#include<stdio.h>

int main(void)
{
   char a;

   while(1)
   {
   printf("1文字を入力:");
   scanf("%c",&a);

   if(a == ...続きを読む

Aベストアンサー

>1文字を入力:入力したのは
>です。

は、[Enter]キーの入力によるためです。
[Enter]キーをスルーする必要があります。

   char a;
char dummy; /*[Enter]キー用*/

   while(1)
   {
   printf("1文字を入力:");
   scanf("%c",&a);
scanf("%c",&dummy); /*[Enter]キー用*/

   if(a == 'x')
     break;

   printf("入力したのは %c です。\n",a);
   }


で、どうでしょうか?


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング