C言語関係掲示板

過去ログ

No.597.3件の数字で、数字以外、10桁以上、同じ数字はエラー

[戻る] [ホームページ]
No.5717

3件の数字の入力規定をつくります。
投稿者---ビギナー(2003/04/07 20:42:32)


数字を3件入力するのにあたって、条件をクリアしたものだけを表示できるプログラムを完成させたいのです。

一、数字以外はエラーにする
ニ、10桁以上はエラーにする
三、同じ数字はエラーにする

関数を使って、「一」の途中まで作成しました。
英字のみ、英字+数字はエラー表示されますが、
数字+英字だと通ってしまいます。
これもエラー表示するにはどこを手直しすれば良いでしょうか?

ポインタ、構造体は未だ学習していないので、出来ればこれ以外でお願いします。

また配列の[21]は、最終的に21件の数字の入力をしたいからです。
よろしくお願いします。

#include <stdio.h>

int check_a(char str[21][256], int j)
{
      int i=0;
      while(str[j][i]!='\0'){
           if('0'<=str[j][i] && str[j][i]<='9'){
               i++;
               return(1);
           }
           else{
               puts("Input ERROR!!");
               return(0);
           }
       }
       return(1);
}

int main( void )
{
       charno[21][256];
       int i;
       int suuji;

       for(i=0; i<3; i++){
             printf("Input DATA?");
             scanf("%s",no[i]);
      
           if(check_a(no,i)==1)
                suuji=(int)no[i];
           else
                i--;
       }
       for(i=0; i<3; i++){
            printf("%d :%d \n",i+1,no[i]);
       }
       return(0);
}


No.5722

Re:3件の数字の入力規定をつくります。
投稿者---麗(2003/04/08 13:02:43)


>ポインタ、構造体は未だ学習していないので、出来ればこれ以外でお願いします。

…という指示がとても厳しいのですが書いてみました。
ツッコミどころ満載(!)ですのでご指摘もお願いします。

#include <stdio.h>
#include <string.h>

// ビット操作を行う。要素数は
// 1000000000 / 8(bit) == 125000000
static char save_num[125000000];

int
check_duplicate(int input)
{
  int q = input / 8;
  int r = input % 8;

  if (save_num[q] & (1 << r))
    return 1;
  else
    return 0;
}

void
set_num(int input)
{
  int q = input / 8;
  int r = input % 8;

  save_num[q] |= 1 << r;
}

int
main(void)
{

  printf("Input DATA?");
  {
    int i = 0;

    while (i < 3) {
      int num;
      char input[20];

      fgets(input, sizeof(input), stdin);
      if ((strlen(input) - 1) >= 10) {
        fprintf(stderr, "len_err.\n");
        continue;
      }
      if (1 != sscanf(input, "%d", &num)) {
        fprintf(stderr, "not_num err.\n");
        continue;
      }
      if (check_duplicate(num)) {
        fprintf(stderr, "duplicate check err.\n");
        continue;
      }
      set_num(num);
      i++;
    }
  }
  {
    int i;

    for (i = 0; i < (sizeof(save_num)/sizeof(save_num[0])) * 8; i++)
      if (check_duplicate(i)) printf("%d\n", i);

  }
  return 0;
}


No.5724

Re:3件の数字の入力規定をつくります。
投稿者---かずま(2003/04/08 13:35:38)


#include <stdio.h>

#define N  3

int main(void)
{
    int a[N], i, v, n = 0;  char buf[1024], c;

    while (n < N) {
        printf("[%d]: ", n+1);
        if (fgets(buf, sizeof buf, stdin) == NULL) return 1;
        if (sscanf(buf, "%d %c", &v, &c) != 1) continue;
        if (v > 999999999 || v < 0) continue;
        for (i = 0; i < n; i++)
            if (a[i] == v) break;
        if (i == n) a[n++] = v;
    }
    for (i = 0; i < n; i++)
        printf("  [%d] = %d\n", i+1, a[i]);
    return 0;
}


No.5745

Re:ありがとうございます。
投稿者---ビギナー(2003/04/10 23:36:38)


ありがとうございました。
これからも続けて勉強します。
無理な注文してすみませんでした。