配列をスキップする方法

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
peko

配列をスキップする方法

#1

投稿記事 by peko » 6年前

プログラミング初心者です。
九九の表を表示させる際にscanfで複数入力した値(例えば2と5)の段の計算を飛ばし、残りの数の計算結果だけを表示させるには、
どうすればよろしいのですか?
よろしくお願いします。 

コード:

#include <stdio.h>

int main(void){

	int x,y;
	int skip;


	printf("スキップする数を入力\n");

	setvbuf(stdout,NULL,_IONBF,0);
	scanf("%d",&skip);

	printf("%d\n",skip);

	for(x=1;x<=9;x++){
		for(y=1;y<=9;y++){
		printf("%d\t",x*y);
		}
		printf("\n");
	}
	return 0;
}


box
記事: 2002
登録日時: 13年前

Re: 配列をスキップする方法

#2

投稿記事 by box » 6年前

コード:

#include <stdio.h>

int main(void)
{
    int skip[10] = { 0 };       // skip[n] == 1のとき、その段をスキップする
    int s, i, j;

    do {
        printf("スキップする段を入力してください(0または1~9以外で終了)。\n");
        scanf("%d", &s);
        if (s == 0) break;
        if (1 <= s && s <= 9) skip[s] = 1;
    } while (0 <= s && s <= 9);

    for (i = 1; i <= 9; i++) {
        if (skip[i] == 0) {
            for (j = 1; j <= 9; j++) {
                printf("%2d ", i * j);
            }
            putchar('\n');
        }
    }
    putchar('\n');
    return 0;
}
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

shika

Re: 配列をスキップする方法

#3

投稿記事 by shika » 6年前

コード:

#include <stdio.h>

int main(void)
{
	int x,y;
	int skip1, skip2;

	puts("スキップする数を入力");

	setvbuf(stdout,NULL,_IONBF,0);
	scanf("%d %d",&skip1, &skip2);

	printf("%d %d\n\n",skip1, skip2);

	for (x=1;x<=9;x++)
	{
/**/
		if (x == skip1 || x == skip2)
			continue;
/**/
			
		for (y=1;y<=9;y++)
		{
/*
			if (y == skip1 || y == skip2)
				continue;
*/
			printf("%d\t", x*y);
		}
		printf("\n");
	}

	return 0;
}
こんなものでいかがでしょうか?
参考になれば幸いです。

peko

Re: 配列をスキップする方法

#4

投稿記事 by peko » 6年前

申し訳ないのですが、shikaさんのコードのskip1,skip2 をskipにするとどのようなコードになるでしょうか?

shika

Re: 配列をスキップする方法

#5

投稿記事 by shika » 6年前

コード:

#include <stdio.h>
 
int main(void)
{
    int x,y;
    int skip[2];
 
    puts("スキップする数を入力");
 
    setvbuf(stdout,NULL,_IONBF,0);
    scanf("%d %d",&skip[0], &skip[1]);
 
    printf("%d %d\n\n",skip[0], skip[1]);
 
    for (x=1;x<=9;x++)
    {
/**/
        if (x == skip[0] || x == skip[1])
            continue;
/**/
            
        for (y=1;y<=9;y++)
        {
/*
            if (y == skip[0] || y == skip[1])
                continue;
*/
            printf("%d\t", x*y);
        }
        printf("\n");
    }
 
    return 0;
}
この様なコードに成りますが、配列にしたい理由は分かりませんが、わざわざ配列にする意味があるでしょうか?

peko

Re: 配列をスキップする方法

#6

投稿記事 by peko » 6年前

回答ありがとうございます。
最終的にスキップさせたい数は2個ではなく、複数個スキップさせたいので、配列にしています。

以下のコードは,
n=3と定義して、3つの配列をスキップさせたいのですが、上手くいきません。
どのようにすればよいでしょうか?

コード:

#include <stdio.h>
#define n 3
int main(void)
{
    int x,y,i;
    int skip[n];

    puts("スキップする数を入力");

    setvbuf(stdout,NULL,_IONBF,0);

    for(i=0;i<n;i++){
    	scanf("%d\n",&skip[i]);
    	printf("%d\n",skip[i]);
    }




    for (x=1;x<=9;x++){
        if (x == skip[x]){
            continue;
        }

        for (y=1;y<=9;y++){
            if (y == skip[y]){
                continue;
            }
            printf("%d\t", x*y);
        }
        printf("\n");
    }

    return 0;
}


maru
記事: 150
登録日時: 13年前

Re: 配列をスキップする方法

#7

投稿記事 by maru » 6年前

コード:

// 通常マクロは大文字では?
#define n 3

int main()
{
	int x, y, i;
	int skip[n];

	puts("スキップする数を入力");

	setvbuf(stdout, NULL, _IONBF, 0);

	for (i = 0; i<n; i++) {
// 普段 scanf 系使わないので正しい使い方をよく分かっていないのだが、"%d\n" -> "%d" では?
// VCでは"%d"だけにしないとだめ
		scanf("%d", &skip[i]);
		printf("%d\n", skip[i]);
	}

	for (x = 1; x <= 9; x++) {
// 以下3行削除(コメントアウト)
//		if (x == skip[x]) {
//			continue;
//		}
// 以下10行追加
		int flag = 0;
		for (i = 0; i<n; i++) {
			if (x == skip[i]) {
				flag = 1;
				break;
			}
		}
		if (flag) {
			continue;
		}

		for (y = 1; y <= 9; y++) {
// 以下3行削除(コメントアウト)
//			if (y == skip[y]) {
//				continue;
//			}
			printf("%d\t", x*y);
		}
		printf("\n");
	}
	
	return 0;
}

かずま

Re: 配列をスキップする方法

#8

投稿記事 by かずま » 6年前

No.2 の box さんの回答で十分だと思うんですが。

コード:

#include <stdio.h>
 
int main(void)
{
    int x, y, skip[10] = { 0 };
 
    while (1) {
        puts("1~9: スキップする段, その他: 入力終了");
        if (scanf("%d", &x) != 1 || x < 1 || x > 9) break;
		skip[x] = 1;
    }
    for (x = 1; x <= 9; x++)
        if (!skip[x]) {
            for (y = 1; y <= 9; y++) printf("%3d", x * y);
			putchar('\n');
		}
    return 0;
}
実行例

コード:

1~9: スキップする段, その他: 入力終了
2
1~9: スキップする段, その他: 入力終了
5
1~9: スキップする段, その他: 入力終了
0
  1  2  3  4  5  6  7  8  9
  3  6  9 12 15 18 21 24 27
  4  8 12 16 20 24 28 32 36
  6 12 18 24 30 36 42 48 54
  7 14 21 28 35 42 49 56 63
  8 16 24 32 40 48 56 64 72
  9 18 27 36 45 54 63 72 81

maru
記事: 150
登録日時: 13年前

Re: 配列をスキップする方法

#9

投稿記事 by maru » 6年前

かずま さんが書きました:No.2 の box さんの回答で十分だと思うんですが。
その意見に激しく同意なのですが、自分のコードに固執していたようなので、修正版ということで。

peko

Re: 配列をスキップする方法

#10

投稿記事 by peko » 6年前

わざわざ申し訳ありません。

沢山のご回答ありがとうございました。

返信

“C言語何でも質問掲示板” へ戻る