1

これが、Cでの最初の超初心者のコンピュータープログラミングの質問です。

誰かが入力にフルネームを入力できるように設定する必要があります。これが仕様の一部です-

「印刷された名前を他のすべての列と並べる方法を理解するには、少し考える必要があります。最初のヒントは、文字列を結合することです。これは連結と呼ばれます。試してみてください。理解できません。このフォルダ内の次のドキュメントを見てください。追加のヒントが含まれています。この割り当ての目的の一部は、暗黙的に連結を教えることです。タブ(\ t)を使用しないでください。また、C /C++を確認してください。エディターはタブ文字を生成しません。

このプログラムではgets()を使用しないでください。インタラクティブ情報を入力するには、scanf()を使用します。get()を使おうとすると、非常にイライラすることがあります。

基本的に、レポートに表示されるすべての数値は、右寄せで小数点以下の桁数に揃える必要があります。要約に表示されるすべての番号は、先頭にスペースを付けずに表示する必要があります(通常、番号を前の単語から区切る番号を除く)。時給は10.00未満になる可能性があるため、フォーマットには十分注意してください。サンプル出力は正しく表示される場合がありますが、10.00ドル未満の時給と適切に一致しない場合でも、ハーフポイントにドッキングできます。」追加のヒント:

  • 従業員名は常に、スペースで区切られた名と姓の2つの名前であると想定できます。また、名または姓の中にスペースがないことを前提としています。これにより、1つのgets()呼び出しの代わりに、2つのscanf()呼び出しを使用できます。get()は、後で物事が正しく機能しないようにするいくつかの奇妙なことをもたらします。

  • また、どちらの名前も10文字を超えないと想定することもできます。

  • プロセスからの入力別の従業員?質問は1文字にする必要があります。Nまたはnはループを停止しますが、他の文字はループを継続するとします。

誰もがこれを行う方法を知っていますか?私がgetsを使用すると(彼はそうしないと言っています)、ループは2回目にねじ込まれ、名前と給与をすべて1行で要求します。また、2つのscanfステートメントを使用しようとすると、クラッシュするか、名前の1つだけが入力されます。

名前をテキストファイルに出力して、もう一度読み込むのが唯一の方法だと思っていました。しかし、他の方法はありますか?個別に名前を尋ねることは許可されていません。仕様に記載されているように、ユーザーは1つのスペースでフルネームを入力する場合があります。

これが私がこれまでに書いたコードです。また、総時間、残業時間、通常時間の合計も必要です。

//stupid program

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

//global variables

FILE *reportfile;   //output file
char department[21];
int count;
char name[21];
float hoursworked;
float hourlywage;
float overtimehoursworked;
float overtimehourlywage;
float gross;
char again;
char firstname;
char lastname;
float tothoursworked;
float totovertimehoursworked;
float totgross;

const float overtimerate = 1.5;
const float overtimethreshold = 40; //hours needed to get overtime


//function prototypes

void GetInfo(void);
void Finalreport(void);

//main

int main(void)
{

   reportfile = fopen("c:\\class\\kpaul-pay.txt","w");  //open output file

    //////////////////////////////////////////////////
     //        initialize accumulating variables
     /////////////////////////////////////////////////


     count = 0;
     tothoursworked = 0;
     totovertimehoursworked = 0;
     totgross = 0;

   GetInfo();

   fclose(reportfile);         //close output file




return 0;

}

void GetInfo (void)
{
    printf("Mountain Pacific Corporation\n");
    printf("Department Salary Program\n\n");
    printf("Please enter the name of the department: ");
    gets(department);
    fprintf(reportfile, "Mountain Pacific Corporation\n");
    fprintf(reportfile, "Department Salary Program\n\n");
    fprintf(reportfile, "%s\n\n", department);
    fprintf(reportfile, "Employee                Reg Hrs        Overtime Hrs                      Gross\n");
    fprintf(reportfile, "-----------------------------------------------------------------\n");

    do {


   printf("\nEnter employee #1: ");
   gets(name);

   printf("Enter the hourly wage of %s", name);
   scanf("%f", &hourlywage);

   printf("\nEnter total number of hours: ");
   scanf("%f", &hoursworked);

   if (hoursworked<=overtimethreshold)
    overtimehoursworked = 0;

   else if (hoursworked > overtimethreshold)
   overtimehoursworked = hoursworked - overtimethreshold;

   gross = (hoursworked*hourlywage) + (overtimehoursworked*overtimehourlywage);

       fprintf(reportfile, "%s%16.2f(%4.2f)%12.2f(%4.2f)    $%7.2f", name, hoursworked,     hourlywage, overtimehoursworked, hourlywage * overtimerate, gross);

       tothoursworked = tothoursworked + hoursworked;
       totovertimehoursworked = totovertimehoursworked +overtimehoursworked;
       totgross = totgross + gross;


      printf("\n");
      printf("Would you like another conversion? ");
      scanf ("%s", &again);

      printf("\n\n");

   } while (again!='N' && again!='n');

}
4

2 に答える 2

1

scanfフォーマット文字列を注意深く使用する必要があります。%s空白で区切られた文字列を示します。技術用語ではありませscanfんが、タブやスペースなどの空白文字が見つかるまで文字を読み取ります。

これは、複数の単語を読み取る場合に問題を引き起こします。これは%s、フォーマット文字列で複数を使用することで解決できます。フォーマット文字列の後に引数として各単語に個別の配列を指定する必要があります。

scanf("%s%s%s", string1, string2, string3)

このscanf呼び出しでは、ユーザーから3つの単語が必要です。各単語は、空白で区切られています。各アレイにメモリが割り当てられていることを確認してください。そうしないと、プログラムが通常は所有していないメモリに書き込み、プログラムがクラッシュします。上記のコードとまったく同じ効果は、フォーマット文字列scanfの1つで複数回使用することで実現できます。%s

すべてを1つの文字列として必要な場合は、strcat2つの文字列を連結する同じ配列を使用できます。この関数の使い方は簡単ですが、呼び出す前に引数に配列が割り当てられていることをもう一度確認してください。strcatそうしないと、クラッシュや予期しない動作が発生する可能性があります。

両方の関数への参照は次のとおりです。

scanf-http ://www.cplusplus.com/reference/clibrary/cstdio/scanf/

strcat-http ://www.cplusplus.com/reference/clibrary/cstring/strcat/

これがお役に立てば幸いです=]

于 2012-05-21T01:24:55.440 に答える
0

scanfこの形式で%sは、空白で区切られた文字列を受け入れます。

クラッシュは、入力文字列のオーバーフロー(またはスペースの予約の失敗)が原因である可能性があります。

于 2012-05-21T00:17:49.653 に答える