• 締切済み

プログラミングの課題です。

プログラミングの課題です。 9個のマスがあり、1~9の数字が一個だけ入るとする。 このとき、符号なし整数1つでマスにまだ入れられていない数字を記録したい。 そこで、下位ビットから9ビット目までで1~9がマスに入っているかどうかを表すこととする。 空白のマスは0で表示する。 例:132584090→下位9ビット:001100000 この場合、6もしくは7がマスに入っていないため、6ビット目と7ビット目に1が立っていることとなる。 課題プログラムを実行すると、in.txtから9個の文字データを読み込み、上記のような変換をして9ビットのデータのビット列を表示する。例えば132584090とin.txtに記録されていた場合、下位9ビットは001100000と表示される。 手順 1..ビット列を記録する変数を宣言し、0で初期化する。 2..9個の数字を9個の変数に ファイルから読み込む 3..各変数には0~9の数字が入っているが、0以外の場合に対応する桁に1を立てる 4..ビット列の 0と1を反転させる 5..下位9ビットをprintf関数で表示する 6..in.txtの値をいろいろ変化させて、プログラムが正しいことを確認せよ。 #include <stdio.h> int main() { int i,a[10],b; FILE *fp; fp=fopen("in.txt","r"); if(fp==NULL){ printf("ファイルが開けませんでした\n"); } while(fscanf(fp,"%d %d %d %d %d %d %d %d %d",a[i],a[i],a[i],a[i],a[i],a[i],a[i],a[i],a[i]))i++; for(i=0;i<9;i++){ a[i]='\0'; } for(i=0;i<9;i++){ a[i]=b; } b=~b; printf("下位9ビット",(b%256)&8,(b%128)&7,(b%64)&6,(b%32)&5,(b%16)&4,(b%8)&3,(b%4)&2,(b%2)&1,b%1); return(0); } こんな感じで作りましたが、実行できませんでした。できれば詳しく解説していただけるとたすかります。よろしくお願いします。

noname#151311
noname#151311

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

%1d にすれば fscanf でもいいんじゃないでしょうか>#2. 「誰がそんなことしたいんだ」とか「そこにどんな意味があるのか」とかいう指摘は受け付けない.

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.2

……あー、何ボケてたんだ俺、これfscanfを使う問題じゃないじゃん。 というわけで、前回の回答の(1)の最後を ・そもそもfscanfじゃなくってfgetc使うべき。 に変更します。どう使えばいいかは自分で考えましょう。

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.1

作成手順がおかしい、というのが第一印象です。 1番から順番にその番号の処理がきちんとできているかをデバッガ等で確認しながら作っていればこんなプログラムにならなかったのでは、と思います。 以下、課題だということなのでヒントを。 (1) > while(fscanf(fp,"%d %d %d %d %d %d %d %d %d",a[i],a[i],a[i],a[i],a[i],a[i],a[i],a[i],a[i]))i++; > for(i=0;i<9;i++){ > a[i]='\0'; > } ・値を読み込んだ後に初期化してどうするw ・初期化範囲がおかしい。 ・(結果的には正しいが)文字を扱うわけでもないint型の値の初期化に文字定数を使うのってどうなんだか。 ・fscanfで値を受け取る変数はアドレスで指定する。 ・in.txtに数値が1個ずつスペースで区切られているならばこのフォーマット指定でいいが、実際には異なる。文字列で読み込むべし。 (2) > for(i=0;i<9;i++){ > a[i]=b; > } ・bの値を作るための配列aの各要素にbを代入している。 ・代入を入れ替えたとしてもこれでは現在の値で前の値を書き換えてしまう。ビット演算子を使うこと。 ・そもそもbを初期化していない。 (3) > printf("下位9ビット",(b%256)&8,(b%128)&7,(b%64)&6,(b%32)&5,(b%16)&4,(b%8)&3,(b%4)&2,(b%2)&1,b%1); ・これでは「下位9ビット」という文字しか表示しない。フォーマット指定を追加すること。 ・表示しようとしているそれぞれの値はあなたが想定した結果にならない。ビット演算子とシフト演算子を使うこと。 (4) > return(0); ・やり残している処理がある。

関連するQ&A

  • プログラミング 課題

    さっぱり分かりません。解答例があれば助かるんですが、お願いします 問3:8桁の2進数の数字を入力すると、10進数に変換して表示するプログラム(prog11.c) を作成しなさい。(配列の練習問題なので、数字を8 個格納できる1 次元配列を 用意し、2 進数の各桁の数字(0 または1)を8 回キーボードから入力して、そ れぞれを配列に格納してから10 進数に変換するプログラムを作ってください) 問4:X 月Y 日からZ 日後の日付を求めるプログラム(prog12.c)を作成しなさい。 じぶんなりの解答はこれです 1 #include <stdio.h> 2 3 #define N 8 4 5 int main() 6 { 7 int i, d; 8 char a[N]; 9 10 printf("Input %d bits binary number: ", N); 11 for (i = 0; i < N; i++) 12 scanf("%c", &a[i]); 13 d = 0; 14 for (i = 0; i < N; i++) 15 d = 2*d + ((a[i] == '0') ? 0 : 1); 16 printf("%d¥n", d); 17 return 0; 18 } 2)実行例 $ ./a.exe Input 8 bits binary number: 10101010 170 $ ./a.exe Input 8 bits binary number: 01010101 85 問4 2 3 #define N 12 4 5 int main() 6 { 7 int n, x, y, z, m, d; 8 int a[N] = {31,28,31,30,31,30,31,31,30,31,30,31}; 9 10 printf("Input month and day in the MMDD format: "); 11 scanf("%d", &n); 12 x = n/100; 13 y = n%100; 14 printf("Input the number of days: "); 15 scanf("%d", &z); 16 m = x; 17 d = y+z; 18 while (d > a[m-1]) { 19 d = d - a[m-1]; 20 m = (m == 12) ? 1 : m+1; 21 } 22 printf("The day after %d days of %d/%d is %d/%d.¥n", z, x, y, m, d); 23 return 0; 24 } 2)実行例 $ ./a.exe Input month and day in the MMDD format: 0106 Input the number of days: 10 The day after 10 days of 1/6 is 1/16. $ ./a.exe Input month and day in the MMDD format: 0106 Input the number of days: 60 The day after 60 days of 1/6 is 3/7. $ ./a.exe Input month and day in the MMDD format: 0106 Input the number of days: 365 The day after 365 days of 1/6 is 1/6. ちがうプログラムで同じ実行結果が出るものをつくれますか? 至急おねがいします 解説を付けてくれたらたすかります

  • c言語  2つのファイルを行ごとに読み込むプログラミング

    c言語  2つのファイルを行ごとに読み込むプログラミング 0.txt と 1.txt という2つのテキストフォルダがあり 0.txt の中身は a a b b 1.txt の中身は c c d d というものとします。 これら2つのフォルダを読み込むとき まず1つのフォルダの1行目(a a)を表示し 他方の1行目(c c) 2行目(d d)を表示させて 続いて1つのフォルダの2行目(b b)を表示し 他方の1行目(c c) 2行目(d d)を表示させたいのです。 つまり実行結果が a a c c a a d d b b  ←理想の実行結果です c c b b d d となるようにしたいのですが #include <stdio.h> #include <stdlib.h> #define STR_MAX 256 int main(void) { FILE *fp, *fp2; int i, j, k; char buf[STR_MAX]; char buf2[STR_MAX]; fp = fopen("0.txt", "r"); fp2 = fopen("1.txt", "r"); if (fp == NULL && fp2 == NULL){ printf("\n"); } while(fgets(buf, STR_MAX, fp) != NULL){ while(fgets(buf2, STR_MAX, fp2) != NULL){ printf("%s%s", buf,buf2); } printf("\n"); } fclose(fp); fclose(fp2); return 0; } このプログラミングの実行結果は a a c c a a d d となり、0.txtの2行目(b b)は表示されません。 おそらく while 文 を2重にすることで 不具合が起きているのだと思うのですが 色々と調べた結果、これ以外に プログラミングが思いつきません。 私の理想の実行結果にするためには どこを訂正させると良いのでしょうか? 恐れ入りますが ご回答 どうかよろしくお願いいたします。

  • プログラミングの課題です。

    input.bmpというビットマップファイル(色数は24ビット)とbackground.bmpというファイルを開き,クロマキー合成をし,ビットマップファイルoutput.bmpに出力させる。ただしimput.bmpが、青:100以上 緑:150以下 赤:70以下なら背景とみなしてよい。 #include <stdio.h> int main() { FILE *fp1,*fp2,*fp3; char pixeldata[54]; int width,height; int i,j; fp1=fopen("input.bmp","rb"); if(fp1==NULL) return(1); //fp1のヘッダー情報の読み込み fp2=fopen("background.bmp","rb"); if(fp2==NULL) return(1); //fp2のヘッダー情報の読み込み fp3=fopen("output.bmp","wb"); if(fp3==NULL) return(1); //fp3のヘッダー情報の書き込み fread(pixeldata,1,54,fp1); fread(pixeldata,1,54,fp2); fwrite(pixeldata,1,54,fp3); printf("input.bmpの縦は何ピクセルですか?"); scanf("%d",&height); printf("input.bmpの横は何ピクセルですか?"); scanf("%d",&width); for(i=0;i<height*width*3;i++){ //画素情報の読み込み(画像サイズ分繰返し) fgetc(fp1); //1画素分のRGBの情報をfp1から読み込み fgetc(fp2); //1画素分のRGBの情報をfp2から読み込み if(){ //fp1から読み込んだ画素が青い fputc(,fp3); //fp3へfp2で読み込んだ1画素分の情報を書き込み } else{//fp1から読み込んだ画素が青くない fputc(,fp3); //fp3へfp1で読み込んだ1画素分の情報を書き込み } } fclose(fp1);fclose(fp2);fclose(fp3); return(0); } みたいな感じで作りましたが、後半がどうやったらいいかわかりません。 どうしたらいいかアドバイスや解説お願いします。

  • fscanf ファイルから数を読み込む。

    ファイルから数を読み込むと 4201696 4201696 4201696 と、sample.txtにない数が表示されます。 sample.txtの中身は、2から6の数です。 sample.txtの中身は画像に添付しました。 以下は実行したプログラムです。 #include<stdio.h> #include <assert.h> int main(void){ FILE *fp; int a,b,i; if((fp=fopen("sample.txt","a"))==NULL){ printf("fileopen error\n"); } printf("整数を入力してください。"); scanf("%d",&a); fprintf(fp,"%3d\n",a); printf("整数を入力してください。"); scanf("%d",&a); fprintf(fp,"%3d\n",a); i=0; while(i<3){ fscanf(fp, "%d",&b); assert(b>2); printf("%3d\n",b); i++; } return(0);} 2から6の間の数が表示されるよう、指摘をおねがいします。

  • 構造体でのファイル操作

    1 2 3 1 2 3 1 2 3 1 2 3 みたいに書き込まれた txtデータを構造体でよみこみたいのですけどうまくいきません プログラムはこんなかんじです int i=0; FILE *fp; fp = fopen("Data.txt","r"); while (fscanf(fp, "%d,%d,%d",a.no[i],a.A[i],a.B[i] ) != EOF){ i++; } fclose(fp); a.noが1列目で a.Aが2列目で a.Bが3列目です Debug assertion failed  と表示されます どうしてでしょうか?

  • ファイルの入力、出力

    #include<stdio.h> int main(){ int a,b; FILE *fp0, *fp1;   fp0 = fopen("test1.dat", "r"); if( fp0 == NULL ){ printf("Cannot open test1.dat"); exit(1); } fp1 = fopen("file.txt", "w"); while((fscanf(fp0, "%d %d", &a,&b)) != EOF){ fprintf(fp1, "%d %d\n", a*a,b*b); } fclose(fp0); fclose(fp1); return(0); } test1.datファイルを読み込んで、変数a,bに値をいれ、 その二乗結果をfile.txtに書き込むプログラムなのですが test1.datファイルに書き込まれてる値をどのようにa,bに代入されているのかわかりません。 例えば test1.datが 1 2 3 4 5 であると、 file.txtには 1 4 9 16 25 16 と書き込まれています。 test1.datが 1 1 2 2 3 3 であると file.txtには 1 1 4 4 9 9 となっています。 どのように、変数に値が入るのでしょうか??

  • 大学のプログラミングの課題

    大学のプログラミングの課題で、また分からないことがあるので 質問させていただきます。 3行3列の正の実数データを入力して、行列の様に出力して、 縦の合計と横の合計を求めるものなんですが、 実行例はこんな感じです 999.99以下の3行3列の正の実数データを入力してください data[0][0]の値? 350.23 data[0][1]の値? 1.0 data[0][2]の値? 503.25 ・・・ 集計の結果は次のとおりである. 350.23 1.00 503.25 : 854.48 625.00 3.14 50.27 : 678.41 999.00 750.75 0.00 : 1749.75 ================================= 1974.23 754.89 553.52 : 3282.64 私の作ったプログラムは以下の通りです。 #include <stdio.h> int main (void) { int i,j; float data[3][3]; float suma,sumb,sumsum=0; printf(" 999.99 以下の3行3列の正の実数データを入力してください\n"); for(i=0;i<3;i++) { for(j=0;j<3;j++) { printf("date[%d][%d]の値?",i,j); scanf("%f",&data[i][j]); } } printf("集計の結果は次のとおりである。\n"); for(i=0;i<3;i++) { suma=0; for(j=0;j<3;j++) { suma=suma+data[i][j]; printf("%7.2f ",data[i][j]); } printf(":"); printf("%7.2f ",suma); printf("\n"); sumsum=sumsum+suma; } printf("======================================\n"); for(j=0;j<3;j++); { sumb=0; for(i=0;i<3;i++) { sumb=sumb+data[i][j]; } printf("%7.2f ",sumb); } printf(":"); printf("%7.2f ",sumsum); printf("\n"); } 実行すると、横の合計はうまくいくのですが、 縦の合計(1974.23 754.89 553.52 と出力したいところ)が -107374・・・ と表示されてうまく行きません・・・ どこが間違っているのか分からないので 詳しく教えていただけると嬉しいです。 分かりにくくてすみません・・・(・・;)

  • c言語 select sort

    最大値検索法のプログラムコードです。 どこがおかしいのでしょうか? 分かる方、教えてください。 よろしくおねがいします。 swapのプログラムコード #include <stdio.h> void swap(int *px,int *py); int main (void) { FILE *fp; if ((fp=fopen("file.txt","rt"))==NULL){ printf("File open error.\n"); return 0; } int i,a[100]; for(i=0;i<100;i++){ fscanf(fp,"%d,",&a[i]); //ファイルから読み込み処理。// } fclose(fp); for(i=0;i<10;i++) printf("[%d]=%d\n",i,a[i]); /*1.ソートすべきデータの中で最大のデータを見つけ、 2.そのデータを最後のデータと入れ替える。 最大データは配列のどこにあるのか⇒maxi              その値⇒max とする。*/ //データが10個の場合 int max,maxi,j; max=a[0],maxi=0; for(i = 0;i < 9; i++){ if(a[i + 1] > max){ max = a[i + 1]; maxi = i + 1; } swap(&a[maxi],&a[9-j]); /* コマンド $cc sort.c swap.c */ for(j=0;j<9;j++){ printf("%d\n",j); max=a[0], maxi=0; for(i=0;i<9-j;i++){ //最大値をもつデータ探索;(カウンタ変数) max++; } //最大データと探索範囲最後のデータとの入れ替え: //void swap(int *px, int *py){ int n,*px,*py; n = *px; *px = *py; *py = n; // } if((fp=fopen("file.txt","wt"))==NULL){ printf("File open error.\n"); return 0; } for(i=0;i<100;i++){ fprintf(fp,"%d",a[i]); } fclose(fp); } } sort.cのプログラムコード #include<stdio.h> void swap (int *px,int *py); int main(void) { int a[0],b,maxi,j,max; max=a[0],maxi=0; printf("input \"a\" as integer = "); scanf("%d",&a); printf("input \"b\" as integer = "); scanf("%d",&b); printf("Before swap...\n"); printf("a - b = %d, a / b = %d...%d\n",a-b,a-b,a-b); // swap(&px,&py); swap(&a[maxi],&a[9-j]); printf("After swap...\n"); printf("a - b = %d, a / b = %d...%d\n",a-b,a-b,a-b); return 0; } void swap (int *px,int *py) { int n; n = *px; *px = *py; *py = n; } 実行結果 /tmp/ccBGIpCi.o(.text+0x0): In function `main': : multiple definition of `main' /tmp/ccMCttJd.o(.text+0x0): first defined here /usr/bin/ld: Warning: size of symbol `main' changed from 304 in /tmp/ccMCttJd.o to 641 in /tmp/ccBGIpCi.o collect2: ld はステータス 1 で終了

  • プログラミングの課題です、助けてください。

    C言語のプログラミングの課題で、「以下のプログラムで、引数としてスコア(100等の数字)を与えると、そのスコア以上のエントリだけを検索して、出力するように変更する」という問題なのですが、プログラミングが苦手な私にはさっぱりわからず、大変困っています。設問のプログラミングがわかる方がいらっしゃいましたら、教えていただけると大変助かります。よろしくお願いします。 #include <stdio.h> #include <string.h> #include <stdlib.h> #define MAX_LEN 256 int main(int argc, char *argv[]) { FILE *rfp; FILE *wfp; int i, score; double evalue; char id[MAX_LEN], name[MAX_LEN], fname[MAX_LEN]; char keyword[] = "glu"; for(i = 0; i < 100; i++){ sprintf(fname,"files/%d.txt",i); if((rfp = fopen(fname, "r")) == NULL) { printf("入力ファイルが存在しません。\n"); return (EXIT_FAILURE); } while (fscanf(rfp,"%s\t%s\t%d\t%f", id, name, &score, &evalue) != EOF){ if (strstr(name,keyword) != NULL){ printf("%s\n",id); } } fclose(rfp); } return (EXIT_SUCCESS); }

  • プログラミング教えてください!!!お願いします。

    プログラミング教えてください!!!お願いします。 次の文が実行されると何がどのようにプリントされるか。何もプリントされない時は「なし」と記せ。 また、途中に「ブランク」が入る場合は、”b”と記せ。 (1) int func1(), func2(); int data = 100; main() { int w = 1; static x =10; printf("** %d, %d, %d\n" ,w,x,data); func1(); printf("** %d, %d, %d\n" ,w,x,data); } int func1(){ int w = 2; static int x = 20: printf("*** %d, %d, %d\n", w, x, data); x += 10; func2(); printf("*** %d, %d, %d\n" , w,x,data); x *= 2; data = data - x; } int func2() { int w = 3; static int x = 30; printf("**** %d, %d, %d\n" ,w,x,data); data -= x; } (2) int func1(char *, char *, char *); int func2(char *, char *, char *); main() { char sta[20], stb[20], stc[20], std[20]; int i=0; func1("abc","xyz",sta); printf("%d -- %s\n" ,++i,sta); func1("123","456",stb); printf("%d -- %s\n" ,++i,stb); func1(sta,stb,stc); printf("%d -- %s\n" ,++i,stc); func2(sta,stb,std); printf("%d -- %s\n" ,++i,std); } int func1(char *a, char *b, char *c){ while(*a) *c++ = *a++; while(*b) *c++ = *b++; * c = 0x00; } int func2(char *a, char *b, char *c){ int i = 0; while(*b){ if(i%2 == 0) *c++ = *a++; else *c++ = *b++; i++; } *c = 0x00; }

専門家に質問してみよう