【解決方法】この C++ プログラムを C プログラムに変換する方法は?

プログラミングQA


以下は C++ プログラムです。 Cに変換するのを手伝ってください。また、Linuxと互換性がある必要があります。

私が試したこと:

<pre>// A C++ program to print topological sorting of a DAG 
#include <iostream> 
#include <list> 
#include <stack> 
using namespace std; 

class Graph 
{ 
	int V; 

	list<int> *adj; 


	void topologicalSortUtil(int v, bool visited[], stack<int> &Stack); 
public: 
	Graph(int V); 
	void addEdge(int v, int w); 

	
	void topologicalSort(); 
}; 

Graph::Graph(int V) 
{ 
	this->V = V; 
	adj = new list<int>[V]; 
} 

void Graph::addEdge(int v, int w) 
{ 
	adj[v].push_back(w);  
} 
 
void Graph::topologicalSortUtil(int v, bool visited[], 
								stack<int> &Stack) 
{ 
	
	visited[v] = true; 

	list<int>::iterator i; 
	for (i = adj[v].begin(); i != adj[v].end(); ++i) 
		if (!visited[*i]) 
			topologicalSortUtil(*i, visited, Stack); 

	Stack.push(v); 
} 


void Graph::topologicalSort() 
{ 
	stack<int> Stack; 

	// Mark all the vertices as not visited 
	bool *visited = new bool[V]; 
	for (int i = 0; i < V; i++) 
		visited[i] = false; 
 
	for (int i = 0; i < V; i++) 
	if (visited[i] == false) 
		topologicalSortUtil(i, visited, Stack); 

	
	while (Stack.empty() == false) 
	{ 
		cout << Stack.top() << " "; 
		Stack.pop(); 
	} 
} 

 
int main() 
{ 
	
	int n,v1,v2;
	cin>>n;
	Graph g(n); 
	for(int i=1;i<=n;i++)
    {	cin>>v1>>v2;
	g.addEdge(v1, v2);} 
	

	cout << " Topological Sort of the given graph \n"; 
	g.topologicalSort(); 

	return 0; 
}

解決策 1

これはコード変換サービスではありません。コードを翻訳するためにここにいるわけではありません。
仮にそうしたとしても、最終的にターゲット言語の「良いコード」にはなりません。それらは非常に異なるフレームワークに基づいており、ある言語で何かを機能させるものが必ずしも別の言語に直接「翻訳」されるとは限りません。
そのため、最終的には非常に貧弱なコードになり、メンテナンスが不可能ではないにしても難しく、適切にアップグレードできず、元のコードが変更された場合に大きな頭痛の種になります。 そして、「箱から出してすぐに」機能しない場合、デバッグするのは悪夢です。
代わりに、ソース コードを新しいアプリの仕様とターゲット言語/フレームワークの仕様として使用し、オリジナルを “テンプレート” として使用してゼロから記述します。 はるかに優れた結果が得られ、長期的には多くの時間を節約できます。

正直なところ、そのコードの C++ 固有の機能を C で動作させるには、非常に多くの作業を行う必要があり、完了するまでに宿題の締め切りはとっくに過ぎていたでしょう。 また、コードは、関連する「ネイティブ C」プログラムよりもおそらく数百倍大きくなります。

解決策 2

これは初心者向けの演習ではありませんので、ある程度の経験があることを前提としています。 このサイト[^] C++ と C ライブラリの両方をカバーしているため、役立つはずです。

#include は C++ STL からのものであるため、それらを削除した後にコードを機能させる必要があります。 したがって、Cの同等物が必要です iostreamstacklist、および (メモリの割り当て用) new.

に相当する C iostreamstdio.h、代わりを見つける必要がある場所 cincout.

に相当する C newmalloc. 元のコードは気にしません delete[] それが割り当てる配列ですが、それと同等のCは free 拡張機能として追加する場合。

スタックとリスト (双方向リンク リスト) を実装するには、十分な経験が必要です。 スタックは関数をサポートする必要があります emptytoppush、 と pop. あなたのリストは機能をサポートする必要があります push_backbegin、 と end. 不思議なことに、元のコードは vector、これらの関数もサポートしていますが、より単純です (動的に拡張可能な配列のみ)。

どのオペレーティング システムにも固有のものは見当たりません。そのため、概要を説明した作業が完了すると、コードは Linux、Windows、またはどこでも正常に動作するはずです。

解決策 3

を含める
// map ライブラリは、C++ コードで map を使用するために含まれています
#含む

// 文字列ヘッダーもコードに含まれており、C++ コードで文字列オブジェクトを利用できます
#include <文字列>

名前空間 std を使用します。

// 文字列によってインデックス付けされた文字列を格納するマップ オブジェクトが作成されます (つまり、キーと値の両方が文字列型になります)。
// 注: C++ では、マップまたは辞書オブジェクトに格納されるキーと値のデータ型を明示的に指定する必要があります
std::map 大文字;

// insert_elements という名前の関数が作成され、capitals という名前のマップまたは辞書オブジェクトに要素が追加されます
ボイドinsert_elements(){

std::string キー;
std::文字列値;

std::cout<<"\n国名を入力してください: ";
std::cin>>キー;
std::cout<<""< =”” std::cin=””>>値;

// 値はキーにマップされ、capitals という名前のマップまたは辞書オブジェクトに正常に挿入されます
大文字[key]=値;

}

// print_elements という名前の関数が、大文字辞書オブジェクトに存在するすべての要素に対して作成されます
ボイドprint_elements(){

// 辞書の大文字オブジェクトの各要素が繰り返され、出力されます
for ( 自動項目 : 大文字 ) {

std::cout <<"国名 "<< item.first << ": 首都名 ";
std::cout << item.second << std::endl;
}

}

// capits という名前のディクショナリ オブジェクトから要素を削除するために、delete_elements という名前の関数が作成されます
ボイドdelete_elements(){

std :: 文字列 key_to_be_deleted;

std :: cout << "\n削除したい国の名前を入力してください: ";
std :: cin >> key_to_be_deleted;

capitals.erase(key_to_be_deleted);

}

// search_elements という名前の関数が作成され、大文字の辞書オブジェクトで検索または検索操作を実行します
ボイド検索要素(){

std :: string key_to_be_searched;

std :: cout << "\n検索する国の名前を入力してください: ";
std :: cin >> key_to_be_searched;

std :: cout << ""<< key_to_be_searched << " の大文字は " << capitals[key_to_be_searched]<< "\n"; }

// update_elements という名前の関数が作成され、辞書オブジェクトに既に存在する要素を更新または変更するために update_elements が作成されます
ボイド update_elements(){

std :: string key_to_be_updated;
std :: 文字列 new_key;

std :: cout << "\n首都を更新したい国の名前を入力してください: ";
std :: cin >> key_to_be_updated;
std :: cout << "新しい大文字の名前を入力してください : ";
std :: cin >> new_key;

大文字[key_to_be_updated]=new_key;

}

// main 関数は、コードの実行を処理するために作成されます。
int main()
{

int 選択;

// メニュー方式のプログラムは、capitals という名前のディクショナリ オブジェクトに対してさまざまな操作を行うさまざまな関数を呼び出すように記述されています

ながら(1){

std::cout<<"\n1. データをディクショナリに挿入します。"< =”” std::cout<<"2.="" to="" print="" data="" from="" the="" dictionary."<>選択;

スイッチ(選択){

ケース 0 :

// コードを終了します。
終了 (0);

ケース 1 :

// 辞書オブジェクトに要素を挿入する
insert_elements();
壊す;

ケース 2 :

// 辞書オブジェクトの要素を出力する
std::cout<

コメント

タイトルとURLをコピーしました