菜单价格+总价(帕斯卡)

时间:2015-10-23 08:58:50

标签: debugging freepascal

我的程序应该允许用户从菜单中选择冰淇淋,然后添加冰淇淋的价格以显示冰淇淋的总价。但是我的总价格输出是错误的。例如,如果我选择1和2,答案应该是1.5 + 1.7 = 3.2但我得到3.4。此外,如果我选择2我只会得到错误。请帮我。

program iceCream;

var
  count,i: integer;
  price:array[1..50]of real;
  totalPrice: real;
  choice: integer;

begin
  count:= 0;

  writeln ( ' ICE CREAM FLAVOUR');
  write ( ' 1.Vanilla: RM 1.50 |  3.Chocolate: RM 2.00');
  writeln;
  write ( ' 2. Strawberry: RM 1.70 | 0. Exit ');
  writeln;

  repeat
    write ( ' Enter your choice(number): ');
    readln ( choice);
    if choice <= 3 then
      count:= count+1
    else
      writeln ( 'Invalid choice');

    case choice of

      1: begin
           price[i]:= 1.50;
         end;

      2: begin
           price[i]:= 1.70 ;
         end;

      3: begin
           price[i]:= 2.00;
         end;

    end;

    for i:= 1 to count do
    begin
      totalPrice:= totalPrice+price[i];
    end;

  until choice = 0;

  writeln ( ' Total ice-cream: ', count);
  readln;
  writeln ( ' Total price: RM ', totalPrice:2:2);
  readln;

end.

1 个答案:

答案 0 :(得分:1)

我在这里没有回答你的问题。找出你做错了什么,以及如何自己解决问题,这一点更为重要。

如何找出问题所在?

编译器在编译代码时会显示两条警告:

  

警告:2

     

project1.lpr(29,17)警告:变量&#34;我&#34;似乎没有被初始化

     

project1.lpr(44,45)警告:变量&#34; totalPrice&#34;似乎没有被初始化

当您在没有为其分配值的情况下读取变量时,会出现此类警告。编译器会引导您到不安全代码的位置。第一个警告位于第17栏第29行:

-- First, chech if the table exists...
IF 0 < (
    SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES 
    WHERE TABLE_TYPE = 'BASE TABLE'
    AND TABLE_SCHEMA = 'dbo'
    AND TABLE_NAME = 'T_SYS_Language_Forms'
)
BEGIN
    -- Check for NULL values in the primary-key column
    IF 0 = (SELECT COUNT(*) FROM T_SYS_Language_Forms WHERE LANG_UID IS NULL)
    BEGIN
        ALTER TABLE T_SYS_Language_Forms ALTER COLUMN LANG_UID uniqueidentifier NOT NULL 

        -- No, don't drop, FK references might already exist...
        -- Drop PK if exists 
        -- ALTER TABLE T_SYS_Language_Forms DROP CONSTRAINT pk_constraint_name 
        --DECLARE @pkDropCommand nvarchar(1000) 
        --SET @pkDropCommand = N'ALTER TABLE T_SYS_Language_Forms DROP CONSTRAINT ' + QUOTENAME((SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
        --WHERE CONSTRAINT_TYPE = 'PRIMARY KEY' 
        --AND TABLE_SCHEMA = 'dbo' 
        --AND TABLE_NAME = 'T_SYS_Language_Forms' 
        ----AND CONSTRAINT_NAME = 'PK_T_SYS_Language_Forms' 
        --))
        ---- PRINT @pkDropCommand 
        --EXECUTE(@pkDropCommand) 

        -- Instead do
        -- EXEC sp_rename 'dbo.T_SYS_Language_Forms.PK_T_SYS_Language_Forms1234565', 'PK_T_SYS_Language_Forms';


        -- Check if they keys are unique (it is very possible they might not be) 
        IF 1 >= (SELECT TOP 1 COUNT(*) AS cnt FROM T_SYS_Language_Forms GROUP BY LANG_UID ORDER BY cnt DESC)
        BEGIN

            -- If no Primary key for this table
            IF 0 =  
            (
                SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
                WHERE CONSTRAINT_TYPE = 'PRIMARY KEY' 
                AND TABLE_SCHEMA = 'dbo' 
                AND TABLE_NAME = 'T_SYS_Language_Forms' 
                -- AND CONSTRAINT_NAME = 'PK_T_SYS_Language_Forms' 
            )
                ALTER TABLE T_SYS_Language_Forms ADD CONSTRAINT PK_T_SYS_Language_Forms PRIMARY KEY CLUSTERED (LANG_UID ASC)
            ;

            -- Adding foreign key
            IF 0 = (SELECT COUNT(*) FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS WHERE CONSTRAINT_NAME = 'FK_T_ZO_SYS_Language_Forms_T_SYS_Language_Forms') 
                ALTER TABLE T_ZO_SYS_Language_Forms WITH NOCHECK ADD CONSTRAINT FK_T_ZO_SYS_Language_Forms_T_SYS_Language_Forms FOREIGN KEY(ZOLANG_LANG_UID) REFERENCES T_SYS_Language_Forms(LANG_UID); 
        END -- End uniqueness check
        ELSE
            PRINT 'FSCK, this column has duplicate keys, and can thus not be changed to primary key...' 
    END -- End NULL check
    ELSE
        PRINT 'FSCK, need to figure out how to update NULL value(s)...' 
END 

你打算在这里使用集合1: begin price[i]:= 1.50; // i has not been set before. So its value is undefined or 0 end; 吗?那么为什么之前没有赋值给它呢? 或者你有一个不同的变量,可以保存冰淇淋的数量?为什么不使用它?

让我们看看第25栏第44行的第二个警告。这一行:

Price[i]

您确定totalPrice:= totalPrice+price[i]; // ^ 已正确初始化吗?

即使您正确初始化,程序仍可能无法正常工作。在这种情况下,它有助于调试应用程序。 在Lazarus IDE中打开您的申请,然后按totalPrice逐步完成您的计划。你在执行程序时从一行到另一行。你会看到那些错误。