人に聞けない痔の悩み、これでスッキリ >>

http://webkaru.net/clang/check-odd-even/
 ですが!仕組みがいまいちわかりません。
えーとaがif5だったら%2に==0を代入した場合・・・
 なのでelseに回される。
 だと思うのですが!?以上の・・・の内容がわかればこのプログラムの意味が
分かると思うのですが、どなたか教えていただけないでしょうか?
 以下プログラムです。
 よろしくお願いいたします
#include <stdio.h>

int main(void)
{
int a;

printf("整数を入力してください = ");
scanf("%d",&a);

if( a % 2 == 0 ){
printf("%d は偶数です\n", a);
} else {
printf("%d は奇数です\n", a);
}

return 0
}

質問者からの補足コメント

  • お付き合いくださいまして誠にありがとうございました。
     えーと
     真面目に参考書で調べましたところ!
    演算子    機能       使用例
    %    割り算の余り    a=B%C;
     とありまた。
    以上の参考書の「使用例」の意味がよくわかりません! 「機能」の
     ”割り算の余り”ならば
      「使用例」の”a=B%C;”を数字の置き換えた場合ご説明をしてくださるお
     方がおられましたらご教授をお願いいたします。
     基本で、躓く場となりかねません!基本がわかっていないとやっぱり行き詰
     りますからね・・・ 誠にご恐縮で申し訳ございませんが新春早々からの
     ”暴言的なご回答”は、お控えくださいませ^^
      お付き合いのほどを何トドよろしくお願い申し上げます

      補足日時:2016/01/13 04:50
  • スーパーレスポンスのご回答誠ありがとうございました。
     せっかくのご回答ですので、あわてずじっくり海馬から大脳に浸透させたいと存じます。
    ご解決までしばらくお待ちくださいませ^^
    PHP等、昨年は大変お世話になりました。本年も昨年同様よろしくお願いいたします。
    本年後期からは、はまだわかりませんが洋上から電波を飛ばしているかもしれません(笑い)

    No.5の回答に寄せられた補足コメントです。 補足日時:2016/01/13 05:08
  • 今朝開いたら、みなさからたくさんのご回答をいただいおりました^^
     ありがとうございます。
    手が空き次第じっくり読んで海馬~大脳へ情報の伝達を試みます。
    しばらくお待ちくださいませ^^

      補足日時:2016/01/14 05:43
  • ありがとうございます。
    ==は代入ではなく、比較です。0と同じかどうか判定しています。
     そうでした。!
     参考書には
    ==は”比較演算子の種類”で”等しい” 
    =が”代入”でしたので あー勘違いでした。
    その角度から紐解いていくと何となく見えてきそうな気がします。
     しばらくお待ちくださいませ。

    No.9の回答に寄せられた補足コメントです。 補足日時:2016/01/15 06:07
  • %意味ですが、ほかの参考書には、
    %の意味でたとえば→a=b%c→bをcで割った余りをaに代入(整数型のみ有効)
    if( a % 2 == 0 ){・・はもしa÷2のあまりは0と等しいのだから
    偶数となり そのほかだったらelseに回され、奇数となり・・・

    間違いないでしょうかね^^

      補足日時:2016/01/15 06:26

このQ&Aに関連する最新のQ&A

A 回答 (9件)

続けて失礼します。



> 「使用例」の”a=B%C;”を数字の置き換えた場合ご説明をしてくださるお
 方がおられましたらご教授をお願いいたします。

a = 5 % 3 の場合
5割る3は、商が1, 余り2です。
従ってaには2が代入されます。
この回答への補足あり
    • good
    • 1
この回答へのお礼

siffon9様、毎回&沢山のご回答をいただき誠にありがとうございました。
助かっております^^
わかりやすご回答でした。
 OKです。

お礼日時:2016/01/16 06:30

if( a % 2 == 0 ){


これは

int amari = a % 2;
if( amari == 0 ){

と同じになります
ある数字と2で割った時、割り切れる時(余りが0)は偶数、
割り切れない時(余りが1)は奇数になりますよね。

この算数を利用して偶数か奇数かを判定しています。

aが5の時は
int amari = 5 % 2; → 5÷2の余りがamari に代入されるのでamari は1
if( amari == 0 ){ のif分には入らず、elseの処理に入ります。

==は代入ではなく、比較です。0と同じかどうか判定しています。
この回答への補足あり
    • good
    • 0

間違い、修正



>Cが 4 の場合、Bがどんな数字でも a には 0~3が入ります
の下の表、間違いだらけなので、いかに修正

a=0 B=0 C=4  0÷4=0 余り 0
a=1 B=1 C=4  1÷4=0 余り 1
a=2 B=2 C=4  2÷4=0 余り 2
a=3 B=3 C=4  3÷4=0 余り 3
a=0 B=4 C=4  4÷4=1 余り 1
a=1 B=5 C=4  5÷4=1 余り 2
    • good
    • 1

割り算のあまり、というよりも


割り算のあまりの特性を利用していると考えて下さい

C が 3 の場合、Bがどんな数字でも a には 0~2が入ります
a=0 B=0 C=3  0÷3=0 余り 0
a=1 B=1 C=3  1÷3=0 余り 1
a=2 B=2 C=3  2÷3=0 余り 2
a=0 B=3 C=3  3÷3=1 余り 0
a=1 B=4 C=3  4÷3=1 余り 1
a=2 B=5 C=3  5÷3=1 余り 2
: (Bを1づつ増やしていくと a 延々と 0,1,2 を吐きます)

Cが 4 の場合、Bがどんな数字でも a には 0~3が入ります
a=0 B=0 C=3  0÷4=0 余り 0
a=1 B=1 C=3  1÷4=0 余り 1
a=2 B=2 C=3  2÷4=0 余り 2
a=3 B=3 C=3  3÷4=0 余り 3
a=1 B=4 C=3  4÷4=1 余り 1
a=2 B=5 C=3  5÷4=1 余り 2
: (Bを1づつ増やしていくと a 延々と 0,1,2,3 を吐きます)

Cが 5 の場合、Bがどんな数字でも a には 0~5の値が入ります
Cが 6 の場合、Bがどんな数字でも a には 0~7の値が入ります
Cが n の場合、Bがどんな数字でも a には 0~(n-1)の値が入ります
    • good
    • 0

算数・数学では、左から右に流れます。


B % C = a
5 % 2 = 1
※計算結果が、「=」の左側から右側に流れる。

プログラムの場合、右から左へ流れます。
a = B % C
1 = 5 % 2
※計算結果が、「=」の右側から左側へ流れる。

( a % 2 == 0 )について。
まず、算数・数学では、「代入」と「比較」の区別がありません。
例えば、「1 = 0」は正しくありません。これは、「比較」です。
5 % 2 = 1
の計算例でも、5を2で割った余りは1なので、「1 = 1」となり「比較」して正しいと判断します。
しかし、プログラムでは計算結果を「代入」すると言う考え方があります。
1 = 5 % 2
と説明しましたが、これは間違いで正しくは「a = 5 % 2」となります。
5を2で割った余りを「a」に入れる(代入する)です。
結果、「a = 1」となります。

このように、プログラムでは「代入」と「比較」では意味が異なる事から、
「=」は代入、「==」は比較としています。
aが5とした場合、
( 5 % 2 == 0 )
となり、
( 1 == 0 )
で、「==」は比較なので、等しくないとなります。

if( a % 2 == 0 ){
 printf("%d は偶数です\n", a);
} else {
 printf("%d は奇数です\n", a);
}

このプログラムでは、
( a % 2 == 0 )が等しい場合、
 printf("%d は偶数です\n", a);
が実行され、
( a % 2 == 0 )が等しくない場合、
 printf("%d は奇数です\n", a);
が実行されます。

つまり、ある数値を2で割った余りが0(割り切れたら)偶数。
余りが1(割り切れなかったら)奇数。
と表示しているわけです。
    • good
    • 0

> ( a % 2 == 0 )



A % Bは、Aを2で割った余りを求めます。
X == Yは、XとYが等しいなら真、等しくないなら偽を求めます。

「%」と「==」は演算子(計算するときに使用する記号)といいます。演算子には演算(計算)する優先順位があります。
例えば1+2×3の場合は、2×3を先に計算しますよね。これは「+」より「×」の方が優先順位が高いからです。

↓は、C言語で使用する演算子です。
http://www.bohyoh.com/CandCPP/C/operator.html

「%」と「==」の優先順位をみて下さい。「%」が4で、「==」が8になっています。
つまり「%」の方が優先順位が高いので先に計算する必要があります。

元の( a % 2 == 0 )で考えると、a%2を先に計算する必要があります。括弧を付けてわかり易くすると
( (a % 2) == 0 )となります。

つまり
「aを2で割った余り」が0と等しければ真で、0と等しくなければ偽になるということになります。
    • good
    • 0

C言語の"=="は比較演算子です。

代入文ではありません。
この場合、
"a % 2"は a を 2 で割ったあまりを求めています。
よって、a を 2 で割ったあまりが 0 であるか比較し、0の場合(偶数の場合)はその if文に掛かる文が実行され、そうでなければ(奇数の場合) else文に掛かる文が実行されます。
    • good
    • 0
この回答へのお礼

ご回答くださいまして誠にありがとうございました。
 わかりやすいご回答でした^^
 現在PHPとC言語を併用しながら
プログラミングを学習中でございます
こんごともよろしくお願いいたします。

お礼日時:2016/01/16 06:23

> えーとaがif5だったら%2に==0を代入した場合・・・



えーと基本中の基本を全く理解できていません。

> if( a % 2 == 0 ){

これはaを2で割った余りが0か判定しているだけです。
    • good
    • 0

質問の文章が何言ってるかわかりませんが、余りがゼロなら偶数、そうでないなら奇数と判定しているだけです。

    • good
    • 0

このQ&Aに関連する人気のQ&A

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

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

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

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

QC#にて別クラスの関数を使いたい

C#にて、別クラスの関数を使用する方法を教えてほしいです。

下記のような、構造体を受け取るメソッドを作りました。

*****************************
private struct MyPoint
{
public int x;
public int y;
}

private void proc1(MyPoint pt)
{
MessageBox.Show("座標:" ; pt.x + "," + pt.y + "実行結果");
}

private void button1_Click(object sender ,System.EventArgs e)
{

MyPoint pt;
pt.x = 10;
pt.y = 20;
proc(pt);
}
*****************************

別のフォームのクラスから、proc1を呼び出したいのですが、やり方がわかりません。
どうか、教えてください。

Aベストアンサー

同じ定義をしたとしても別の名前空間に書いた構造体は同一とはみなされません。

呼び出し先クラスでの構造体を private では無く、public で宣言して下さい。

呼び出し元では、

MyClass.MyPoint pt;

のようにして実体を作ります。

Qif文を使わずに奇数・偶数を判断

はじめまして。C言語解説サイトを巡ってみたのですが、if文無しの奇数偶数判断にまで辿りつかず頭を抱えています。
任意の数字を(指定回数分)打ち込み、奇数だった場合のみ加算し合計を表示するというプログラムを作成したいのですが色々と規制がかかっており、if文・switch文は使用不可/ループも1回のみとなっています。
if文を使えれば x%2 == 1 で奇数と判断できるのですが・・・。

■ if文を使わず奇数・偶数かを判断→加算 の流れ

を是非教えて頂きたいです。お時間ありましたらご教授よろしくお願い致します。

Aベストアンサー

打ち込んだ数値が整数だったらの話ですが。

・偶数の場合2で割った余りは0 奇数の場合2で割った余りは1

・(上で余りとして出た)0を掛けた答えは0
・(上で余りとして出た)1を掛けた答えは奇数だった数値そのもの

というのを利用するとif文無しで奇数のみを加算できそうですね。

Q文字列の後ろから必要分だけ削除したい。

例1 Dim str As String = "あいうえお1234"

文字列の中の1234だけ削除したい場合は、
str = str.Remove(5,4)
という風に、5文字目の後から4文字削除にすればよいのですが、

例の"あいうえお"の部分の長さが毎回処理する度に異なる場合は、
文字列の頭から何文字目という指定ができないので、”後ろから4文字を削除したい”となります。その場合は、どのようなプロパティを使えばいいのでしょうか。

.NET環境です。

Aベストアンサー

Length(str)で文字数を取得できますので、後ろから4文字目は先頭から何文字目かは計算できると思いますが、どうでしょうか?

QC#「オブジェクト参照が必要です」(初心者)

Visual C# 2008を学習中なんですが、とりあえず何か作ってみようと思って、パラパラマンガに挑戦してみました。
Form1にpictureBox1を作り、waitを入れてイメージを書き換えるという単純なものです。
ところが実行しようと思ったら、「静的でないフィールド、メソッド、またはプロパティ’WindowsFormApplication1.Form1.pictureBox1’でオブジェクト参照が必要です」というエラーが出ます。その際のフォーカスは、main()内の
Form1.pictureBox1.image = Image.FromFile("motion1.png");
”Form1.pictureBox1”に当てられています。

何が原因と考えられるでしょうか。
もし情報不足であればご指摘いただくか、あるいはこの目的においてやらなければいけないこと、を大雑把に教えていただくだけでも幸いです。
よろしくお願いします。

Aベストアンサー

main()内に記述されているとのことですので、たぶん、
Form1.pictureBox1.Image=Image.FromFile("motion1.png");
Application.Run(new Form1());
と書いているのではないでしょうか?

連載 改訂版 C#入門 第3章 クラスとインスタンス
http://www.atmarkit.co.jp/fdotnet/csharp_abc2/csabc2_003/cs2_003_01.html#cs0302

ここであるように、オブジェクト指向にはクラスとインスタンスという概念があります。
今のコードでは、Form1クラスを操作しようとしているのでそのようなエラーが出ます。

具体的な解決方法としては、PictureBoxに初期画像を設定する処理をForm1のコンストラクタでやるのがいいと思います。
その際、redfox63さんがおっしゃられるように
this.pictureBox1
と記述することが必要です。(thisは自分自身のインスタンスを指します)

後は、Windowsフォームで一定間隔での処理をするための「Timerコンポーネント」について調べてみたらいいと思います。

タイマにより一定時間間隔で処理を行うには?(Windowsタイマ編)
http://www.atmarkit.co.jp/fdotnet/dotnettips/372formstimer/formstimer.html

MSDNライブラリ Timerクラス
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.timer.aspx

参考URL:http://www.atmarkit.co.jp/fdotnet/csharp_abc2/index/

main()内に記述されているとのことですので、たぶん、
Form1.pictureBox1.Image=Image.FromFile("motion1.png");
Application.Run(new Form1());
と書いているのではないでしょうか?

連載 改訂版 C#入門 第3章 クラスとインスタンス
http://www.atmarkit.co.jp/fdotnet/csharp_abc2/csabc2_003/cs2_003_01.html#cs0302

ここであるように、オブジェクト指向にはクラスとインスタンスという概念があります。
今のコードでは、Form1クラスを操作しようとしているのでそのようなエラーが出ます。

具...続きを読む

QTextBoxに半角数字のみの入力しかできないようにしたい

タイトルどおりです。
フォームに貼り付けた、TextBoxに、半角数字のみしか入力できないようにしたいです。
000000~999999までのコード(数字)を入力させるようにするわけですが、そのままだと半角英数も全角も入力できてしまいます。

GrapeCity社製のカスタムコントロール「InputMan」の“Number”を用いると簡単なのですが、これだとカーソルがボックス内の右端にきて、一の位から入力が始まってしまいます。
数字は、ボックス内の左側から入力されていくようにしたいのですが、“Number”だとなんか出来なさそう・・・?
(“Number”で左側から入力できるならそれがいいのですが)

そこで、TextBoxを使うことにしたのですが、TextBoxだと、半角数字のみしか入力できないような制限がかけるのかが、わかりません。

もし、お分かりの方がいらっしゃいましたら、ご教授下さいませ。

Aベストアンサー

コピペですみません。
VB6だと、

Private Sub TextBox_KeyPress(KeyAscii As Integer)
Select Case KeyAscii
Case vbKeyBack, Asc("0") To Asc("9"), Asc("-"), Asc(".")
Case &H1 ' Ctrl + A
TextBox.SelStart = 0
TextBox.SelLength = Len(TextBox.Text)
Case &H3 ' Ctrl + C
Case &H16 ' Ctrl + V
Case &H18 ' Ctrl + X
Case &H1A ' Ctrl + Z
Case Else
KeyAscii = 0
End Select
End Sub

で、いかがでしょうか。

コピペですみません。
VB6だと、

Private Sub TextBox_KeyPress(KeyAscii As Integer)
Select Case KeyAscii
Case vbKeyBack, Asc("0") To Asc("9"), Asc("-"), Asc(".")
Case &H1 ' Ctrl + A
TextBox.SelStart = 0
TextBox.SelLength = Len(TextBox.Text)
Case &H3 ' Ctrl + C
Case &H16 ...続きを読む

QC言語 偶数判定

下記は、「1から5までの整数で偶数の和を表示する」というプログラムなのですが、
偶数判定に用いている if ( ! ( i % 2 ) ) の意味が分からないので、どなたか教えていただけないでしょうか?
( i % 2 = = 0 で条件判定をするのなら理解できるのですが…)

#include <stdio.h>
int main(){
int i=1,total=0;
while (1){
if(i>5)break;
if ( ! ( i % 2 ) ) total+=i;
i++;
}
printf("%d",total);
return0;
}

Aベストアンサー

こんにちは

”i % 2”はiを2で割った余りを示すので、
偶数だと0、奇数だと1になります。

そこで、
iを2で割った余りが0ならば、を言い換えて
iを2で割った余りが1でないならば、という条件式になっています。
それがif ( ! ( i % 2 ) ) です。
※if文内は1がTrueになりますので。

ちなみに、仰る通り、i % 2 == 0で条件判定しても同じです。

以上です。

QC# シリアル通信でデータ受信時の欠損について

Visualstudio 2013 を使用して C# で開発を行っています。

SerialPort Classを使用してデータの送受信をするプログラムを作成しているのですが、
非同期でデータを受信する際にどうしてもうまくデータを取得出来ません。

5Byteのデータは正常に取得できるのですが、
その直後にくる40Byteのデータは、真ん中あたりの10数Byteや最後の10数Byteしか取れません。


serialPort.DataReceived に登録したイベント関数の中身です。

--------------------------------------------------------------------------------------
private void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
bytesRead = 0;
// Initialize a buffer to hold the received data
byte[] buffer = new byte[this.serialPort.ReadBufferSize];

try
{
bytesRead = this.serialPort.Read(buffer, 0, buffer.Length);
if (true == serialPort.IsOpen)
{
serialPort.DiscardInBuffer();//受信バッファをクリアする
}

}
catch (Exception ex)
{
DataLog.Exception(ex);
}

//派生クラス用の処理
DeviceClassEventArgs _DeviceClassEventArgs = new DeviceClassEventArgs(buffer, bytesRead);
DeviceClassEvent(this, _DeviceClassEventArgs);
}
--------------------------------------------------------------------------------------

ネットの情報を参考に、
ReceivedBytesThreshold の値を期待するデータ量に逐一変えることで
とりあえず正常に取ることが出来たのですが、これでいいのでしょうか?
期待するデータ量がわからなかった場合は使えないのかなとも思います。

データが欠損してしまう理由、
上記の対処法以外の一般的な対処法など有りましたら教えて下さい。

その他参考になるページ等ありましたら教えていただけると大変助かります。

Visualstudio 2013 を使用して C# で開発を行っています。

SerialPort Classを使用してデータの送受信をするプログラムを作成しているのですが、
非同期でデータを受信する際にどうしてもうまくデータを取得出来ません。

5Byteのデータは正常に取得できるのですが、
その直後にくる40Byteのデータは、真ん中あたりの10数Byteや最後の10数Byteしか取れません。


serialPort.DataReceived に登録したイベント関数の中身です。

-------------------------------------------------------------------------------...続きを読む

Aベストアンサー

DataReceivedイベントが発生したときでも、
シリアルポートへの受信はまだ継続している可能性があるので
不用意にバッファクリアしてはいけない。
非同期の受信処理は、何かと難しいのです。

private void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
  bytesRead = 0;
  // Initialize a buffer to hold the received data
  byte[] buffer = new byte[this.serialPort.ReadBufferSize];

  try
  {
    //bytesRead = this.serialPort.Read(buffer, 0, buffer.Length);
    //if (true == serialPort.IsOpen)
    //{
    // serialPort.DiscardInBuffer();//受信バッファをクリアする
    //}

    // 受信バッファにデータがなくなるまで繰り返し読込む
    while (true)
    {
      if (0 == serialPort.BytesToRead)
      {
        break;
      }
      buffer[bytesRead] = (byte)serialPort.ReadByte();
      bytesRead++;
      System.Threading.Thread.Sleep(0);

      // シリアルポートの受信バッファには、
      // ・必要なブロックの途中から受信している。
      // ・次のブロックの先頭部分も受信されている。
      // 可能性があるので、ここで必要なブロックだけRead()できたことを確認する。
      if (必要なブロックが正常に読めたか確認する関数())
      {
        break;
      }
    }
  }
  catch (Exception ex)
  {
    DataLog.Exception(ex);
  }

  //派生クラス用の処理
  DeviceClassEventArgs _DeviceClassEventArgs = new DeviceClassEventArgs(buffer, bytesRead);
  DeviceClassEvent(this, _DeviceClassEventArgs);
}

DataReceivedイベントが発生したときでも、
シリアルポートへの受信はまだ継続している可能性があるので
不用意にバッファクリアしてはいけない。
非同期の受信処理は、何かと難しいのです。

private void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
  bytesRead = 0;
  // Initialize a buffer to hold the received data
  byte[] buffer = new byte[this.serialPort.ReadBufferSize];

  try
  {
    //bytesRead = this.serialPort.Read(buffer, 0, buffer.Le...続きを読む

Q戻り値の意味がわかりません…

戻り値とはどういう値なのか簡単な例文で教えて頂けますか?

Aベストアンサー

バカくさいかもしれませんが簡単な例えをだしてみます。
2人の子供がいて、名前をそれぞれ太郎・花子にしましょう。この2人の子にある役割を決めます。
・花子は飴をもらうと、それをチョコにする役割。(できるかは別として)
・太郎は花子を呼んで飴をあげる役割。

さてこの例では太郎の飴が引数(ひきすう)になり
花子のチョコが戻り値になります。

このイメージを元に次の文を読んでみてください。

「プログラム中の関数やサブルーチンが処理を終了し
呼び出し元に処理の結果として返す値。」

これが戻り値の正しい定義です。
そのほかにはNo1さんのような役割指すときも、それを「戻り値」と呼んだりします。

QPHPで偶数と奇数を判断するには

宜しくお願いします。
一覧表示等をする時に見やすいように一行ずつテーブルの色を変えたりすると思うのですが、これをPHPのfor文で自動的に交互に色を変えるようなプログラムを作ろうと思っております。for文で繰り返し処理場合、例えば、

for($n = 0; $n < 100; $n++)
{
 if($n = 偶数)
 {
 $bgcolor = "#ff0000";
 }
 elseif($n = 奇数)
 {
 $bgcolor = "#0000ff";
 }
}

といった形で交互に色を変るには、偶数/奇数の判断が出来ないと無理だと思うのですが、何か良い方法は無いでしょうか?

Aベストアンサー

if($n % 2 == 0) {
 偶数の処理;
} else {
 奇数の処理;
}

%は、割り算をした、余りです。
例)
3を2で割った余りは1
4を2で割った余りは0 

ANDで求める方法もあります。

またこの場合は、一度偶数で判定すれば、奇数の判定は不要です。

Qフルパスから最後のディレクトリ名を取得したい。

vb.netなのですが、例えば
c:\aaa\bbb\ccc\ddd\eee\fff.exe
というフルパスがあったとして、
eeeというディレクトリ名を取得したいのですが、
何か良い方法はないでしょうか。
それぞれのディレクトリ名の文字数や階層数は
決まっていないのですが、オススメの方法が
ありましたら、教えて頂けると助かります。

Aベストアンサー

MessageBox.Show(IO.Path.GetFileName(IO.Path.GetDirectoryName(myPath)))

IO.Path の GetDirectoryName でフォルダのフルパスを取得して、さらに IO.Path の GetFileName で最終フォルダ(またはファイル)の名前を取得。


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

人気Q&Aランキング