0

ユーザーは 2 つの数字と +、-、/、* のいずれかを入力すると、回答が返されます。問題は、入力したものが正しく表示されず、計算されていないことです。どうしてこれなの?私が得ているものを示すスクリーンショットを提供しました。これを修正するにはどうすればよいですか? http://imageshack.us/photo/my-images/404/mathfn.jpg/

#include <iostream>
using namespace std;

#include <stdio.h>
#include <string.h>
#include <winsock.h>

// Function prototype
void StreamClient(char *szServer, short nPort);

// Helper macro for displaying errors
#define PRINTERROR(s)   \
        fprintf(stderr,"\n%s: %d\n", s, WSAGetLastError())

////////////////////////////////////////////////////////////

void main(int argc, char **argv)
{
    WORD wVersionRequested = MAKEWORD(1,1);
    WSADATA wsaData;
    int nRet;
    short nPort;

    //
    // Check for the host and port arguments
    //
    if (argc != 3)
    {
        fprintf(stderr,"\nSyntax: TCPTimeClient ServerName PortNumber\n");
        return;
    }

    nPort = atoi(argv[2]);

    //
    // Initialize WinSock and check the version
    //
    nRet = WSAStartup(wVersionRequested, &wsaData);
    if (wsaData.wVersion != wVersionRequested)
    {   
        fprintf(stderr,"\n Wrong version\n");
        return;
    }

    //
    // Go do all the stuff a datagram client does
    //
    StreamClient(argv[1], nPort);

    //
    // Release WinSock resources
    //
    WSACleanup();

    printf("\nPlease enter a floating point number: ");
float number1;
scanf("%f", &number1);

printf("\nPlease enter a mathematical operator (+,-,*,/): ");
char mathOperator;
scanf("%f", &mathOperator);


printf("\nPlease enter a floating point number: ");
float number2;
scanf("%f", &number2);

printf("\nCalculating %f %f %f...", &number1, &mathOperator, &number2);

printf("\nPlease enter a floating point number: ");
float number3;
scanf("%f", &number2);

}

////////////////////////////////////////////////////////////

void StreamClient(char *szServer, short nPort)
{
    int nRet;                       // return code
    char szBuf[256];                // client buffer area 
    char szSvr[256];                // server name

    LPHOSTENT lpHostEntry;          // host data structure
    SOCKET  theSocket;              // client socket
    SOCKADDR_IN saClient;           // socket address structure

    //
    // Get local machine name
    //
    nRet = gethostname(szSvr, sizeof(szSvr));

    //
    // Check for errors
    //
    if (nRet == SOCKET_ERROR)
    {
        PRINTERROR("gethostname()");
        return;
    }

    // 
    // Display an informational message
    //
    printf("Datagram Client [%s] sending to server [%s] on port %d...\n",
                                szSvr, szServer, nPort);

    //
    // Find the server
    //
    lpHostEntry = gethostbyname(szServer);
    if (lpHostEntry == NULL)
    {
        PRINTERROR("gethostbyname()");
        return;
    }

    //
    // Create a TCP/IP datagram socket
    //
    theSocket = socket(AF_INET,         // Address family
                       SOCK_STREAM,     // Socket type
                       0);              // Protocol

    //
    // Check for errors
    //
    if (theSocket == INVALID_SOCKET)
    {
        PRINTERROR("socket()");
        return;
    }

    //
    // Fill in the address structure of the server
    //
    saClient.sin_family = AF_INET;
    saClient.sin_addr = *((LPIN_ADDR)*lpHostEntry->h_addr_list);
                                        // ^ Client's address
    saClient.sin_port = htons(nPort);   // Port number from command line

    //
    // Connect to the server
    //
    nRet = connect(theSocket, 
            (struct sockaddr *)&saClient, 
            sizeof(saClient));

    //
    // Check for errors
    //
    if(nRet == SOCKET_ERROR)
    {
      PRINTERROR("Connect()");
      return;
    }

    //
    // Prepare some data to send to the server
    //
    sprintf(szBuf, "From the Client [%s]", szSvr);

    //
    // Send data to the server
    //
    nRet = send(theSocket,                  // Socket
                  szBuf,                    // Data buffer
                  (int)strlen(szBuf),       // Length of data
                  0);                       // Flags

    //
    // Check for errors
    //
    if (nRet == SOCKET_ERROR)
    {
        PRINTERROR("send()");
        closesocket(theSocket);
        return;
    }

    //
    // Zero out the incoming data buffer
    //
    memset(szBuf, 0, sizeof(szBuf));

    //
    // Wait for the reply
    //
    nRet = recv(theSocket,                  // Socket
                szBuf,                      // Receive buffer
                sizeof(szBuf),              // Length of receive buffer
                0);                         // Flags

    //
    // Check for errors
    //
    if (nRet == SOCKET_ERROR)
    {
        PRINTERROR("recv()");
        closesocket(theSocket);
        return;
    }

    //
    // Display the data that was received
    //
    printf("\n%s", szBuf);

    //
    // Close the socket
    //
    closesocket(theSocket);
    return;


}
4

1 に答える 1

1

char を入力できなかった理由がわからなかったので、テスト プログラムを作成しました。確かに同じ動作です。私は scanf() をあまり使いませんが、scanf("%c") はバッファー内にある文字を (もしあれば) 取得し、何かを入力する前に続行していると推測しました。だから私はそれを完全に明示的にしました - fscanf/fgetchar ストリームに 'stdin' を指定し、読む前にそれが空であることを確認するために fflush() を実行します。また、単一の文字を取得するためだけに scanf() の使用をまったくやめました。それだけでした!完全なプログラムは次のとおりです。

printf("Please enter a floating point number: ");
float number1;
fscanf(stdin,"%f", &number1);

printf("Please enter a mathematical operator (+,-,*,/): ");
char mathOperator;
//fscanf(stdin,"%f", &mathOperator);

fflush(stdin);
mathOperator = (char)fgetc(stdin);

printf("Please enter a floating point number: ");
float number2;
fscanf(stdin,"%f", &number2);

printf("\nCalculating %f %c %f...", number1, mathOperator, number2);

float result = 0.0F;
switch (mathOperator) {
case '+':
    result = number1 + number2;
    break;
case '-':
    result = number1 - number2;
    break;
case '/':
    result = number1 / number2;
    break;
case '*':
    result = number1 * number2;
    break;
default:
    printf("\nInvalid operator entered!");
}

printf( "\n\nThe answer is %0.1f\n", result );

fflush(stdin);
char ch = getc(stdin);  // wait for keypress

テスト実行の出力は次のとおりです。

Please enter a floating point number: 3.4
Please enter a mathematical operator (+,-,*,/): *
Please enter a floating point number: 2

Calculating 3.400000 * 2.000000...

The answer is 6.8

【更新終了】

printf() で発生している特定の問題は、値自体ではなく、浮動小数点値のアドレスを渡していることです。

printf("\nCalculating %f %f %f...", &number1, &mathOperator, &number2);

次のようにする必要があります。

printf("\nCalculating %f %f %f...", number1, mathOperator, number2);

次の問題は「mathOperator」です。ユーザーに char を入力するように求めているように見えますが、printf() で指定されたデータ型は float です。それはうまくいきません。

したがって、printf次のようになります。

printf("\nCalculating %f %c %f...", number1, mathOperator, number2);

「mathOperator」には「+」、「-」などが含まれていると仮定します。

計算しない理由については、実際に計算を行うためのコードが表示されません (簡潔にするために省略されている可能性があります)。

【計算アップデート】

許可されている演算子は「+」、「-」、「/」、「*」のみであり、オペランドは常に浮動小数点であるため、計算ロジックは非常に単純です。

float result = 0.0F;
switch (mathOperator) {
case '+':
    result = number1 + number2;
    break;
case '-':
    result = number1 - number2;
    break;
case '/':
    result = number1 / number2;
    break;
case '*':
    result = number1 * number2;
    break;
}

次に、おそらく printf() を追加して結果を出力する (および/または TCP 経由で送り返す) ことをお勧めします。

printf( "The answer is" "%0.1f\n", result );

演算子の優先順位や型変換などを気にしなければならない複雑な計算を行う場合、単純な「ケース」では十分ではありません。パーサーを見て、式から解析ツリーを構築し、いくつかの規則 (文法) に従って評価する必要があります。しかし、私を信じてください-あなたはこれを最初にマスターしたいと思っています;-)

何が関係しているかについては、この質問を参照してください。

于 2013-03-17T23:51:59.640 に答える