1. 程式人生 > >有關結構體的一些題目

有關結構體的一些題目

1、設有下面的結構體和結構變數定義:

struct student
{
    int id;
    char *name;
    int math;
};

關於結構體型別變數賦值正確的是()
A、 studl.id=1001; studl.name=”Tom”;
B、 id=1001; *studl.name=”Tom”;
C、 studl.id=1001; studl.*name=”Tom”;
D、 studl.id=1001L; *studl.name=”Tom”;
//A是正確的,結構體內有字元指標時,直接使用結構體的引用給字元指標指向一個字串。

2、指向結構體物件的指標變數既可以指向結構體變數,也可以用來指向()。
//
2.1結構體型別只有一種。請問這句話的說法是正確的嗎?
A. 正確
B. 錯誤
//錯誤,結構體的型別不只有一種,因為結構體的名稱不同時,即為一種不同的結構體。
3、當說明一個結構體變數時系統分配給它的記憶體是()
A. 各成員所需記憶體的總和
B. 結構中第一個成員所需記憶體量
C. 成員中佔記憶體量最大者所需的容量
D. 結構中最後一個成員所需記憶體量
//各成員變數所佔的記憶體和,最後組成了結構體所佔空間的記憶體。

4、在結構體中,成員的預設存取許可權是 1 有的.
//結構體中,各成員變數是公開的,所以,我們定義一個結構體時,可以隨便呼叫。

5、在32位cpu上選擇預設對齊的情況下,有如下結構體定義:
struct A{
unsigned a : 19;
unsigned b : 11;
unsigned c : 4;
unsigned d : 29;
char index;
};
則sizeof(struct A)的值為(C)
9
• 12
• 16
• 20
//位結構,在4位元組裡邊,a首先佔用了19個位元組,b又來佔用剩下的32-19=13個位元組,發現可以容納,之後就佔用了。c來了,發現之前4個位元組的空間只剩下了兩位,所以c默默地又讓編譯器給它分配了4個位元組的空間,它就把前4位佔了。d來了很吐血,c佔了它要的4個位元組的4位,但是剩下那麼多空的,d又佔不下,它也向編譯器申請了4位元組空間,所以d佔用了它申請的4位元組空間裡邊的29位。最後一個成員index來了,他申請了位元組的空間,但是之後的編譯器又來了,發現它們不齊,之後給index之後添加了3個位元組的空間,最後就成了16個位元組的空間佔用。

6、下列程式碼的功能包括:定義一個x陣列,說明一個結構體,同時對變數t進行初始化,使得t的a成員的值為50,b成員的值為x陣列的首地址。
請在空白處(方框內)填入合適的內容,一完成上述功能。
1
2
3
4
5
int x[5]={1,2,3,4,5};
struct {
int a;
int *b;
}t{ (50),(x) };

7、開發C程式碼時,經常見到如下型別的結構體定義:

typedef struct list_t
{
struct list_t *next;
struct list_t *prev;
char data[0];
}list_t;
請問在32位系統中,sizeof(list_t)的值為?
4byte
• 8byte
• 5byte
• 9byte
//兩個指標,兩個四位元組大小的記憶體。char data[0],編譯器預設為柔性陣列沒有給記憶體。所以為8

8、定義一個結構體變數(包括年、月、日),計算該日在本年中為第幾天?(注意考慮閏年問題),要求寫一個函式days,實現上面的計算。由主函式將年月日傳遞給days函式,計算後將日子傳遞迴主函式輸出 。

#include <stdio.h>
typedef struct Time
{
    int year;
    int mouth;
    int day;
}T,*Tp;
void Set_time(Tp t);
int count_day(Tp t);
void print(int a);
int count_day(Tp t)
{
    int month[12]={31,28,31,30,31,30,31,31,30,31,30,0};
    int i,day;
    day=t->day;
    for (i=1;i<t->mouth;i++)
        day+=month[i-1];//先不判斷每一天的天數,將月份減一,將平年的每一天的天數加起來。
    if((!(t->year%4)&&t->year%100||!(t->year%400))&&t->mouth>2)day++;//如果是閏年每一天的天數加一。
    return day;
}
void Set_time(Tp t)
{
    int a,b,c;
    printf("請輸入年 月 日.\n");
    scanf("%d%d%d",&a,&b,&c);
    t->year = a;
    t->mouth = b;
    t->day = c;
}
void print(int a)
{   
    printf("天數為%d.\n",a);
}
int main(void)
{
    T t;
    Set_time(&t);
    print(count_day(&t));
    return 0;
}

9、假設有如下的關於職工資訊的結構體:
struct Employee
{
long eID;
char eName[10];
struct Employee *pNext;
};
其中eID表示職工編號,請編寫一個函式:
struct Employee *eIDSequence(int eID, char *sName)

#include <stdio.h>
#include <stdlib.h>
struct Employee
{
    long eId;
    char eName[10];
    struct Employee *pNext;
};
struct  Employee *eIDSequence(int eID, char *sName);
struct  Employee *eIDSequence(int eID, char *sName)
{
    struct Employee *node = NULL;
    node = (struct Employee *)malloc(sizeof(struct Employee));
    node -> eId = eId;
    node -> eName = sName; 
    node -> pNext = NULL;//必須給,不然成為野指標。
    return node;
}
int main(void)
{
    struct Employee *node = NULL;
    node = eIDSequence(04165218, "zhangjie");
    printf(" eId:%d.\n eName:%s.\n", node->eId, node->eName);
    return 0;
}

10、請設計一個名為student的結構體型別,該型別的成員有一個名為sex的字元型別變數,有一個名為id的int型別,有個名為name的字元陣列的變數,請在主函式中建立一個sruc student型別的陣列,陣列長度為10,然後再設計一個自定義函式實現該結構體陣列的輸入,再設計一個自定義函式,求出該結構體陣列中id值最大的元素並顯示其各成員的值。

#include <stdio.h>
#include <stdlib.h>
typedef struct sruc
{
    int id;
    char name[20];
}sruc, *sruc_p;
void set_sruc(sruc *student, int length);
void Max_id(sruc *student, int length);
void print_sruc(sruc studenth);

void set_sruc(sruc *student, int length)
{
    int i;
    for(i=0; i<length; i++)
    {
        printf("Enter the student information.\n id:\n name:");
        scanf("%d%s",&student[i].id, student[i].name);
    }
}
void Max_id(sruc *student, int length)
{
    sruc stu1;
    int i = 0;
    stu1 = student[0];
    for(i=0; i<length; i++)
    {
        if(stu1.id < (student[i].id))
        {
            stu1 = student[i];
        }
    }
    print_sruc(stu1);
}
void print_sruc(sruc student)
{
    printf(" id :%d.\n name :%s.\n", student.id, student.name);
}
int main(void)
{
    sruc student[10];
    set_sruc(student,10);
    Max_id(student,10);
    return 0;
}

11、程式設計計算兩點間的直線距離。
要求:點座標採用結構體型別,螢幕獲取輸入兩點,並輸出距離(小數點後保留兩位)。

#include <stdio.h>
#include <math.h>
typedef struct point
{
    double x1,x2;
    double y1,y2;
}P,*P_p;
int main(void)
{
    P p;
    printf("Enter the first point.\n");
    scanf("%lf%lf",&p.x1,&p.y1);
    printf("Enter the second point.\n");
    scanf("%lf%lf",&p.x2,&p.y2);
    printf("Stright length : %.2lf.\n",sqrt((p.x1-p.x2)*(p.x1-p.x2)+(p.y1-p.y2)*(p.y1-p.y2)));
    return 0;
}

12、題目標題:
電話薄管理
題目描述:
利用結構體型別陣列輸入五位使用者的姓名和電話號碼,按姓名的字典順序排列後(姓名相同保持原位置),輸出使用者的姓名和電話號碼。 已知結構體型別如下: struct user { char name[20]; char num[10]; };
輸入描述:
輸入姓名字串和電話號碼字串。
輸出描述:
輸出按姓名排序後的姓名字串和電話號碼字串。
樣式輸入:
aa
12345
dd
23456
cc
34567
bb
21456
ee
12456
樣式輸出:
aa
12345
bb
21456
cc
34567
dd
23456
ee
12456

#include <stdio.h>
#include <string.h>
typedef struct user
{
    char name[20];
    char num[10];
}U;
void set_user(U *user, int length);
void set_user(U *user, int length)
{
    int i;
    for (i=0; i<length; i++)
    {
        scanf("%s%s", user[i].name,user[i].num);
    }
}
void sort_user(U *user, int length);
void sort_user(U *user, int length)
{
    int i;
    U user1;
    for (i=0; i<length-1; i++)
    {
        if(strcmp(user[i].name,user[i+1].name) > 0)
        {
            user1 = user[i];
            user[i] = user[i+1];
            user[i+1] = user1; 
        }
    }
}
void print_user(U *user, int length);
void print_user(U *user, int length)
{
    int i;
    for (i=0; i<length; i++)
    {
        printf("%s.\n",user[i].name);
        printf("%s.\n",user[i].num);
    }
}
int main(void)
{
    U user[5];
    set_user(user,5);
    sort_user(user,5);
    print_user(user,5);
    return 0;
}