質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

1120閲覧

入力C++ ファイルの入力の仕方について

7sstrictly

総合スコア2

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/11/08 17:44

編集2020/11/09 16:51

こんばんは、夜分遅くに失礼します。
現在9*9のパズルの問題(ナンプレ)を入力させたくC+でコードを稚拙にも書いていたのですが、うまく動かず(コンパイルエラー)こちらで質問させて頂きました。

意図としてはmainでsetdata,readdataを使い、問題を文字行か単文字を入力、読み込ませたいところです.

check関数、bactr関数は問題を解く関数ですので、ここは手を加えなくても大丈夫かと思います。

setdata、readdata、mainの直すべきところ、アドバイスを教えていただきたいです。

入力例ファイル

100700600
020000050
003009000
700400008
000050020
000006100
402100700
000007080
600020009

#include<iostream> #include <fstream> #include <string> using namespace std; #define ROWS 3 // ブロックサイズ #define COLS 3 #define M (ROWS*COLS) // 問題図の大きさ int mat[M][M]; // 0:空きマス,1~9:確定数字 int check( int row, int col, int k) // mat[row][col] に k を置けるか? { int rowBlock, colBlock; int xrow, xcol; for( xrow=0; xrow< M; xrow++) { // 同じ行にkが使われていないか? if( mat[xrow][col] == k) return 0; } for( xcol=0; xcol< M; xcol++) { // 同じ列にkが使われていないか? if( mat[row][xcol] == k) return 0; } // 同じブロックにkが使われていないか? rowBlock = row/ROWS*ROWS; colBlock = col/COLS*COLS; for( xrow=0; xrow<ROWS; xrow++) { for( xcol=0; xcol< COLS; xcol++) { if( mat[rowBlock+xrow][colBlock+xcol] == k){ return 0; } } } return 1; } void printdata() { for( int row=0; row< M; row++) { for( int col=0; col< M; col++) { cout<<mat[row][col]<<" "<<endl; } cout<<endl; } } void backtr( int p) // 調査位置p { if( p >= M*M) {//調査完了 cout<< "見つけた"<<endl; printdata(); // 解答図を出力する return; } int row, col, k; row = p/M; // 調査位置pを[行][列]に変換 col = p%M; if( mat[row][col]) { backtr( p+1); } else { for( k=1; k<= M; k++) { if( check( row, col, k)) { mat[row][col] = k; backtr( p+1); mat[row][col] = 0; } } } } int setdata( int row, char s) // 指定行に問題を入力 { int col = 0; while(s && col < M) { if( s == '0') {//マス未確定の時 mat[row][col++] = 0; } else if( s >= '1' && s <= '9'){//確定マス入力 mat[row][col++] = s - '0'; } else { cout<<"データ文字を認識出来ません"<<endl; return 1; } s++; } if( s && col != M) { cout<<"列数(%d)が合いません"<<endl; return 1; } return 0; } int readdata( string fin) { ifstream fin("input.dat"); if(fin.fail()){ cout << "入力ファイルをオープンできません" << endl; return 1; } string s; int row = 0; while( s=tf.gets()) { if( setdata(row,s) == 1) return 1; row++; } if( row != M) { cout<<( "行数(%d)が合いません。期待値(%d)")<<endl; return 1; } return 0; } int main(int argc, const char* argv[]) { Option opt( argc, argv); cstring fn = opt.argv(0); if( !*fn) { cout<<( "データファイルを指定して下さい")<<endl; exit(0); } if( readdata(fn)) { // 問題図読み込み printdata(); // 問題図出力 backtr(0); //[0][0]から虱潰しで検索する(バックトラック呼び出し) } return 0; }

以下修正後です

#include<iostream> #include <fstream> #include <string> using namespace std; #define ROWS 3 // ブロックサイズ #define COLS 3 #define M (ROWS*COLS) // 問題図の大きさ int mat[M][M]; // 0:空きマス,1~9:確定数字 int check( int row, int col, int k) // mat[row][col] に k を置けるか? { int rowBlock, colBlock; int xrow, xcol; for( xrow=0; xrow< M; xrow++) { // 同じ行にkが使われていないか? if( mat[xrow][col] == k) return 0; } for( xcol=0; xcol< M; xcol++) { // 同じ列にkが使われていないか? if( mat[row][xcol] == k) return 0; } // 同じブロックにkが使われていないか? rowBlock = row/ROWS*ROWS; colBlock = col/COLS*COLS; for( xrow=0; xrow<ROWS; xrow++) { for( xcol=0; xcol< COLS; xcol++) { if( mat[rowBlock+xrow][colBlock+xcol] == k){ return 0; } } } return 1; } void printdata() { for( int row=0; row< M; row++) { for( int col=0; col< M; col++) { cout<<mat[row][col]<<" "; } cout<<endl; } } void backtr( int p) // 調査位置p { if( p >= M*M) {//調査完了 cout<< "find"<<endl; printdata(); // 解答図を出力する return; } int row, col, k; row = p/M; // 調査位置pを[行][列]に変換 col = p%M; if( mat[row][col]) { backtr( p+1); } else { for( k=1; k<= M; k++) { if( check( row, col, k)) { mat[row][col] = k; backtr( p+1); mat[row][col] = 0; } } } } int setdata(int row, string s){// 指定行に問題を入力 if(s.size() != M){ cout<<"Number of columns(" << s.size() << ")not fit"<<endl; return 1; } for(int col = 0; col < M; col++) { if (s[col] >= '0' && s[col] <= '9') { mat[row][col] = s[col] - '0'; } else { cout<<"Unable to recognize data characters"<<endl; return 1; } } return 0; } int readdata(string name) { ifstream fin("input.dat"); if(fin.fail()){ cout << "Unable to open input file" << endl; return 1; } string s; int row = 0; while (getline(fin, s)) { if( setdata(row,s) == 1) return 1; row++; } if( row != M) { cout<<"The number of lines does not match. Expected value "<<endl; return 1; } return 0; } int main(int argc, const char* argv[]) { if(argc != 2) { cout<<"Please specify the data "<<endl; exit(0); } if (!readdata(argv[1])) { // 問題図読み込み printdata(); // 問題図出力 backtr(0); //[0][0]から虱潰しで検索する(バックトラック呼び出し) } return 0; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

diff

1- cout<<mat[row][col]<<" "<<endl; 2+ cout<<mat[row][col]<<" "; 3 4-int setdata( int row, char s) // 指定行に問題を入力 5+int setdata(int row, string s) // 指定行に問題を入力 6 7- int col = 0; 8- while(s && col < M) { 9- if( s == '0') {//マス未確定の時 10- mat[row][col++] = 0; 11- } 12- else if( s >= '1' && s <= '9'){//確定マス入力 13- mat[row][col++] = s - '0'; 14+ if(s.size() != M) { 15+ cout<<"列数(" << s.size() << ")が合いません"<<endl; 16+ return 1; 17+ } 18+ 19+ for (int col = 0; col < M; col++) { 20+ if (s[col] >= '0' && s[col] <= '9') { 21+ mat[row][col] = s[col] - '0'; 22 } 23 else { 24 cout<<"データ文字を認識出来ません"<<endl; 25 return 1; 26 } 27- s++; 28- } 29- if( s && col != M) { 30- cout<<"列数(%d)が合いません"<<endl; 31- return 1; 32 } 33 return 0; 34 } 35 36-int readdata( string fin) 37+int readdata(string name) 38 39- ifstream fin("input.dat"); 40+ ifstream fin(name); 41 42- while( s=tf.gets()) { 43+ while (fin >> s) { 44 45- Option opt( argc, argv); 46- cstring fn = opt.argv(0); 47- 48- if( !*fn) { 49+ if (argc != 2) { 50 51- if( readdata(fn)) { // 問題図読み込み 52+ if (!readdata(argv[1])) { // 問題図読み込み

入力例(input.dat の内容) を質問に追記してください。

追記
while (fin >> s) { の代わりに while (getline(fin, s)) { でも
かまわないんですが、いかがでしょうか?

投稿2020/11/08 19:28

編集2020/11/08 23:45
kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

7sstrictly

2020/11/08 19:37

コメントありがとうございます。追記させて頂きました。
7sstrictly

2020/11/09 02:27 編集

追記:コードはC+で動けば変更していただいても大丈夫です...!!
kazuma-s

2020/11/09 02:31

言語名は、C+ ではなく、C++ です。 私の示した修正方法は試してみたんですか?
7sstrictly

2020/11/09 04:38

C++でした. kazuma-s様のおかげでコンパイルを通すことは出来ました。ありがとうございます! しかし、実行しますと "データファイルを指定して下さい" と出てしまいました。 問題を解決するために調べたところ、input.datをinput.txtに変更する、input.datを同じフォルダに入れる等行いましたが変わらず...といったところです. OSはwin10、visual studio code なのですが、ここが変だというところを教えていただきたいです... お願いします.
7sstrictly

2020/11/09 16:47 編集

launch.jsonはデバッグの設定でしたよね、うまく設定できていないのでまた出来たらお返事させていただきます...(; ;)
kazuma-s

2020/11/09 17:42 編集

それでは、とりあえず次の修正で結果が出るのを確認してみてください。 if( !*fn) { を if (0) { に。 if( readdata(fn)) { を if (!readdata("input.dat")) { に。
7sstrictly

2020/11/09 19:24

出来ました!!!!本当にありがとうございます!!! 肝心な数独の実装ではなく、入出力で困っていて途方に暮れていましたが、kazuma-s様のお力をお借りして動かすことが出来ました(; ;)C++の入出力にも試行錯誤することで学ぶことが出来ました 本当にうれしいです...まだまだ本当に未熟ではありますが、もっと力を付けれるように頑張ります...!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問