プログラミング初心者です。
九九の表を表示させる際にscanfで複数入力した値(例えば2と5)の段の計算を飛ばし、残りの数の計算結果だけを表示させるには、
どうすればよろしいのですか?
よろしくお願いします。
配列をスキップする方法
Re: 配列をスキップする方法
#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;
}
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: 配列をスキップする方法
#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;
}
参考になれば幸いです。
Re: 配列をスキップする方法
#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;
}
Re: 配列をスキップする方法
回答ありがとうございます。
最終的にスキップさせたい数は2個ではなく、複数個スキップさせたいので、配列にしています。
以下のコードは,
n=3と定義して、3つの配列をスキップさせたいのですが、上手くいきません。
どのようにすればよいでしょうか?
最終的にスキップさせたい数は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;
}
Re: 配列をスキップする方法
// 通常マクロは大文字では?
#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: 配列をスキップする方法
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;
}
Re: 配列をスキップする方法
その意見に激しく同意なのですが、自分のコードに固執していたようなので、修正版ということで。かずま さんが書きました:No.2 の box さんの回答で十分だと思うんですが。