好的,所以我是一個初學者程式員,所以非常感謝任何關于代碼任何部分的提示,但主要問題是為什么函式中的代碼在int longestSequence(int n,int array[n]);放在 main 中時可以作業,但在從函式呼叫時卻不行?
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
int longestSequence(int n,int array[n]);
int main()
{
int n;
scanf("%d", &n);
int mat[n][n];
for(int i = 0; i<n; i ){
for(int j = 0; j<n; j ){
scanf("%d", &mat[i][j]);
}
}
int arraySize = n*n;
int array[arraySize];
int arrayIndex = 0;
for(int i=0; i<n; i ){
if(i%2 == 0){
for(int j = 0; j<n; j ){
array[arrayIndex ] = mat[i][j];
}
}else{
for(int j = n-1; j>=0; j--){
array[arrayIndex ] = mat[i][j];
}
}
}
/// Here's the same code that works when in main
// int numOfSequental = 0;
// int maxNumOfSequental = INT_MIN;
// for(int i = 0; i<n; i ){
// if(niz[i] == (niz[i 1]-1)){
// numOfSequental ;
// if(numOfSequental>maxNumOfSequental){
// maxNumOfSequental = numOfSequental;
// }
// continue;
// }
// numOfSequental = 0;
// }
//calling the function in printf
printf("Length of the sequence: %d", longestSequence(arraySize, array[arraySize]));
return 0;
}
int longestSequence(int n,int array[n])
{
int numOfSequental = 0;
int maxNumOfSequental = INT_MIN;
for(int i = 0; i<n; i ){
if(array[i] == (array[i 1]-1)){
numOfSequental ;
if(numOfSequental>maxNumOfSequental){
maxNumOfSequental = numOfSequental;
}
continue;
}
numOfSequental = 0;
}
return maxNumOfSequental 1;
}
uj5u.com熱心網友回復:
“主要問題是為什么函式中的代碼
int longestSequence(int n,int array[n]);放在 main 中時可以作業,但從函式中呼叫時卻不行?”
正如所謂的,它不應該在任何一個地方作業。
printf("Length of the sequence: %d", longestSequence(arraySize, array[arraySize]));
// ^^^^^^^^^^^
return 0;
首先請注意,傳遞的索引:arraySize超出了 . 的合法索引array。在 C 中,索引是從零開始的,因此它來自0-arraySize - 1
更重要的是,盡管 的第二個引數longestSequence應該是指向陣列的指標,而不是陣列的索引元素。
printf("Length of the sequence: %d", longestSequence(arraySize, array));
return 0;
此外,一般來說,要將陣列中的后續數字與 sizen進行比較,比較范圍應限制為:
a[i] == a[i 1] //for i == 0 through i == n-1
改變:
for(int i = 0; i<n; i ){
// ^^^
if(array[i] == (array[i 1]-1)){//array out of bounds when i == n
// ^^^
到
for(int i = 0; i<n-1; i ){
// ^^^^^
if(array[i] == (array[i 1]-1)){//i will never reach n
編輯:最后一件事解決了關于使用 main 的第二個引數
替換呼叫的評論。scanf()首先,代碼必須包含 main: 的原型 int main(int argc, char *argv[]);。有了這個原型,從命令列呼叫的程式現在可以包含命令列引數,例如:如果在 Windows 中從 CMD 提示符運行:
C:\dev> myProg.exe 3 1 2 3 4 5 6 7 8 9
在您的程式中,然后argcargv[]` 的引數填充如下:
argc == 11 //total number of arguments
argv[0] == "myProg.exe" //program name is alway in argv[0]
argv[1] == "3"
argv[2] == "1"
...
argv[10] == "9"
這應該轉化為創建一個填充了 9 個后續值的 3x3 陣列。
因此,您的代碼中的第一條陳述句現在可以是:(在偽代碼中)
int n = atoi(argv[1]);//check value of n before using
int array[n][n];
int index = 2;
for(int i = 0; i<n ; i )
for(int j = 0; j<n ; j )
array[i][j] = atoi(argv[index]);
index ;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/417142.html
標籤:
