2012-10-16 42 views
1

我的手上有一个非常简单的Ada项目。其任务是收集“选民”选票并将其与每个“候选人”分数进行比较,并确定哪个候选人与选民最匹配。卡住Ada计划 - 卡住输入

输入看起来是这样的,其次是被赶出输出:

Input: 
0 0 0 1 1 1 -1 -1 -1 1 
7 
A 
1 1 1 1 1 1 1 1 1 1 
B 
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 
C 
1 -1 1 -1 1 -1 1 -1 1 -1 
D 
1 0 1 0 1 0 1 0 1 0 
E 
0 -1 0 -1 0 -1 0 -1 0 -1 
F 
1 1 1 1 0 0 0 0 0 0 
G 
0 0 0 1 -1 0 0 -1 1 1 

Output: 

A 
F 
G 

到目前为止,我将采取每个候选人的选票,并比较他们的投票程序选民。我知道我需要做什么,因为我之前用Java做过,但我不确定我应该如何在Ada中进行输入。这是我到目前为止。

with Ada.Text_IO, Ada.Integer_Text_IO; 
use Ada.Text_IO, Ada.Integer_Text_IO; 

procedure Candidates is 
-- take an array of candidates and determine which candidate best matches 
-- the user's votes, then return those candidates 
    Number_Of_Candidates: Integer; 
subtype VoterArray_Index is Integer range 1..10; 
subtype CandidatesArray_Index is Integer range 1..Number_Of_Candidates; 
type VoterArray is array(VoterArray_Index) of Integer; 
type CandidatesArray is array(Character range 'A' .. 'Z') of array; 
type Best_CandidatesArray is array(CandidatesArray_Index) of array; 

Voter: VoterArray; 
Candidates: CandidatesArray; 
Best_Candidates: Best_CandidatesArray; 

function Get_Input() is 
-- get the input and put it into the correct arrays 
    Current_Line : string; 

    begin 
     Get(Current_Line); 

function Get_Best_Score(CandidatesArray: in out CandidatesArray) is 
-- go through the arrays and find the best score 
    SameAnswers: Integer; 
    DifferentAnswers: Integer; 
    BestScore: Integer; 
    subtype CandidateArray is array(VoterArray_Index) of Integer; 
    Candidate: CandidateArray; 

    begin 
     for I in CandidatesArray_Index loop 
      Candidate := Candidates(I); 
      for J in VoterArray_Index loop 
       if Candidate(J) /= 0 and Voter(J) /= 0 then 
        if Candidate(J) /= Voter(J) then 
            DifferentAnswers     :=     DifferentAnswers + 1 
        else 
         SameAnswers := SameAnswers + 1 
        end if; 
       end if; 
      end loop; 
      if SameAnswers - DifferentAnswers >= BestScore then 
       Best_Candidates(I) := Candidate; 
      end if; 
      SameAnswers := 0; 
      DifferentAnswers := 0; 
     end loop; 
    end Get_Best_Score; 

正如你所看到的,我不知道如何把这些数字放到一个数组中。如果你有任何建议或不同的方式,我应该去做的事情,我都听过。

在此先感谢。

+0

你需要从文件中读取输入?行数似乎是内在的;是__ priori_中已知行的条目数? – trashgod

+0

输入将从文件读取,是的。它将以我在我的帖子中获得的格式给出。我也会知道行数。 – user1704677

回答

3

你可以使用流,以便读取数据: Integer'Read(STREAM_HANDLE, VARIABLE)

另一种选择是通过GET读取值的阵列中的每个元素,我建议的情况下,一个辅助功能,你需要调整程序,用于处理格式的变化:

Function Get_Vote (File : File_Type) Return Integer is 
    begin 
     Return Result : Integer do 
      Integer_IO.Get(
       File => File, 
       Item => Result 
       ); 
     End return; 
    end Read_Votes; 

For Index in VOTE_ARRAY'range loop 
    VOTE_ARRAY(Index) := Get_Vote(INPUT_FILE); 
End loop; 
+0

谢谢。这帮了我很多。 – user1704677

1

由于行的数量在第给出e文件,constrained array必须足够大以容纳所有可能的元素。相反,你可以声明unconstrained array

subtype Voter_Index is Positive range 1 .. 10; 
type Voter_Array is array(Voter_Index) of Integer; 
type Candidate_Array is array(Character range <>) of Voter_Array; 

后来,当你知道实际计数,你只能分配实际需要的阵列空间。此声明在一个nested scope放堆栈上Candidates

Number_Of_Candidates := ...; 
declare 
    Candidates : Candidate_Array(
     'A' .. Character'Val(Character'Pos('A') + Number_Of_Candidates)); 
begin 
    ... 
end; 

或者,可以allocate space on the heap

type Candidate_Array_Ptr is access Candidate_Array; 
Candidates: Candidate_Array_Ptr; 

begin 
    Number_Of_Candidates := ...; 
    Candidates := new Candidate_Array(
    'A' .. Character'Val(Character'Pos('A') + Number_Of_Candidates)); 
end; 

在任一情况下,可以访问根据需要的数组元素:

for i in Candidates'Range loop 
    for j in Voter_Array'Range loop 
     Ada.Integer_Text_IO.put(Candidates(i)(j), 5); 
    end loop; 
    Ada.Text_IO.New_Line; 
end loop; 

附录:此方法假定候选名称是连续的Character s。作为替代方案,考虑Candidate_Record,其中每个Name从文件中读取一个数组:

type Candidate_Record is 
    record 
     Name : Character; 
     Votes : Voter_Array; 
    end record; 
type Candidate_Array is array(Positive range <>) of Candidate_Record; 

Candidates : Candidate_Array(1 .. Number_Of_Candidates); 

for i in Candidates'Range loop 
    Ada.Text_IO.Put(Candidates(i).Name & ':'); 
    for j in Voter_Array'Range loop 
     Ada.Integer_Text_IO.Put(Candidates(i).Votes(j), 5); 
    end loop; 
    Ada.Text_IO.New_Line; 
end loop;