出産前後の痔にはご注意!

(1)(2)(3)(4)(5)(6)・・・・
と数字があり これを100回繰り返すとします。

さらにそれらを、1と2、3と4というように
ペアを作って行きます。
[(1)(2)] [(3)(4)]・・・・

さらにその各数字から返り値が受けれるとして
ペアのどちらかがFALSEの場合は排除します。

[(1)TRUE(2)TRUE)] 
[(3)FALSE(4)TRUE]
[(5)TRUE(6)TRUE]



[(1)TRUE(2)TRUE)] 
[(5)TRUE(6)TRUE)] 

これをC言語系のプログラム的に書くとしたら
どうなるでしょうか。

A 回答 (4件)

タイトルが2の倍数となっていたので、100個の数値(50ペア)の双方が偶数のケースを拾い出す形で記述してみました。



取りあえず 数値を入力してTRUE, FALSEを返す関数 funcA() は、2の倍数ならTRUEという形にしてあります。

参考にしてみてください。


#include <stdio.h>
typedef enum _boolean { FALSE, TRUE } boolean;

#defineRW50
#defineCL2

booleanfuncA( int a ) {
if ( (a % 2) == 0 )
return( TRUE);
else
return( FALSE );
}

void main( void ) {
inti,j,n;
intnm;
intdata[RW][CL];
intresult[RW][CL];

for ( i = 0; i < RW ; i++ ) {
for( j = 0; j < CL ; j++ ) {
printf( "input data[%#d][%d] =?", i,j );
scanf( "%d", &data[i][j]);
}
}

n = 0;
for ( i = 0; i < RW; i++ ) {
if ( funcA( data[i][0] ) && funcA( data[i][1] ) ) {
result[ n ][0] = data[ i ][0];
result[ n ][1] = data[ i ][1];
n++;
}
}
printf( "Number = %d\n",n );

for ( i=0; i < n ; i++ ) {
printf( "result[ %#d ] = %d,%d\n", i,result[i][0],result[i][1] );
}

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

回答有難うございます!
とても参考になります。

お礼日時:2014/10/07 11:29

訂正


else { 1,2 を採用} → else { 1,2 を不採用}
以下、同様に。
    • good
    • 0

if( (f(1) == TRUE) && (f(2)==TRUE)){ 1,2 を採用} else { 1,2 を採用}


if( (f(3) == TRUE) && (f(4)==TRUE)){ 3,4 を採用} else { 3,4 を採用}
if( (f(5) == TRUE) && (f(6)==TRUE)){ 5,6 を採用} else { 5,6 を採用}
if( (f(7) == TRUE) && (f(8)==TRUE)){ 7,8 を採用} else { 7,8 を採用}
if( (f(9) == TRUE) && (f(10)==TRUE)){ 9,10 を採用} else { 9,10 を採用}
...略...
if( (f(99) == TRUE) && (f(100)==TRUE)){ 99,100 を採用} else { 99,100 を採用}

データの保存方法、使用言語(C言語系、と言われても...)、使用ライブラリ と言ったものが不明では、
この程度までしか具体的には書けません。
    • good
    • 0
この回答へのお礼

回答有難うございます。
for文を使わないのもありですね。

お礼日時:2014/10/07 11:30

C言語"系"ってなんですか?


C++ならどってことなく書けますが。
    • good
    • 0
この回答へのお礼

回答有難うございます。
記述構文がC言語系のという意味です。

お礼日時:2014/10/06 14:00

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

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

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

Q4の倍数を論理演算で表す。。

/*Prog32.cキーボードから整数型変数aへデータを入力し、aの値が4の倍数のときは“4の倍数です”と表示し、そうでないときは、“4の倍数ではありません”と表示する。ただし、整数データのビット数はわからないものとし、計算にはビットごとの論理演算のみを用いる。*/

#include <stdio.h>
int main(void)

{

int a;
printf("整数を入力して下さい! "); scanf("%d", &a);
(a % 4 ) ? printf("4の倍数ではありません。\n", a)
:printf("4の倍数です。\n", a);

return(0);

}

4の倍数を論理演算で表す方法がわかりません。。
自分では上記のように算術を使うやりかたしかわかりませんでした。
よろしくお願いします!

Aベストアンサー

#include <stdio.h>
int main(void)
{

int a;
printf("整数を入力して下さい! ");
scanf("%d", &a);
if(a%4==0){
printf("%dは4の倍数です。\n", a);
}
else{
printf("%dは4の倍数ではないです。\n", a);
}
return(0);
}
のまちがいか。

Q3のつく数字と3の倍数のみを表示するプログラム

C言語で3のつく数字と3の倍数のみ(1~150)を表示するプログラムを作りたいのですがどうすればいいのでしょうか?

Aベストアンサー

数字で全部処理するとしたら、ある数x(1~150)について

・xが3で割り切れるかどうか?(x%3が0かどうか)
・xの下1桁目が3であるかどうか?(x%10が3かどうか)
・xの下2桁目が3であるかどうか?(x%100/10が3かどうか)

以上のことをif文等で場合分けすればいいかなと思います。
(汎用性を考えるなら、No.2さんの考え方の方が良いです)

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

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

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

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

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

.NET環境です。

Aベストアンサー

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

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;
}

QC言語 最大値と最小値を求めて表示するプログラム

はじめまして。

C言語を学習中です。

下記の問題演習の解答として記載されているプログラムがどうしても理解できません。

特にプログラムの最後の方のwhile文で最大値と最小値の判定をしているのかと思いますが、どのような計算をして判定しているのでしょうか。

while (array[i] != -1) {
if (array[i] > *max) *max = array[i];
if (array[i] < *min) *min = array[i];
i++;

具体的に教えてください。

よろしくお願い致します。


●問題
0~100の範囲で入力された複数の数値の中から、
最大値と最小値を求めて表示するプログラムを作成せよ。
-1が入力された場合は入力の終わりと判定する。
ただし、最大値と最小値はmain関数以外の一つの関数の中で求める。
また、入力された数値を記憶する配列の要素数は10とし、
それ以上入力された場合はエラーが起きても仕方ないこととする。
ヒント:配列の中に -1 があればデータの終わりだと判断できる。
ヒント:最小値を探すには、最大値を記憶した変数との比較を繰り返せば良い。


●解答
#include <stdio.h>

void maxmin(int array[],int *max,int *min);

int main(void)
{
int i = 0,array[10],max,min;

do {
printf("%d 番目の数:",i + 1);
scanf("%d",&array[i]);
i++;
} while (array[i - 1] != -1);

maxmin(array,&max,&min);

printf("最大値 %d : 最小値 %d\n",max,min);

return 0;
}

void maxmin(int array[],int *max,int *min)
{
int i = 0;

*max = 0;
*min = 100;

while (array[i] != -1) {
if (array[i] > *max) *max = array[i];
if (array[i] < *min) *min = array[i];
i++;
}
}

はじめまして。

C言語を学習中です。

下記の問題演習の解答として記載されているプログラムがどうしても理解できません。

特にプログラムの最後の方のwhile文で最大値と最小値の判定をしているのかと思いますが、どのような計算をして判定しているのでしょうか。

while (array[i] != -1) {
if (array[i] > *max) *max = array[i];
if (array[i] < *min) *min = array[i];
i++;

具体的に教えてください。

よろしくお願い致します。


●問題
0~100の範囲で入力された複数の数値の中から、
最大値と最小値を求...続きを読む

Aベストアンサー

>while (array[i] != -1) {
>if (array[i] > *max) *max = array[i];
>if (array[i] < *min) *min = array[i];
>i++;

手でコードを追いかけていくのが上達への近道だとは思いますが…。

今回は、データの範囲が0~100と決まっていますので、
まずは、仮の最大値として下限の0を、仮の最小値として上限の100を、
それぞれセットしています。
そして、配列の中身を、その時点での最大値や最小値と比べて、
データの方がその時点での最大値よりも大きければ最大値の値を更新し、
データの方がその時点での最小値よりも小さければ最小値の値を更新する、
というアルゴリズムです。

ループを脱出した(つまり、すべてのデータをチェックし終わった)段階で
変数maxやminに入っている値が、(仮ではない)真の最大値や最小値となります。

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

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

Aベストアンサー

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

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

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

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

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

Q二つの整数値の大小比較

二つの整数を読みこんでif文でつくるんですが、どうにもできません。
↓のような感じで入出力すればいいそうです。
二つの整数を入力してください
整数A :83
整数B :45
大きい方の値は83です。
小さい方の値は45です。

そして同じ数字の場合は↓
二つの整数を入力してください
整数A :17
整数B :17
両方とも17です。

どなたか参考となるプログラムを教えてください!!

Aベストアンサー

★アドバイス
>if→elseif→elseの順で使ってみましたがエラー出ます。
 ↑
 エラーが出て当然です。
 C言語には『elseif』というキーワードはありません。
 VBS などと混同していませんか?
 正しくは『else if』となります。つまり『else』『空白』『if』です。
・それから if、else if、else にブロックが必要です。
 こちらも VBS とは違いますので複文を記述する場合はカッコが必要です。
・あと printf() 文で変数に『&』演算子をつけていますが必要ありません。
 『&』演算子を付けるとポインタの値を表示する意味になります。
 この3点を踏まえて回答者 No.1 さんの補足を書き換えると下のようになります。

修正版:
#include <stdio.h>

int main( void )
{
 int a, b;
 
 printf( "整数A :" );
 scanf( "%d", &a );
 printf( "整数B :" );
 scanf( "%d", &b );
 
 if ( a > b ){
  printf( "大きい値%dです\n" , a );
  printf( "小さい値%dです\n" , b );
 }
 else if( a < b ){
  printf( "大きい値%dです\n" , b );
  printf( "小さい値%dです\n" , a );
 }
 else{
  printf( "両方とも%dです\n" , a );
 }
 return 0;
}

その他:
・上記の修正版は回答者 No.2 さんの提示しているソースそのものです。
 確認箇所は
 (1)『elseif』→『else』『空白』『if』とすること
 (2)if、else if、else に括弧をつけること
 (3)printf文の引数『a』『b』に『&』はつけないこと
 の3点を修正すれば正しくコンパイルできます。
・以上。VBS などとは違うので注意して下さい。

★アドバイス
>if→elseif→elseの順で使ってみましたがエラー出ます。
 ↑
 エラーが出て当然です。
 C言語には『elseif』というキーワードはありません。
 VBS などと混同していませんか?
 正しくは『else if』となります。つまり『else』『空白』『if』です。
・それから if、else if、else にブロックが必要です。
 こちらも VBS とは違いますので複文を記述する場合はカッコが必要です。
・あと printf() 文で変数に『&』演算子をつけていますが必要ありません。
 『&』演算子を付けるとポイ...続きを読む

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");
  
}

QDoEvents関数って何?

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そこで「EXCEL VBA パーフェクトマスター」という本を見たら

for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
DoEvents
next i
unload userform1
と入力すれば解決することがわかりました。

しかし「DoEvents」についてあまり詳しく書いていなかったのでDoEvents関数をヘルプで見ると、
「発生したイベントがオペレーティング システムによって処理されるように、プログラムで占有していた制御をオペレーティング システムに渡すフロー制御関数です。」

と書いてあるのですが正直、書いてあることがよくわかりません。

どなたかDoEvents関数について、
もう少しわかりやすく教えていただけませんか。
それから、最初に書いたコードで実行すると
ユーザーフォームの背景が真っ白になってしまう原因も
教えていただけませんか?

よろしくお願いいたします。

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そ...続きを読む

Aベストアンサー

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
    DoEvents
    Cells(i,1) = ""
  Next i
End Sub

Private Sub CommandButton2_Click()
  MsgBox "hoge"
End Sub

っていうフォームのコードがあった場合、
DoEvents を入れることによって、ループ中にユーザーがCommandButton2 を押すことによって CommandButton2 のクリック イベントも動いちゃいます。
CommandButton1 のクリック イベントではループの前に
CommandButton1.Enabled = False
CommandButton2.Enabled = False
を書いてフォーム上の CommandButton を無効にしておき、ループが終わったら
CommandButton1.Enabled = True
CommandButton2.Enabled = True
と書いて CommandButton を有効に戻してください。

これを工夫すれば、CommandButton2 で CommandButton1 のループを途中キャンセルする処理もすることができます。

Private Canceled As Boolean

Private Sub CommandButton1_Click()

  CommandButton2.Enabled = False

  Dim i As Long
  For i = 1 To 50000
    DoEvents

    If Canceled = True Then
      MsgBox "キャンセルしました"
      Exit Sub
    End If

    Cells(i, 1).Value = ""
  Next i
End Sub

Private CommandButton2_Click()
  Canceled = True
End Sub



コードの行頭にあるスペースは見易さのために全角スペースで作成していますので、これをこのままコピペするとエラーになるかもしれません。
コピペするなら行頭の全角スペースを半角スペースに直してください。

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
...続きを読む


人気Q&Aランキング