【问题标题】:Sorting an directory in C在C中对目录进行排序
【发布时间】:2015-04-15 05:28:35
【问题描述】:

我不确定如何执行以下操作...

修改insertion()函数,将新人插入到按人名排序的目录中。

#include <stdio.h>   
#include <string.h>
#include <ctype.h>
#pragma warning(disable: 4996)
#define max 100
typedef enum { diploma, bachelor, master, doctor } education;

const char* getDegreeName(enum education degree){
    switch (degree){

    case diploma: return "diploma";
        break;
    case bachelor: return "bachelor";
        break;
    case master: return "master";
        break;
    case doctor: return"doctor";
        break;

    }
}

struct person {                    // a node to hold personal details
    char name[30];
    char email[30];
    int phone;
    education degree;
};

struct person directory[max];                // an array of structures, 100 entries
int tail = 0;                         // global variable
int i = 0;
int z = 0;
char temp[30];


void flush();                         // forward declaration of functions
void branching(char c);
int insertion();
int print_person(int i);
int print_all();
int search_person();
int delete_person();


int main() {  // print a menu for selection
    char ch = 'i';

    ungetc('\n', stdin); // inject the newline character into input buffer

    do {
        printf("Enter your selection\n");
        printf("\ti: insert a new entry\n");
        printf("\td: delete an entry\n");
        printf("\ts: search an entry\n");
        printf("\tp: print all entries\n");
        printf("\tq: quit \n");

        flush();    // flush the input buffer. To be discussed later
        ch = tolower(getchar());
        branching(ch);
    } while (ch != 113);

    return 0;
}

void flush() {  // flush the input buffer. To be discussed later
    int c;
    do {
        c = getchar();
    } while (c != '\n' && c != EOF);
}


void branching(char c) {    // branch to different tasks
    switch (c) {
    case 'i':
        insertion();
        break;
    case 's':
        search_person();
        break;
    case 'd':
        delete_person();
        break;
    case 'p':
        print_all();
        break;
    case 'q':
        break;
    default:
        printf("Invalid input\n");
    }
}

int insertion() {    // insert a new entry at the end
    if (tail == max) {
        printf("There are no more places to insert.\n");
        return -1;
    }
    else {
        printf("Enter name, phone, email:\n");
        printf("Enter 0 for diploma, 1 for bachlor, 2 for master and 3 for doctor\n");
        scanf("%s", directory[tail].name);
        scanf("%d", &directory[tail].phone, sizeof(directory[tail].phone));
        scanf("%s", directory[tail].email);
        scanf("%d", &directory[tail].degree); //sacaning the degree

        tail++;
        printf("The number of entries = %d\n", tail);
        return 0;
    }
}

int print_person(int i) {
    // print all information one person in the directory
    printf("\n\nname = %s\n", directory[i].name);
    printf("email = %s\n", directory[i].email);
    printf("phone = %d\n", directory[i].phone);
    printf("degree = %s\n", getDegreeName(directory[i].degree));
    return 0;
}

int print_all() {
    // print all information each person in the contactbook
    int i;

    if (tail == 0) {
        printf("No entries found.");
    }
    else {
        for (i = 0; i < tail; i++) {
            print_person(i);
        }
    }

    return 0;
}

int search_person() {      // print phone and email via name
    char sname[30]; int  i;

    printf("Please enter the name to be searched for:\n");
    scanf("%s", sname);     //sname is an array, no & needed

    for (i = 0; i<tail; i++)
        if (strcmp(sname, directory[i].name) == 0) {
        print_person(i);
        return i;
        }

    printf("The name does not exist.\n");
    return -1;
}
int delete_person() {
    int i, k;
    k = search_person();
    if (k == -1) {
        printf("The name does not exist.\n"); return -1;
    }
    else {
        for (i = k; i<tail; i++) {
            strcpy(directory[i].name, directory[i + 1].name);
            directory[i].phone = directory[i + 1].phone;
            strcpy(directory[i].email, directory[i + 1].email);
            printf("The index deleted is: %d\n", k);
        }
        tail--;
        return k;
    }
}

【问题讨论】:

  • 请添加您尝试过的内容?说“不知道该怎么做”将无助于添加您迄今为止尝试过的内容以及您发布的代码是您编写的吗?
  • 这是作业吗?我在想,因为我今天早些时候看到了同样的问题。

标签: c++ c arrays sorting enums


【解决方案1】:
int insertion()
{
if (tail == max)
{
  printf("There are no more places to insert.\n");
  return -1;
}
return doInsertion();
}

int doInsertion() {

bool done = false;
char name[30];
char email[30];
double phone = 0;
double degree = 0;
int i = 0;
struct person toadd;
struct person tmpdirectory[tail+1];

 // Ask user for input
printf("Enter name, phone, email:\n");
printf("Enter 0 for diploma, 1 for bachlor, 2 for master and 3 for doctor\n");

// Get user input
scanf("%s", name, sizeof(name));
scanf("%d", phone);
scanf("%s", sizeof(email));
scanf("%d", degree);

toadd.name = name;
toadd.phone = phone;
toadd.email = email;
toadd.degree = degree;

// Loop for over the length of the current array
for(; i < tail ; ++i)
{
  // Check if the new item is alphabetically before the next item
  if(strcmp(name, directory[i].name) < 0) 
  {
     // Insert the new item and break the loop
    tmpdirectory[i] = toadd;
     done = true;
     break;
  }

  // Copy over a item and keep looking for the insert spot
  tmpdirectory[i] = directory[i];
}

// If we haven’t inserted yet its the last item in the list
if(done == false)
{
    tmpdirectory[i] = toadd;
}
// otherwise we need to copy over the remaining items in the list
else
{
  for(; i < tail ; ++i)
  {
   tmpdirectory[i+1]; = directory[i];
  }
}

// increase list count
++tail;

// copy the struct
struct person dictionary[tail];
directory = tmpdirectory;

printf("The number of entries = %d\n", tail);
return 0;
}

【讨论】:

    猜你喜欢
    • 2020-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 2018-04-29
    • 1970-01-01
    相关资源
    最近更新 更多