#include<stdio.h>程式框直接輸出第一個頂點:第二個頂點:第三個頂點:第四個頂點:第五個頂點:并且不執行Outlin函式,只有vc630可以正常輸入輸出 試了其他好多編譯器卻不行,求解
#include<stdlib.h>
#define VERTEX_MAX 26 //圖的最大頂點數
#define MAXVALUE 32767 //最大值(可設為一個最大整數)
typedef struct
{
int Vertex[VERTEX_MAX]; //保存頂點資訊(序號或字母)
int Edges[VERTEX_MAX][VERTEX_MAX]; //保存邊的權
int isTrav[VERTEX_MAX]; //遍歷標志
int VertexNum; //頂點數量
int EdgeNum;//邊數量
int GraphType; //圖的型別(0:無向圖,1:有向圖)
}MatrixGraph; //定義鄰接矩陣圖結構
void Createlin(MatrixGraph *G);//創建鄰接矩陣圖
void Outlin(MatrixGraph *G); //輸出鄰接矩陣
void Createlin(MatrixGraph *G)//創建鄰接矩陣圖
{
int i, j, k, weight;
int s, e;//邊的起始頂點
printf("輸入各頂點資訊\n");
for (i = 0; i<G->VertexNum; i++) //輸入頂點
{
printf("第%d個頂點:", i);
scanf("%d", &(G->Vertex[i])); //保存到各頂點陣列元素中
}
printf("輸入構成各邊的兩個頂點及權值(用逗號分隔):\n");
for (k = 0; k<G->EdgeNum; k++) //輸入邊的資訊
{
printf("第%d條邊:", k + 1);
scanf("%d,%d,%d", &s, &e, &weight);
for (i = 0; s != G->Vertex[i]; i++); //在已有頂點中查找始點
for (j = 0; e != G->Vertex[j]; j++); //在已有頂點中查找結終點
G->Edges[i][j] = weight; //對應位置保存權值,表示有一條邊
if (G->GraphType == 0) //若是無向圖
G->Edges[j][i] = weight;//在對角位置保存權值
}
}
void Outlin(MatrixGraph *G)//輸出鄰接矩陣
{
int i, j;
for (j = 0; j<G->VertexNum; j++)
printf("\t%d", G->Vertex[j]); //在第1行輸出頂點資訊
printf("\n");
for (i = 0; i<G->VertexNum; i++)
{
printf("%d", G->Vertex[i]);
for (j = 0; j<G->VertexNum; j++)
{
if (G->Edges[i][j] == MAXVALUE) //若權值為最大值
printf("\t∞"); //輸出無窮大符號
else
printf("\t%d", G->Edges[i][j]); //輸出邊的權值
}
printf("\n");
}
}
int main()
{
MatrixGraph G; //定義保存鄰接矩陣結構的圖
int i, j;
printf("輸入生成圖的型別(0:無向圖,1:有向圖):");
scanf("%d", &G.GraphType); //圖的種類
printf("輸入圖的頂點數量和邊數量:");
scanf("%d,%d", &G.VertexNum, &G.EdgeNum); //輸入圖頂點數和邊數
for (i = 0; i<G.VertexNum; i++) //清空矩陣
for (j = 0; j<G.VertexNum; j++)
G.Edges[i][j] = MAXVALUE; //設定矩陣中各元素的值為最大值
Createlin(&G); //創建用鄰接表保存的圖
printf("鄰接矩陣資料如下:\n");
Outlin(&G);
getch();
return 0;
}
uj5u.com熱心網友回復:
printf里面的%和變數的一一對應關系scanf里面的%和變數以及變數前加不加&的一一對應關系
是C代碼中非常容易出錯的地方,而且通常編譯還不出錯。
所以在編譯源代碼之前值得專門仔細檢查一遍甚至多遍。
uj5u.com熱心網友回復:
在每個最后不帶\n的printf后面加fflush(stdout);在每個不想受接識訓沖區舊內容影響的scanf前面加rewind(stdin);
另外請檢查scanf的回傳值。
//請今后要用
int c;
scanf("%c",&c);
//時,都改為
char s[2];
int c;
scanf("%1s",s);
c=s[0];
uj5u.com熱心網友回復:
不明白什么叫無法輸入,自己檢查:1.可以查看scanf的回傳值,看看成功讀取了幾個變數
2.scanf("%d,%d"這樣的寫法意味著你輸入的時候必須用逗號來分隔2個數字(不能用空格)
3.可能是別的地方的錯誤導致了你得不到正確的結果(單步除錯和設斷點除錯(VS IDE中編譯連接通過以后,按F10或F11鍵單步執行,按Shift+F11退出當前函式;在某行按F9設斷點后按F5執行停在該斷點處。)是程式員必須掌握的技能之一。)
uj5u.com熱心網友回復:
就是scanf本來是我要在鍵盤上輸入值的 但是現在程式運行時根本不給我輸入的機會 沒辦法看回傳值啊uj5u.com熱心網友回復:
你的編譯器有問題吧。我這里VS是可以正確輸入的
http://blog.csdn.net/cometnet/article/details/19551125
uj5u.com熱心網友回復:
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。你不說我倒沒想起來 這個東西我前幾周寫過 運行是對的 我一般對的程式和錯的程式有分類 今天第一次試是對的 然后就一直奔潰!!uj5u.com熱心網友回復:
#include<stdio.h>
#include<stdlib.h>
#define VERTEX_MAX 26 //圖的最大頂點數
#define MAXVALUE 32767 //最大值(可設為一個最大整數)
typedef struct
{
int Vertex[VERTEX_MAX]; //保存頂點資訊(序號或字母)
int Edges[VERTEX_MAX][VERTEX_MAX]; //保存邊的權
int isTrav[VERTEX_MAX]; //遍歷標志
int VertexNum; //頂點數量
int EdgeNum;//邊數量
int GraphType; //圖的型別(0:無向圖,1:有向圖)
}MatrixGraph; //定義鄰接矩陣圖結構
void Createlin(MatrixGraph *G);//創建鄰接矩陣圖
void Outlin(MatrixGraph *G); //輸出鄰接矩陣
void Createlin(MatrixGraph *G)//創建鄰接矩陣圖
{
int i, j, k, weight;
int s, e;//邊的起始頂點
printf("輸入各頂點資訊\n");
for (i = 0; i<G->VertexNum; i++) //輸入頂點
{
printf("第%d個頂點:", i);
scanf("%d", &(G->Vertex[i])); //保存到各頂點陣列元素中
}
printf("輸入構成各邊的兩個頂點及權值(用逗號分隔):\n");
for (k = 0; k<G->EdgeNum; k++) //輸入邊的資訊
{
printf("第%d條邊:", k + 1);
printf("Please input three wight separated by comma(,): ");
scanf("%d,%d,%d", &s, &e, &weight);
for (i = 0; s != G->Vertex[i]; i++); //在已有頂點中查找始點
for (j = 0; e != G->Vertex[j]; j++); //在已有頂點中查找結終點
printf("i = %d, j = %d\n", i, j);
G->Edges[i][j] = weight; //對應位置保存權值,表示有一條邊
if (G->GraphType == 0) //若是無向圖
G->Edges[j][i] = weight;//在對角位置保存權值
}
}
void Outlin(MatrixGraph *G)//輸出鄰接矩陣
{
int i, j;
for (j = 0; j<G->VertexNum; j++)
printf("\t%d", G->Vertex[j]); //在第1行輸出頂點資訊
printf("\n");
for (i = 0; i < G->VertexNum; i++)
{
printf("%d", G->Vertex[i]);
for (j = 0; j < G->VertexNum; j++)
{
if (G->Edges[i][j] == MAXVALUE) //若權值為最大值
printf("\t∞"); //輸出無窮大符號
else
printf("\t%d", G->Edges[i][j]); //輸出邊的權值
}
printf("\n");
}
}
int main()
{
MatrixGraph G; //定義保存鄰接矩陣結構的圖
int i, j;
printf("輸入生成圖的型別(0:無向圖,1:有向圖):");
scanf("%d", &G.GraphType); //圖的種類
printf("輸入圖的頂點數量和邊數量:(separated by comma(,): )");
scanf("%d,%d", &G.VertexNum, &G.EdgeNum); //輸入圖頂點數和邊數
for (i = 0; i<G.VertexNum; i++) //清空矩陣
for (j = 0; j<G.VertexNum; j++)
G.Edges[i][j] = MAXVALUE; //設定矩陣中各元素的值為最大值
Createlin(&G); //創建用鄰接表保存的圖
printf("鄰接矩陣資料如下:\n");
Outlin(&G);
//getch();
return 0;
}
需要注意兩個方面:1)輸入時注意需要加逗號,因為你的scanf中要求輸入逗號了,類似這樣輸入1,2才可以;
2)看到你的程式出現段錯誤了。出現在 G->Edges[i][j] = weight;這行,原因是越界。有向圖和無向圖,我也不懂,我隨便輸入的,就出現了陣列越界。我通過這句上面加的一句除錯資訊,看到i,j已經超出26了。你自己注意看一下。對于非法的輸入,建議你做判斷校驗,另外,對i,j超出做判斷,這樣不會越界出現段錯誤。
uj5u.com熱心網友回復:
http://bbs.csdn.net/topics/390471779uj5u.com熱心網友回復:
請問這個問題解決了嗎,我也遇到了uj5u.com熱心網友回復:
應該沒問題,VS2015 C++環境
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/221204.html
標籤:C語言
