| 网站首页 | 业界新闻 | 群组 | 人才 | 下载频道 | 博客 | 代码贴 | 编程论坛
共有 198 人关注过本帖
标题:建立一个Student的对象数组包含学号,姓名,年龄,用三种指针形式输出(做个 ...
只看楼主 收藏
九转星河
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:长长久久
等 级:版主
威 望:40
帖 子:4669
专家分:13194
注 册:2016-10-22
结帖率:100%
  问题点数:0  回复次数:0   
建立一个Student的对象数组包含学号,姓名,年龄,用三种指针形式输出(做个纪念)~
建立一个Student的对象数组包含学号,姓名,年龄,用三种指针形式输出

计科的某个同学对这个作业进行求助,然后我就顺便弄了一段,哇,话说不知道那个同学的老师看见这段代码有何感想,不管了,自己弄了很长时间,其实关键是看看怎么整合代码,代码比较短的时候或者看不出什么,但代码多的时候却可以明显提高代码重用率以及方便分块维护,就当是个纪念吧~

程序代码:

/*建立一个Student的对象数组包含学号,姓名,年龄,用三种指针形式输出*/

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

#define ID id
#define NAME name
#define AGE age

#define FREE(p)    \
    do    \
    {    \
        free(p);    \
        p=NULL;    \
    }while (0)

#define CLEAN  while (getchar()!='\n')

#define GET_ARRAY_SIZE( arr )    \
    sizeof (arr)/sizeof (*arr)

#define _SCANF( id,name,age )    \
    \
    do    \
    {    \
        printf("请输入ID:");    \
        scanf("%u",(id));    \
        CLEAN;    \
        \
        printf("请输入姓名:");    \
        myScanf((name),sizeof (name));    \
        \
        printf("请输入年龄:");    \
        scanf("%u",(age));    \
        CLEAN;    \
        puts("");    \
    }while (0)

#define SCANF_STUDENT( INDEX,STU )    \
{    \
 printf("现在输入第%u个学生的信息:\n",( unsigned )(INDEX)+1);    \
     _SCANF(&STU#ID,STU#NAME,&STU#AGE);    \
}
#define _PRINT( id,name,age )    \
     printf("ID:%u\n姓名:%s\n年龄:%u\n\n",(id),(name),(age))
 
#define PRINT_STUDENT( stu )    \
    \
    do    \
    {    \
          _PRINT    \
         (    \
            stu#ID,stu#NAME,stu#AGE    \
         );    \
    }while (0)
   
#define FOR_EACH( i,num,size )    \
    for ((i)=(num);(i)!=(size);++(i))

#define STUDENT Student

typedef struct STUDENT
{
    unsigned ID;
    char NAME[10];
    unsigned AGE;
   
}STUDENT;

void nodeMal( void**,size_t );

char* myScanf( char*,size_t );

void input1(  STUDENT*,size_t  );
void input2(  STUDENT*,size_t  );
void input3(  STUDENT*,size_t  );

void print( STUDENT*,size_t );

int main ( void )
{
    const size_t size=2;
   
    STUDENT* stu=NULL;
   
    void (*p_input[])( STUDENT*,size_t )=    \
    {
        input1,input2,input3
    };
   
    const size_t p_size=GET_ARRAY_SIZE(p_input);
   
    size_t i;
   
    nodeMal(( void** )&stu,size);
   
    FOR_EACH(i,0,p_size)
    {
        printf("现在用第%u种方法输入%u个学生的数据数据:\n",( unsigned )i+1,( unsigned )size);
        (*p_input[i])(stu,size);
 
        print(stu,size);
    }
   
    FREE(stu);
   
    return 0;
}

void nodeMal(void** p,size_t size)
{
    *p=malloc(size);
   
    assert(*p);

    memset(*p,0,size);
}

char* myScanf(char* s,size_t size)
{
        
    char* p=NULL;
    fgets(s,size,stdin);
   
    if ((p=strchr(s,'\n'))!=NULL)
            *p='\0';
        else
            scanf("%*[^\n]%*c");
   
     return s;
}

void input1(  STUDENT* stu,size_t size )   
{   
    size_t i;   
   
    FOR_EACH(i,0,size)
        SCANF_STUDENT(i,stu[i].);
}

void input2(  STUDENT* stu,size_t size )
{
    size_t i;   
   
    FOR_EACH(i,0,size)
        SCANF_STUDENT(i,(*(stu+i)).);
}
void input3(  STUDENT* stu,size_t size )
{
    STUDENT* p;   
   
    FOR_EACH(p,stu,stu+size)
        SCANF_STUDENT(p-stu,p->);
}

void print( STUDENT* stu,size_t size )
{
    size_t i;
   
    puts("学生信息输出如下:\n");   
    FOR_EACH(i,0,size)
        PRINT_STUDENT(stu[i].);
}


[此贴子已经被作者于2018-3-29 15:42编辑过]

2018-03-29 15:38







关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.116052 second(s), 9 queries.
Copyright©2004-2018, BCCN.NET, All Rights Reserved