gpt4 book ai didi

c - 三个函数中的指针

转载 作者:太空宇宙 更新时间:2023-11-04 02:49:01 25 4
gpt4 key购买 nike

我是 C 的新手,我正在尝试创建一个程序来计算银行账户的复利。

我正在使用三个带指针的函数,一个用于获取数据,一个用于计算,一个用于将数据打印到表格中。我假设我对指针的混淆导致计算值在表中打印不正确。

就目前而言,我没有收到任何错误,但收到了一些关于我的指针“默认为 int”的警告。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

//Function declarations
void GETDATA(double* StartAmnt, float* IntrRate, int* NumYears, int* StartYear);

void Mathemagic (double StartAmnt, float IntrRate, int NumYears, int StartYear,
float* IntrEarned, float* PercentGained,long double* FutureValue,
int* FutureYear);

void PRINTTABLE (double StartAmnt, float IntrRate, int NumYears, int StartYear,
float IntrEarned, float PercentGained,long double FutureValue,
int FutureYear);

int main(void)
{

//Local Declarations
double StartAmnt;
float IntrRate;
float IntrEarned;
float PercentGained;
long double FutureValue;

int NumYears;
int StartYear;
int FutureYear;

//Statements
GETDATA (&StartAmnt, &IntrRate, &StartYear, &NumYears);

Mathemagic (StartAmnt, IntrRate, StartYear, NumYears, &IntrEarned,
&PercentGained, &FutureValue, &FutureYear);

PRINTTABLE (StartAmnt, IntrRate, NumYears, StartYear, IntrEarned,
PercentGained, FutureValue, FutureYear);


return 0;
}//main

void GETDATA(double* StartAmnt, float* IntrRate, int* NumYears, int* StartYear)
{
//Statements
printf("COP 2220-51014 Project 2: Michael Walt\n\n");
printf("Enter a Starting amount (dollars and cents): ");
scanf("%lf", StartAmnt);
printf("Enter an Interest rate (ex. 2.5 for 2.5%): ");
scanf("%f", IntrRate);
printf("Enter the Number of years (integer number): ");
scanf("%d", NumYears);
printf("Enter the Starting year (four digits): ");
scanf("%d", StartYear);
return;
}//GETDATA


void Mathemagic (double StartAmnt, float IntrRate, int NumYears, int StartYear,
float* IntrEarned, float* PercentGained,long double* FutureValue,
int* FutureYear)
{
//Statements

*FutureValue = StartAmnt*pow((1+(IntrRate/100)),NumYears);

*PercentGained =((*FutureValue - StartAmnt)/StartAmnt)*100;

*IntrEarned = (*FutureValue-StartAmnt);

*FutureYear = (StartYear+NumYears);

return;
}//Mathemagic

PRINTTABLE(StartAmnt, IntrRate, NumYears, StartYear, IntrEarned,
PercentGained, FutureValue, FutureYear)
{
printf("\n+-----------------------------+--------------+\n");
printf("| Description | Input Data |\n");
printf("|-----------------------------+--------------|\n");
printf("| Starting amount | $ %.2f |\n", StartAmnt);
printf("| Interest rate | %f%% |\n", IntrRate);
printf("| Number of Years | %d |\n", NumYears);
printf("| Starting year | %d |\n", StartYear);
printf("+-----------------------------+--------------+\n");
printf("| Future value | Results |\n");
printf("|-----------------------------+--------------|\n");
printf("| In %d the balance will be | $ %f |\n", FutureYear, FutureValue);
printf("| Interest earned | $ %f |\n", IntrEarned);
printf("| Total percent gained | %f%% |\n", PercentGained);
printf("+-----------------------------+--------------+\n");
return;
}

最佳答案

主要问题是您的PRINTTABLE 函数有错误的定义:

PRINTTABLE(StartAmnt, IntrRate, NumYears, StartYear, IntrEarned,
PercentGained, FutureValue, FutureYear)

虽然它之前被声明

void PRINTTABLE (double StartAmnt, float IntrRate, int NumYears, int StartYear,
float IntrEarned, float PercentGained,long double FutureValue,
int FutureYear);

如果您启用所有警告(几乎所有编译都必须启用),您会看到许多默认为“int” 的警告:

*.c:76:1: warning: return type defaults to 'int' [-Wreturn-type]
PRINTTABLE(StartAmnt, IntrRate, NumYears, StartYear, IntrEarned,
^
*.c:76:1: warning: conflicting types for 'PRINTTABLE' [enabled by default]
*.c:12:6: note: previous declaration of 'PRINTTABLE' was here
void PRINTTABLE (double StartAmnt, float IntrRate, int NumYears, int StartYear,
^

因为您对 PRINTTABLE 有不同的声明定义,所以编译器将使用您代码中出现的最后一个。在 C99 之前,如果声明中没有类型,所有参数都默认为 int,并且返回值也隐含为 int,造成类型冲突上面的警告。

这也是为什么在错误的转换和格式说明符(调用 undefined behavior)中有很多其他警告的原因

*.c:82:5: warning: format '%f' expects argument of type 'double', but argument 2 has type 'int' [-Wformat=]
printf("| Starting amount | $ %.2f |\n", StartAmnt);

StartAmntint 由于隐含的类型规则,您将其打印为 double

有关规则的更多信息,请阅读

另一个问题是你在这一行错过了一个百分号

printf("Enter an Interest rate (ex. 2.5 for 2.5%):   ");

您还在另一个地方使用了错误的格式说明符。 FutureValue 的类型为 long double 但您要按 %f 打印它。它应该是 %Lf

printf("| In %d the balance will be | $  %f  |\n", FutureYear, FutureValue);

实际上,在大多数应用程序中,long double(如果可用)的更高精度是不必要的。 long double 也可能占用更多空间,并且在许多情况下速度要慢得多,因为精度和使用旧的 x87 FPU 或软件浮点库。我也不知道你为什么要这样混合使用 floatdoublelong double,这只会浪费你在类型之间转换的时间并在其他情况下降低精度。一般来说,double 是推荐的类型,即使像 1.23 这样没有后缀的浮点字面量也是 double。 float 最常用于存储,因为精度非常有限。所有非 double 字面值都必须使用后缀

并且不要像这样对函数或变量使用全部大写

关于c - 三个函数中的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24093135/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com