0

私はCに不慣れで、3つまたは4つ以上の関数がある問題にアプローチする方法を知ることに非常に興味があります。常に必要な出力を確認し、他の関数内の関数を呼び出してコードを操作し、必要な出力を取得します。以下は、最初にID、次にユーザー名から学生のレコードを検索するための私のロジックです。私の教授によると、このコードには過度の論理があり、多くの点で欠けています。誰かがCまたは他の言語で問題にどのように取り組むべきかについて私を助けてくれるなら、それは初心者として私にとって大きな助けになるでしょう、そしてはい私最初に擬似コードを記述してください。

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

typedef struct{

int id;                                  //Assuming student id to be unique
int age;
char *userName;                         //Assuming student userName to be unique
char *dept;

}student;                               // Alias "student" created for struct

student* createstruct();                // All function prototype declared
student* createArray();
void addstruct(student* s2);
void searchChar(student* s2,int num);
void searchInt(student* s2,int num);

student* createstruct()                          // function createStruct() to malloc data of struct student.
{
    student *s;
    s = (student*)malloc(sizeof(student));
    s->userName = (char*)malloc(sizeof(char)*32);
    s->dept = (char*)malloc(sizeof(char)*32);
    printf("please enter id ");
    scanf("%d",&s->id);
    printf("please enter age ");
    scanf("%d",&s->age);
    printf("please enter userName ");
    scanf("%31s",s->userName);
    printf("please enter department ");
    scanf("%31s",s->dept);
    printf("\n");

    return s;
}

student* createArray()
{
    student *arr;                                    //declaration of arr poiter, type struct student
    arr = (student*)malloc(sizeof(student)*10);     // memory allocated for a size of 10
    return arr;
}

void addstruct(student *s2)                       // function for adding data to the structures in array
{
    int i,num;
    student* s1;
    printf("please enter the number of records to add:");
    scanf("%d",&num);
    printf("\n");

    if(num>0 && num<11)
    {
      for(i=0;i<num;i++)                    // if user want to enter 5 records loop will only run 5 times
       {
         s1 = createstruct();
         s2[i].id = s1->id;                 // traversing each element of array and filling in struct data
         s2[i].age = s1->age;
         s2[i].userName = s1->userName;
         s2[i].dept= s1->dept;
       }
    }
    else if(num>10)                         // if user enters more than 10
    {
      for(i=0;i<10;i++)                     // loop will still run only 10 times
        {
         s1 = createstruct();
         s2[i].id = s1->id;
         s2[i].age = s1->age;
         s2[i].userName = s1->userName;
         s2[i].dept = s1->dept;
        }

       printf("Array is full");            // Array is full after taking 10 records
       printf("\n");
    }

searchInt(s2,num);                        // Calling searchInt() function to search for an integer in records
searchChar(s2,num);                       // Calling searchChar() function to search for a string in records
free(s1);
free(s2);
}

void searchChar(student* s2,int num)           // function for searching a string in records of structure
{
    char *c;
    int i;
    c = (char*)malloc(sizeof(char)*32);
    printf("please enter userName to search ");
    scanf("%31s",c);
    printf("\n");

  for (i=0;i<num;i++)                             //num is the number of struct records entered by user
    {
      if ((strcmp(s2[i].userName,c)==0))          //using strcmp for comparing strings
      {
       printf("struct variables are %d, %d, %s, %s\n", s2[i].id,s2[i].age,s2[i].userName,s2[i].dept);
       break;
      }
      else if(i == num-1)
      {
          printf("nothing in userName matches: <%s>\n",c);
          break;
      }
    }
}

void searchInt(student* s2,int num)                 //searchs for an integer and prints the entire structure
{
    int i,z;
    printf("please enter id to search ");
    scanf("%d",&z);
    printf("\n");

  for (i=0;i<num;i++)
    {
      if (s2[i].id == z)
      {
          printf("struct variables are %d, %d, %s, %s\n\n", s2[i].id,s2[i].age,s2[i].userName,s2[i].dept);
          break;
      }
      else if(i == num-1)
      {
          printf("nothing in id matches: <%d>\n\n",z);
          break;
      }
    }
}

int main(void)
{
    student *s2;
    s2 = createArray();
    addstruct(s2);
    return 0;
}
4

1 に答える 1

0

理論的なパフォーマンスを向上させたい場合は、順序付けられた配列/リスト、ツリー、ハッシュテーブル、ある種のインデックスなど、さまざまなデータ構造を使用する可能性があるため、最適化については説明しません。これらはいずれも関係ありません。この場合、少量のデータを処理する単純なプログラムがあるためです。

しかし、私はあなたの教授が言及した「過剰な論理」について、あなたのsearchInt機能を例として取り上げてあなたに話すつもりです:

for (i=0;i<num;i++)
{
  if (s2[i].id == z)
  {
      printf("struct variables are %d, %d, %s, %s\n\n", s2[i].id,s2[i].age,s2[i].userName,s2[i].dept);
      break;
  }
  else if(i == num-1)
  {
      printf("nothing in id matches: <%d>\n\n",z);
      break;
  }
}

ここで重要なのは、ループの周りで毎回、ループの最後の要素にいるかどうかを確認するためにテストしているということです。しかし、ループはすでにそれを行っています。つまり、これを2回実行し、さらに悪いことに、減算を実行しています(これは、コンパイラーによってレジスターに最適化される場合とされない場合があります)。

あなたが通常することはこのようなものです:

int i;
student *s = NULL;

for( i = 0; i < num; i++ )
{
    if( s2[i].id == z ) {
        s = &s2[i];
        break;
    }
}

if( s != NULL ) {
    printf( "struct variables are %d, %d, %s, %s\n\n",
            s->id, s->age, s->userName, s->dept );
} else {
    printf("nothing in id matches: <%d>\n\n",z);
}

ループが何かを見つけたことを知るための何らかの方法があれば十分であることがわかります。ループが終了するのを待ってから、何かが見つかったかどうかをテストします。

この場合、成功を示すためにポインターを使用しました。これは、配列にインデックスを付けてコードを乱雑にすることなく、ポインターを使用して関連するレコードにアクセスできるためです。常にポインタを使用するとは限りません。

フラグを設定する場合もあれば、配列インデックスを格納する場合もあります。関数から戻るだけの場合もあります(ループが失敗した場合は、何も見つからなかったことがわかります)。

プログラミングとは、解決しようとしている問題に対して賢明な選択をすることです。必要な場合にのみ最適化し、問題を過度に複雑にせず、常に読みやすく理解しやすいコードを記述してください。

于 2012-10-25T04:21:17.647 に答える