2014-12-10 5 views
1

У меня проблема в PAscal. Я хочу, чтобы сосчитать простые числа, но нет результата: Мой код:Количество простых чисел из массива в Pascal

Program arrayToFunction; 
const 
size = 5; 
type 
    a = array [1..size] of integer; 
var 
aNumbers: a = (1, 7, 3, 4, 5); 
iCountNumbers: integer; 
function countPrimeNumbers(var arr: a) : integer; 
    var 
    i :0..size; 
    sum,j,count: integer; 
    begin 
    sum := 0;count:=0; 
    for i := 0 to size do 
    begin 
     for j := 2 to arr[i] do 
      begin 
       if(arr[i] mod j = 0) then sum:=1; 
      end; 
     if(sum=0) then count:=count+1; 

    end; 
countPrimeNumbers := count; 
end; 
begin 
iCountNumbers := countPrimeNumbers(aNumbers) ;*) 
    writeln('Numbers: ', iCountNumbers); 
    readln; 
end. 

Для этого массива, я хочу, чтобы получить 3, но я получаю 2 ... Я не понимаю, где моя проблема. Помогите мне пожалуйста

+0

Основная проблема, поскольку я вижу, что вы не повторно инициализируете переменную 'sum', поэтому после того, как значение' sum' станет равным 1, оно всегда будет равно 1. Добавьте 'sum: = 0;' after 'if (sum = 0), тогда count: = count + 1; '. Но есть и некоторые ошибки в коде. Например, индекс вашего массива начинается с 1, но цикл 'for i: = 0 до size do' начинается с 0, поэтому на первой итерации вы будете иметь ошибку в' arr [i] '. – Abelisto

+0

Прошло некоторое время с тех пор, как я сделал какой-либо паскаль (34 года), но либо индекс начинается с нуля, либо один. И вы используете оба. Поэтому я бы догадался, что проблема в том, что проблема – Vorsprung

+1

Это было бы замечательное время, чтобы научиться использовать отладчик. Очень маловероятно, BTW, что вы используете Free Pascal, Pascal Script и Turbo Pascal в одно и то же время, так как они нигде не совместимы с кодом, который вы написали. Добавляйте только теги, которые * на самом деле применяют * к вашему вопросу, - не просто произвольно добавляйте те, которые кажутся похожими. В этом случае они выглядят как «pascal» и «freepascal» или «pascal» и «turbo-pascal» (но не все). –

ответ

4

У вас есть type a = array [1..size] of integer;, но затем вы перебираете массив, используя for i := 0 to size. Подстрочный индекс должен соответствовать объявленному диапазону.

Перед тем, как войти в этот цикл, вы установили sum := 0;, но никогда не устанавливали его снова на ноль. Как только вы найдете не-прайм, вы установите sum := 1;, и там он останется. Вы никогда не обнаружите штрих, как только вы обнаружите не-прайм.

Эти два штриха, которые вы нашли, были любыми мусорами на arr[0], а 1 на arr[1]. Обратите внимание, что не является простым, но ваш код завершает его. является простым, но ваш код будет думать, что это не так, потому что он в конце концов заметит, что он делится сам по себе.

+0

Можете ли вы изменить мой код, пожалуйста? Я отредактировал, но не работает –

+0

Подождите, вы хотите, чтобы я написал вашу программу для вас? Вы уверены, что это не домашнее задание? – ganbustein

+1

@Harea: Нет, никто здесь не будет * редактировать вашу программу * для вас. Вам была предоставлена ​​информация, необходимая для решения проблемы. Теперь вам нужно использовать его. –

Смежные вопросы