ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

C言語とC++言語コミュの ●3桁の整数を読み込み4桁で表示するプログラムについて●

  • mixiチェック
  • このエントリーをはてなブックマークに追加
大学の課題で,3桁の整数を読み込んで4桁の整数で表示するプログラムを「C」で作りなさい,というのが出されたのですが,全く分かりません.大変申し訳ないのですが,助けてください!!

課題を詳しく説明させていただきます.

[読み込みファイル]
111222333444555666777888999・・・・・(3桁の数字が24個)
111222333444555666777888999・・・・・(3桁の数字が24個)
・
・
・
・
・
・
111222333444555666777888999・・・・・(3桁の数字が24個)
(同じ形式の数値が縦に31個)



[表示させたいファイル]
(1行目を空ける)
01 111 222 333 444 555 666 777・・・・・(初めに01と数字をいれ,後ろは4桁表記にする)
02 111 222 333 444 555 666 777・・・・・(初めに02と数字をいれ,後ろは4桁表記にする)
・
・
・
・
・
・
31 111 222 333 444 555 666 777・・・・・(初めに31と数字をいれ,後ろは4桁表記にする)
(同じ形式の数値が縦に31個)


このように表示させたいのです.ちなみに,縦が31というのは1ヶ月の31日をあらわしています.また,横に24というのは1日の24時間をあらわしています.

大変申し訳ないのですが,分かる人がいましたら教えていただけないでしょうか?よろしくお願いします.

コメント(18)

そんな問題は C で処理するほうが間違っている! という趣旨の論文を、スクリプト言語10種類くらいで処理する方法といっしょに提出しましょう。

...いや、まじめな話です。
int型を使わずに、char型を使わないと解けないような気がします。

それにしても何でこの問題が、、意図がまったくつかめません。
 ざっと作ってみました。あくまでも「参考」としてどうぞ。

#include <stdio.h>
#include <stdlib.h>

int main( /* 入り口となる関数 */
    int    argc, /* 指定パラメータ数 */
    char * argv[] /* 指定パラメータ文字列の配列 */
) {
    FILE * infile; /* 入力ファイル */
    char a; /* 入力ファイルから読み込む文字を格納するところ */
    int i; /* 読み込んだ文字のカウント */
    int day; /* 日数 */

    if( 2 == argc ) { /* 指定パラメータ数が2の場合のみ処理する */
        i = 0; /* 文字カウントを初期化 */
        day = 1; /* 日数を初期化 */
        infile = fopen( argv[ 1 ], "r" ); /* 入力ファイルを開く */
        while( EOF != ( a = fgetc( infile ) ) ) { /* 入力ファイルが終わるまで1文字ずつ読み込む */

            if( a != '\n' ) { /* 改行文字以外を処理する */

                if( i % ( 3 * 24 ) == 0 ) { /* カウントが 3*24 で割り切れる場合に処理する */
                    printf( "\n%02d", day ); /* 改行して日数を表示 */
                    day ++; /* 日数を加算 */
                }

                if( i % 3 == 0 ) { /* カウントが3で割り切れる場合に処理する */
                    printf( " " ); /* 空白を表示 */
                }

                printf( "%c", a ); /* 読み込んだ文字を表示 */
                i ++; /* 1文字処理したのでカウントを加算 */
            }

        }
        fclose( infile ); /* 入力ファイルを閉じる */
    }
    else { /* 指定パラメータ数が2でない場合 */
        printf( "Please set filename.\n" ); /* ファイル名を指定せよと表示 */
    }

    return EXIT_SUCCESS; /* 終了 */
}
Cしかないので・・・.
とりあえずここまで作ってみました.しかしうまくいきません.

/* ライブラリの宣言 */

#include <stdio.h>

int main(void)
{
/* データ型の宣言 */
FILE *fin , *fout;
char fnin[40] , fnout[40];
int i , j ;
char idata[72][31] , jdata[72][31];

/* 入力ファイルの読込み */
printf( "入力ファイル名を入力して下さい : " );
scanf( "%s" , fnin );

/* 入力ファイルを開く → データの読込み → 入力ファイルを閉じる */
if( ( fin = fopen( fnin , "r") ) == NULL ){
printf( "入力ファイルを開けません \n" );
return 1;
}
else{
for( j = 0 ; j <= 30 ; j++ ){
for( i = 0 ; i<= 71 ; i++ ){
fscanf( fin , "%c" , &idata[i][j] );
}
fscanf( fin , "\n" );
}

}
fclose( fin );

/* データの変換 */
for( j = 0 ; j <= 30 ; j++ ){
for( i = 0 ; i <= 71 ; i++ ){
jdata[i][j+1] = idata[i][j];
}
}


printf( "KUSIMOTO \n" );
for( j = 1 ; j <= 31 ; j++ ){
printf( "%d " , j );
for( i = 0 ; i <= 23 ; i++ ){
printf( "%c""%c""%c " , jdata[3*i][j] , jdata[3*i+1][j], jdata[3*i+2][j]);
}
printf( "\n" );
}



/* 出力ファイル名の読込み */
printf( "\n出力ファイル名を入力してください : " );
scanf( "%s" , fnout );

/* 出力ファイルを開く → データの書込み → 出力ファイルを閉じる */
if( ( fout = fopen( fnout , "w" ) ) == NULL ){
printf( "出力ファイルを開けません \n" );
return 1;
}
else{
fprintf( fout , "KUSIMOTO \n" );
for( j = 1 ; j <= 31 ; j++ ){
fprintf( fout , "%2d " , j );
for( i = 0 ; i <= 23 ; i++ ){
fprintf( fout , "%c""%c""%c " , jdata[3*i][j] , jdata[3*i+1][j], jdata[3*i+2][j]);
}
fprintf( fout , "\n" );
}
}
fclose( fout );
}


まで作ったのですがうまくいきません.

読み取りデータが2桁と3桁が混ざっているため思い通りによみとってくれません.例えば

65123 45661211
111321123 65111

だとしたら

65 123 45 661 211
111 321 123 65 111

というかんじに読み取りたいのですが・・・.
65123 45661211
は
651 23 456 61 211
だったりしないのですか?
区切りかたのルールは決まっていないのですか?
000001010・・・
は↓のようにならなくていいの?
0 1 10・・・
>3桁の数字が24個
>2桁と3桁が混ざっている
orz
なるほど、先頭に空白ですか。HTMLソースを見たら確かに空白が。
というわけで参考にしてはならないバージョン。
(これでどうだ(謎))
#include <stdio.h>

int filter(FILE *fp);
int main(int argc, char **argv)
{
  FILE *fp;

  if (argv[1]) {
    fp = fopen(argv[1], "r");
  } else {
    fp = stdin;
  }

  if (!fp) {
    return 1;
  }

  filter(fp);

  if (argv[1]) {
    close(fp);
  }

  return 0;
}

int filter(FILE *fp)
{
  int line;
  int c;
  int ch;

  c = 0;
  line = 0;
  goto newline;
  while ((ch = fgetc(fp)) != EOF){
    switch (ch) {
    case '\n':
    newline:
      fputc('\n', stdout);
      ++line;
      c = 0;
      fprintf(stdout, "%02d ", line);
      break;
    default:
      fputc(ch, stdout);
      if (++c == 3) {
        fputc(' ', stdout);
        c = 0;
      }
    }
  }
  fputc('\n', stdout);

  return 0;
}
みなさんすいません!完成しました!ほんとご迷惑をおかけしました!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define COLS 24 /* 要素数 */

int main(int argc, char* argv[])
{
    int i; /* 読込時の要素数カウンタ */
    int j; /* 出力時の要素数カウンタ */

    /* 入力データ (要素数*3桁+終端文字) */
    char indata[COLS*3+1] =
                "111 22  3444 55666777888999  0"
                "111 22  3444 55666777888999  0"
                "111 22  3444";

    /* int に変換した入力データ格納用 */
    int outdata[COLS];

    /* atoi()関数に渡すための文字列バッファ */
    char buf[4];

    /* データ取り込み */
    for (i=0; i<COLS; i++)
    {
        /* バッファクリア */
        memset(buf, 0, sizeof(buf));

        /* 3桁分コピー */
        strncpy(buf, &indata[i*3], 3);

        /* intに変換 */
        outdata[i] = atoi(buf);
    }

    /* 行番号表示 */
    printf("01 ");

    /* データ表示 */
    for (j=0; j<COLS; j++)
    {
        printf("%4d", outdata[j]);
    }

    return 0;
}
---
書いてみました。

ファイルからの読込みの部分やデータ行数分繰り返しは省略してます。
(ファイルから読込んだと仮定してchar配列に入力データを入れてます)
また、出力はファイルに出力するところを省略してprintfで出してます。

4文字(3桁+終端文字)分のバッファ(変数 buf)を設けて、
入力データから3桁ごとにコピーして、
atoi()関数で文字列からint値を作り
出力用のint配列に格納するってのを要素数分繰り返しています。
(略)
  int i, j, k;
  char lnbuf[128];
  char nmbuf[4];
  FILE *fpi, *fpo;
(略)
  for(i=1; i <= 31; i++){
    fprintf(fpo, "\n%02d", i);
    fgets(lnbuf, sizeof(lnbuf), fpi);
    for(j=0; j < 24; j++){
      for(k=0; k < 3; k++)
        nmbuf[k] = lnbuf[3*j+k];
      nmbuf[k] = '\0';
      fprintf(fpo, " %s", nmbuf);
    }
  }
(略)

-

fpiが入力ファイルへのファイルポインタ、fpoは出力ファイル。
1. 先頭に空行いれるらしいので、改行を頭で行ったあと行番号を打ち出したあと、入力を1行取得する。
2. そこから3バイトずつ読んで頭に空白つけて4バイトで出力。を24回ループ。
3. 1, 2を31回ループ。
      for(k=0; k < 3; k++)
        nmbuf[k] = lnbuf[3*j+k];
      nmbuf[k] = '\0';
      fprintf(fpo, " %s", nmbuf);

は

      fprintf(fpo, " ");
      for(k=0; k < 3; k++)
        fputc(lnbuf[3*j+k], fpo);

の方がいいかな。
#include <stdio.h>
main() {
  int i, j;
  char buff[3*24+1];
  for (i = 1; i <= 31; i++) {
    gets(buff);
    printf("%02d", i);
    for (j = 0; j < 24; j++) {
      printf(" %c%c%c", buff[j*3], buff[j*3+1], buff[j*3+2]);
    }
    printf("\n");
  }
}

で良いじゃん?
(実行するときは foo.exe < input.txt)
>17
そうか、思い切りが足りなかった。

ログインすると、残り3件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

C言語とC++言語 更新情報

C言語とC++言語のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング