tig33 の回答履歴
- プログラミング
プログラミングの質問です。 数独(9×9)の解答判定プログラムを作っています。列、行、枠(3×3)の中に同じ数字が含まれていないことを確認すればいいことは分かったのですが、それをどう書いたらいいのか分かりません。分かる方、教えてください。
- ベストアンサー
- C・C++・C#
- bluesky445
- 回答数3
- 構造体配列
いつもお世話になっています。 今日構造体配列を勉強した際に下の演習をしていたのですが、いまいち基礎的な関数や配列のことやコマンドライン引数のことが理解できていません。一応自分なりにプログラムを書いてみたのですが、エラーがでます。 どなたかアドバイス・ご指摘・解説・例などをおねがいいたします。 問題はコマンドライン引数で人数を指定し,人数分のデータを標準入力(キーボード)から構造体配列に入力し,標準出力(ディスプレイ)に出力するプログラムです。 #include<stdio.h> typedef struct{ char name[100]; int age; double height; double weight; } PERSONAL_DATA1; typedef struct{ int person[10]; }PERSONAL_DATA2; PERSONAL_DATA1 input_personal_data(int num); void output_personal_data(PERSONAL_DATA2 person[10],int num); int main(int argc, char *argv[]){ PERSONAL_DATA1 x; int num,i; char person[10]; if(argc != 2){ printf("Usage ./test number"); return 0; } num=atoi(argv[1]); for(i=0;i<10&&i<num;i++){ person[i]=input_personal_data(); output_personal_data(person,num); return 0; } } PERSONAL_DATA input_personal_data(void){ PERSONAL_DATA1 x; printf("name>"); scanf("%c" ,&x.name); printf("age>"); scanf("%d" ,&x.age); printf("height>"); scanf("%lf" ,&x.height); printf("weight>"); scanf("%lf" ,&x.weight); return x; } void output_personal_data(PERSONAL_DATA2 person[10],int num){ PERSONAL_DATA1 x; printf("name>>%s\n" ,x.name); printf("age>>%d\n" ,x.age); printf("height>>%lf[cm]\n" ,x.height); printf("weight>>%lf[kg]\n" ,x.weight); } またコマンドライン引数で指定したデータファイルAから入力した個人データ集合を構造体配列に取り込み,標準出力(ディスプレイ)と同じくコマンドライン引数で指定したデータファイルBへファイル出力に出力するプログラムというおまけの問題もあります。 こちらの問題のヒントもいただけませんか?
- 正しい結果が表示されない
以下のプログラムはガウスの消去法を使って 解を求めるプログラムです。 しかし、gauss関数にprintf関数を入れてコンパイルすると 正しい結果 5 3 1 0 0 がでますが、gauss関数にprintf関数をいれずmain関数に書くと 0 0 0 0 0 となります。 なぜでしょうjか?? #include<stdio.h> #include<math.h> #define N 5 void gauss(double a[N][N+1]); int main(){ double a[N][N+1] = { { 1,-1,-1,-1,-1, 1}, {-1, 1,-1,-1,-1,-3}, {-1,-1, 1,-1,-1,-7}, {-1,-1,-1, 1,-1,-9}, {-1,-1,-1,-1, 1,-9} }; double x[N]; int i; gauss(a); printf("\n[x]=\n"); /* x[i] を表示する */ for(i=0; i<N; i++){ printf(" %8.3lf\n", x[i]); } return(0); } void gauss(double a[N][N+1]) { int i,j,k,p; double m, pmax, s, x[N]; for(k = 0; k < N-1; k++){ /* ピボット操作 */ p = k; /* p, pmax の初期値 */ pmax = fabs(a[k][k]); for(i = k+1; i < N; i++){ /* 最大値を検索 */ if(fabs(a[i][k]) > pmax){ p = i; pmax = fabs(a[i][k]); } } if(fabs(pmax) < 1.0e-12){ /* 最大値がゼロに近い時はエラー */ fprintf(stderr, "too small pivot!\n"); exit(1); } if(p != k){ /* ピボット操作 */ for(j = 0; j < N+1; j++) { s = a[k][j]; /* 値の入れ替え */ a[k][j] = a[p][j]; a[p][j] = s; } } for(i = k+1; i < N; i++) { /* 第 i 行 */ m = a[i][k] / a[k][k]; /* 倍率 m を計算 */ a[i][k] = 0; /* 注1 (下記参照) */ for(j = k+1; j < N+1; j++) { /* 第 j 列 */ a[i][j] = a[i][j] - a[k][j] * m; } } } for(i = N-1; i >= 0; i--){ /* 後退代入 */ m = 0; for(j = N-1; j > i; j--){ m = m + a[i][j] * x[j]; } x[i] = (a[i][N] - m) / a[i][i]; } }
- 関数のプロトタイプ宣言
#include <stdio.h> #define N 3 #define M 4 int sum(int [][M]); (関数のプロトタイプ宣言) int main(){ ・ ・ ・ return(0); } int sum(int x[][M]){ ・ ・ } 以上のプログラムより、関数のプロトタイプ宣言や、関数内の 行列の定義でint sum(int [][M]);や int sum(x[][M]){}となっていますが なぜ、列にMだけを代入することだけでよいのでしょうか? また、教科書に関数のプロトタイプ宣言ではint sum(int [][]);だけでもよいと書かれていたのですが 実際、コンパイルしてみたところ 'int[]' 型のサイズは未知あるいはゼロとエラーがでました。 これは、コンパイラによってできるものとできないものがあるのでしょうか?? よろしくお願いします。
- このプログラムどこがおかしいですか?
コンパイルはできますが実行できません… どこがおかしいか分かる人教えてください。 このプログラムはファイルから名前 数学の点数、英語の点数を読み込んで文字データに入れた後構造体に入れて探し出す値の項目(キー)を入力して(何番目にあるか)探し出すというプログラムです。 #include <stdio.h> #include <string.h> #define NUMBER 10 //構造体を宣言する struct student { //名前、身長、体重を構造体オブジェクトのメンバに格納する関数の定義 char name[10]; char math[4]; char eng[4]; }; /*--- 要素数nの配列aからkeyと一致する要素を線形探索(番兵法) ---*/ int search(struct student *b, int n, char key) { int i=0; b[i].name[0]=key; // 番兵を追加 while (1) { if (b[i].name[0] == key) break; /* 見つけた */ i++; } return (i == n ? -1 : i); } int main(void) { FILE *fpin; struct student a[NUMBER]; int i=0, idx,ret; char buffer[20],ky; int nx=sizeof(buffer) / sizeof(buffer[0]); fpin=fopen("input2.txt","r"); //テキストファイルを読み取りモードで開く while(fgets(&buffer[0],sizeof(buffer),fpin) !=NULL ) { if(i>=100) break;//読み込む人数が100人を超えてる時の処理 ret=sscanf(&buffer[0],"%s %s %s",&a[i].name,&a[i].math,&a[i].eng); //データ文字列を3分割 if(ret!=3) //3に分割できなかったときの処理 { puts("代入された入力項目の個数が3でありません"); goto END; } printf("%s %s %s\n",&a[i].name,&a[i].math,&a[i].eng); i++; } printf("探す値:"); scanf("%s", &ky); idx = search(a, nx - 1, ky); /* 配列xから値がkyである要素を線形探索 */ if (idx == -1) puts("探索に失敗しました。"); else printf("%dは%d番目にあります。\n", ky, idx + 1); END: fclose(fpin); return 0; }
- while文を使うと思うのですが・・・。
プログラミングを独学でやっている初心者です。 以下の問題でつまずきました。 「単細胞生物が翌日までに2分裂して2細胞になるとする。1匹も死なないとすると、細胞数が1万匹を超えるのは何日目になるかを算出するプログラムを作成せよ。」 実行結果を 『15日目に16384個の細胞数になります。』としたい。 while文を使うと思うのですが、どう作成したらよいのか…。 詳しい方、よろしくお願いします。
- while文を使うと思うのですが・・・。
プログラミングを独学でやっている初心者です。 以下の問題でつまずきました。 「単細胞生物が翌日までに2分裂して2細胞になるとする。1匹も死なないとすると、細胞数が1万匹を超えるのは何日目になるかを算出するプログラムを作成せよ。」 実行結果を 『15日目に16384個の細胞数になります。』としたい。 while文を使うと思うのですが、どう作成したらよいのか…。 詳しい方、よろしくお願いします。
- ファイルを読み込むプログラム
氏名、英語、数学が保存されているファイル(記入されている人数は不明とし100人まで読み込めるとする)を関数内で読み込んで個人の点数の平均値と、皆の数学の平均値、英語の平均値を関数内で定義して出力するプログラムを作りましたが、コンパイルはできても実行するとエラーが出ます。どこがおかしいか分かる人教えてください。 #include <stdio.h> #include<stdlib.h> #include<string.h> #define number 100 int n=0; //構造体を宣言する struct student {char Name[6]; double Math; double Eng; }; struct student *sset_student(char *buffer) { struct student *pss[number]; int ret; ret=sscanf(&buffer[0],"%s %lf %lf",&pss[0]->Name,&pss[0]->Math,&pss[0]->Eng); if(ret!=3) { puts("代入された入力項目の個数が3でありません"); return NULL; } return pss[0]; } struct student *fset_all_student(void) { int i; struct student *pss[number]; FILE *fpin; char buffer[20]; fpin=fopen("input.txt","r"); if(fpin==NULL) { fprintf(stderr, "入力するファイルが開きません"); return NULL; } while(fgets(&buffer[0],sizeof(buffer),fpin) !=NULL ) { pss[i]=sset_student(&buffer[0]); i++; } n=i; fclose(fpin); return pss[0]; } void get_student_average(struct student *pss) { double heikin; heikin=(pss->Math+pss->Eng)/2.0; printf("%sの平均点は%dです\n",pss->Name,heikin); } void get_average(struct student *pss) { int i; double msum=0; double esum=0; for(i=0;i<3;i++) { msum+=pss[i].Math; esum+=pss[i].Eng; } printf("数学の平均点は%dです\n",msum/n); printf("英語の平均点は%dです\n",esum/n); } int main(void) { int i; struct student *a[number]; for(i=0;i<n;i++) { a[i]=fset_all_student(); } for(i=0;i<n;i++) get_student_average(a[i]); get_average(a); return 0; }
- ファイルを読み込むプログラム
氏名、英語、数学が保存されているファイル(記入されている人数は不明とし100人まで読み込めるとする)を関数内で読み込んで個人の点数の平均値と、皆の数学の平均値、英語の平均値を関数内で定義して出力するプログラムを作りましたが、コンパイルはできても実行するとエラーが出ます。どこがおかしいか分かる人教えてください。 #include <stdio.h> #include<stdlib.h> #include<string.h> #define number 100 int n=0; //構造体を宣言する struct student {char Name[6]; double Math; double Eng; }; struct student *sset_student(char *buffer) { struct student *pss[number]; int ret; ret=sscanf(&buffer[0],"%s %lf %lf",&pss[0]->Name,&pss[0]->Math,&pss[0]->Eng); if(ret!=3) { puts("代入された入力項目の個数が3でありません"); return NULL; } return pss[0]; } struct student *fset_all_student(void) { int i; struct student *pss[number]; FILE *fpin; char buffer[20]; fpin=fopen("input.txt","r"); if(fpin==NULL) { fprintf(stderr, "入力するファイルが開きません"); return NULL; } while(fgets(&buffer[0],sizeof(buffer),fpin) !=NULL ) { pss[i]=sset_student(&buffer[0]); i++; } n=i; fclose(fpin); return pss[0]; } void get_student_average(struct student *pss) { double heikin; heikin=(pss->Math+pss->Eng)/2.0; printf("%sの平均点は%dです\n",pss->Name,heikin); } void get_average(struct student *pss) { int i; double msum=0; double esum=0; for(i=0;i<3;i++) { msum+=pss[i].Math; esum+=pss[i].Eng; } printf("数学の平均点は%dです\n",msum/n); printf("英語の平均点は%dです\n",esum/n); } int main(void) { int i; struct student *a[number]; for(i=0;i<n;i++) { a[i]=fset_all_student(); } for(i=0;i<n;i++) get_student_average(a[i]); get_average(a); return 0; }
- ファイルを読み込むプログラム
氏名、英語、数学が保存されているファイル(記入されている人数は不明とし100人まで読み込めるとする)を関数内で読み込んで個人の点数の平均値と、皆の数学の平均値、英語の平均値を関数内で定義して出力するプログラムを作りましたが、コンパイルはできても実行するとエラーが出ます。どこがおかしいか分かる人教えてください。 #include <stdio.h> #include<stdlib.h> #include<string.h> #define number 100 int n=0; //構造体を宣言する struct student {char Name[6]; double Math; double Eng; }; struct student *sset_student(char *buffer) { struct student *pss[number]; int ret; ret=sscanf(&buffer[0],"%s %lf %lf",&pss[0]->Name,&pss[0]->Math,&pss[0]->Eng); if(ret!=3) { puts("代入された入力項目の個数が3でありません"); return NULL; } return pss[0]; } struct student *fset_all_student(void) { int i; struct student *pss[number]; FILE *fpin; char buffer[20]; fpin=fopen("input.txt","r"); if(fpin==NULL) { fprintf(stderr, "入力するファイルが開きません"); return NULL; } while(fgets(&buffer[0],sizeof(buffer),fpin) !=NULL ) { pss[i]=sset_student(&buffer[0]); i++; } n=i; fclose(fpin); return pss[0]; } void get_student_average(struct student *pss) { double heikin; heikin=(pss->Math+pss->Eng)/2.0; printf("%sの平均点は%dです\n",pss->Name,heikin); } void get_average(struct student *pss) { int i; double msum=0; double esum=0; for(i=0;i<3;i++) { msum+=pss[i].Math; esum+=pss[i].Eng; } printf("数学の平均点は%dです\n",msum/n); printf("英語の平均点は%dです\n",esum/n); } int main(void) { int i; struct student *a[number]; for(i=0;i<n;i++) { a[i]=fset_all_student(); } for(i=0;i<n;i++) get_student_average(a[i]); get_average(a); return 0; }
- 構文エラー";"が型の前にありませんとは、どうしたら解決できるのですか。
キーボードから正の整数を読み取り、n個の奇数を加算しディスプレイにかきだすプログラムです。;が型の前に必要というエラーがずっとでてきて、でも足りないところはわからないのですが、何が違うのでしょう??もうわけがわからなくて困ってます。お願いします。 /*演習1-3*/ #include<stdio.h> int main() { int i; int n; int sum=0; printf("%d¥n",n); for (i=1;i<=n;i+=2); int scanf("%d",&n); sum+=i; printf("1+2+...+n=%d\n",sum); return 0; }
- ベストアンサー
- C・C++・C#
- korira2000
- 回答数3
- 10個の整数を入力して小さい順にソートする
C言語を使って、10個の整数を読み込んで小さい順にソートするプログラムを作っています。 #include<stdio.h> #include<stdlib.h> int main() { int a[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; int i; for (i = 0; i < 9; ++i ) { printf("No. %d Please Enter!", a[i]); scanf("%d", &a[i]); } return(0); } これで、10個の整数を読み込んだ後、ソートする方法が分かりません。 どなたか教えていただけますでしょうか^^;
- 重複チェックプログラム
ご経験ある方いらっしゃいましたらアドバイスください。 環境:linux, gcc 64bitの整数データ(符号なし)を入力とし、64bitの整数データを出力する関数を作成中です。 入力データに対して、出力データは絶対に重複しないという条件で関数を作成したのですが、 (入力と出力は1対1になる) その条件のチェックができない状態で困っています。 試した方法は、以下のとおりです。 (1)すべての入力データに対する出力データをテキストファイルに書き出す。 (2)再びすべての入力データを計算するのだが、今度は出力データを(1)で作成したテキストファイルと比較していく。 そのときテキストファイル内に出力データと同じデータが2つ以上あれば重複が存在する。 しかし、(1)の時点でlinuxのファイル制限2.1GBに引っかかってしまい、 これ以上進めることができませんでした。 同じような大量のデータに対して重複確認することは不可能なのでしょうか? もし、linuxのファイル制限がなくてもHDDの容量制限に引っかかってしまいそうです。 このような制限に依存せず、重複確認できる方法がありましたら教えてください。 質問が不明、不足な点がある場合にもご指摘おねがいします。宜しくお願いします。
- 締切済み
- C・C++・C#
- ring_rollo
- 回答数10
- 重複チェックプログラム
ご経験ある方いらっしゃいましたらアドバイスください。 環境:linux, gcc 64bitの整数データ(符号なし)を入力とし、64bitの整数データを出力する関数を作成中です。 入力データに対して、出力データは絶対に重複しないという条件で関数を作成したのですが、 (入力と出力は1対1になる) その条件のチェックができない状態で困っています。 試した方法は、以下のとおりです。 (1)すべての入力データに対する出力データをテキストファイルに書き出す。 (2)再びすべての入力データを計算するのだが、今度は出力データを(1)で作成したテキストファイルと比較していく。 そのときテキストファイル内に出力データと同じデータが2つ以上あれば重複が存在する。 しかし、(1)の時点でlinuxのファイル制限2.1GBに引っかかってしまい、 これ以上進めることができませんでした。 同じような大量のデータに対して重複確認することは不可能なのでしょうか? もし、linuxのファイル制限がなくてもHDDの容量制限に引っかかってしまいそうです。 このような制限に依存せず、重複確認できる方法がありましたら教えてください。 質問が不明、不足な点がある場合にもご指摘おねがいします。宜しくお願いします。
- 締切済み
- C・C++・C#
- ring_rollo
- 回答数10
- バイナリデータの書き方が分かりません・・。
シリアルポートでバイナリデータを送信したいのですが、バイナリをどう書けがいいのか分りません。 送りたいコードは16進数で02 00 02 00です。 以下のソースの"123"の部分を書き換えるのだと思うのですが、どう書けば良いのでしょうか? よろしくお願いします。 char* wbuf; DWORD wbyte; lstrcpy(wbuf,"123"); WriteFile(hCom,wbuf,lstrlen(wbuf),&wbyte,&old
- バブルソートについて質問です。
キーボード入力で10個好きな数字を入れてもらい入力した数字を小さい順に並び替えさらに入力した数を合計して小さい順の入力値と合計値を表示させ0は表示させないというプログラムを作りたいのですが途中から意味が分からなくなってしまいました。 ここを直したらいいなどのアドバイスをお願いします。 #include <stdio.h> void swap (int *,int *); void printdata(int *); main() { int a[10]; int n=10; int i,j; for(i=0;i<=9;i++) scanf("%d\n",a[i]); int kekka; kekka=a+a[1]+a[2]+a[3]+a[4]+a[5]+a[6]+a[7]+a[8]+a[9]; return kekka; printdata(a); for(j=n-1;j>=0;j--){ for(i=0;i<j;i++){ if(a[i]>a[i+1]){ swap(a+i,a+i+1); printf("[%d]と[%d]を入れ替え\n",i,i+1); printdata(a); } } } } void swap(int *y,int *z) { int t; t= *y; *y=*z; *z=t; } void printdata(int *a) { int i; for(i=0;i<=9;i++) printf("%4d",a[i]); printf("\n"); }
- 締切済み
- C・C++・C#
- noname#58788
- 回答数8
- バブルソートについて質問です。
キーボード入力で10個好きな数字を入れてもらい入力した数字を小さい順に並び替えさらに入力した数を合計して小さい順の入力値と合計値を表示させ0は表示させないというプログラムを作りたいのですが途中から意味が分からなくなってしまいました。 ここを直したらいいなどのアドバイスをお願いします。 #include <stdio.h> void swap (int *,int *); void printdata(int *); main() { int a[10]; int n=10; int i,j; for(i=0;i<=9;i++) scanf("%d\n",a[i]); int kekka; kekka=a+a[1]+a[2]+a[3]+a[4]+a[5]+a[6]+a[7]+a[8]+a[9]; return kekka; printdata(a); for(j=n-1;j>=0;j--){ for(i=0;i<j;i++){ if(a[i]>a[i+1]){ swap(a+i,a+i+1); printf("[%d]と[%d]を入れ替え\n",i,i+1); printdata(a); } } } } void swap(int *y,int *z) { int t; t= *y; *y=*z; *z=t; } void printdata(int *a) { int i; for(i=0;i<=9;i++) printf("%4d",a[i]); printf("\n"); }
- 締切済み
- C・C++・C#
- noname#58788
- 回答数8
- バブルソートについて質問です。
キーボード入力で10個好きな数字を入れてもらい入力した数字を小さい順に並び替えさらに入力した数を合計して小さい順の入力値と合計値を表示させ0は表示させないというプログラムを作りたいのですが途中から意味が分からなくなってしまいました。 ここを直したらいいなどのアドバイスをお願いします。 #include <stdio.h> void swap (int *,int *); void printdata(int *); main() { int a[10]; int n=10; int i,j; for(i=0;i<=9;i++) scanf("%d\n",a[i]); int kekka; kekka=a+a[1]+a[2]+a[3]+a[4]+a[5]+a[6]+a[7]+a[8]+a[9]; return kekka; printdata(a); for(j=n-1;j>=0;j--){ for(i=0;i<j;i++){ if(a[i]>a[i+1]){ swap(a+i,a+i+1); printf("[%d]と[%d]を入れ替え\n",i,i+1); printdata(a); } } } } void swap(int *y,int *z) { int t; t= *y; *y=*z; *z=t; } void printdata(int *a) { int i; for(i=0;i<=9;i++) printf("%4d",a[i]); printf("\n"); }
- 締切済み
- C・C++・C#
- noname#58788
- 回答数8
- 1
- 2