2014-07-08 40 views
-2

爲了獲得樂趣並查看性能差異,我將不同語言的小腳本進行了轉換。GNU R:在while循環中的平等

但是我有GNU R A問題:

#!/usr/bin/Rscript 

nbOperationsSuiteSyracuse <- function(nb) 
{ 
    nb <- as.integer(nb) 

    if(nb == 1) 
     return(0) 

    nbOperations <- 1 
    while(nb != 1) 
    { 
     if(nb %% 2 == 0) 
      nb <- nb/2 
     else 
      nb <- nb * 3 +1 
     nbOperations <- nbOperations + 1 
    } 
    return(nbOperations) 
} 


nbUtilisateur <- 0 
if(length(commandArgs()) > 0) 
    nbUtilisateur <- as.integer(commandArgs()[1]) 
while(nbUtilisateur == 0) 
    nbUtilisateur <- as.integer(readline('Saississez un nombre entier positif non nul : ')) 
cat('Le résultat pour ', nbUtilisateur, ' est ', nbOperationsSuiteSyracuse(nbUtilisateur), '\n') 

nbUtilisateur <- 0 
if(length(commandArgs()) > 1) 
    nbUtilisateur <- as.integer(commandArgs()[2]) 
while(nbUtilisateur == 0) 
    nbUtilisateur <- as.integer(readline('Nombre de nombres (entier positif non nul) : ')) 
somme <- 0 
for(i in 1 : nbUtilisateur) 
{ 
    nbResultat <- nbOperationsSuiteSyracuse(i) 
    cat('La suite de syracuse pour ', i, ' est ', nbResultat) 
    somme <- somme + nbResultat 
} 
cat('La somme de 1 à ', nbUtilisateur, ' est ', somme) 
cat('La moyenne de 1 à ', nbUtilisateur, ' est ', somme/nbUtilisateur) 

在其自動轉換,R說我有是第一的問題,而不是在功能,因爲TRUE或FALSE需要。我不明白這個問題。

如果有幫助,這是一個功能性等價物的C++代碼:

#include<iostream> 
#include<cstdlib> 

unsigned int nbOperationsSuiteSyracuse(unsigned int nb) 
{ 
    if(nb == 1) 
     return 0; 

    unsigned int nbOperations = 1; 
    while(nb != 1) 
    { 
     if(nb % 2 == 0) 
      nb /= 2; 
     else 
      nb = nb * 3 +1; 
     ++nbOperations; 
    } 
    return nbOperations; 
} 


int main(int argc, char** argv) 
{ 
    unsigned int nbUtilisateur = 0; 
    if(argc > 1) 
     nbUtilisateur = strtoul(argv[1], NULL, 0); 
    while(nbUtilisateur == 0) 
    { 
     std::cout << "Saississez un nombre entier positif non nul : "; 
     std::cin >> nbUtilisateur; 
    } 
    std::cout << "Le résultat pour " << nbUtilisateur << " est " << nbOperationsSuiteSyracuse(nbUtilisateur) << std::endl << std::endl; 

    nbUtilisateur = 0; 
    if(argc > 2) 
     nbUtilisateur = strtoul(argv[2], NULL, 0); 
    while(nbUtilisateur == 0) 
    { 
     std::cout << "Nombre de nombres (entier positif non nul) : "; 
     std::cin >> nbUtilisateur; 
    } 
    unsigned int somme = 0; 
    for(unsigned int i = 1; i <= nbUtilisateur; ++i) 
    { 
     unsigned int nbResultat = nbOperationsSuiteSyracuse(i); 
     std::cout << "La suite de syracuse pour " << i << " est " << nbResultat << std::endl; 
     somme += nbResultat; 
    } 
    std::cout << "La somme de 1 à " << nbUtilisateur << " est " << somme << std::endl; 
    std::cout << "La moyenne de 1 à " << nbUtilisateur << " est " << ((double) somme/nbUtilisateur) << std::endl; 

    return EXIT_SUCCESS; 
} 

感謝。

+0

哪一個是第一個while循環?第一個運行?第一個定義?目前還不清楚你可能從命令行輸入什麼,所以我不確定數據是什麼。看起來你應該能夠做到這一點,以進一步本地化錯誤。當然,並不是所有的代碼都是相關的。 – MrFlick

+0

第一個循環是while(nbUtilisateur == 0) – RyDroid

回答

0

在這裏尋找答案:http://r.789695.n4.nabble.com/Wait-for-user-input-with-readline-tp3054517p4578455.html

R不是等待你的readline S,它只是強制轉換到NA。

+0

問題出在readline之前。 「ERREUR丹斯而(nbUtilisateur == 0){:valeur manquanteLàOùTRUE/FALSE EST requis」(法國) – RyDroid

+0

這會導致同樣的問題: 而(nbUtilisateur == 0){ \t nbUtilisateur < - readline的(」 Saississez un nombre entier positif non nul:') \t nbUtilisateur < - as.integer(nbUtilisateur) } – RyDroid