结构体类型、结构体变量、结构体数组、结构体指针

来源:互联网 发布:遥知天下事 编辑:程序博客网 时间:2024/06/07 10:20

【问题1】 一元钱换为1、2、5分的硬币,有多少种兑换方?
【本题要点分析及参考答案】

对各种可能情况进行一一测试。这是实现循环的一种方式(穷举法)。但实际上只有只有余额才能兑换成其它面值的硬币  */

main()

{      int i,j,k=0,n=100;                         /*k为方案数*/

                      for(i=0;i<=n/5;i++)                      /*5分币个数*/

    for(j=0;j<=(n-i*5)/2;j++)       /*2分币个数, 注意余额的问题,只有余额才能兑换*/

                             {  printf("5C:%d 2C:%d 1C:%d/n",i,j,n-i*5-j*2);  

                                  k++;

                            }

         printf("Total=%d/n",k);

}

 

【问题2】 设计九九加法表或乘法的算法。

main()

{    int i,j;

            clrscr();

            for(i=1;i<=9;i++)

               for(j=1;j<=i;j++)      printf("%d+%d=%-2d%2c",i,j,i+j,(i==j)?'/n':' ');

   }

 

 /*注意换行的控制和每一列的对齐*/

/*TC语言实现的算法之二,运行结果如右图所示*/

   main()

{    int i,j,k;

                   clrscr();

                   for(i=1;i<=9;i++)

      {  for(k=1;k<i;k++)  printf("%8c",' ');            /*控制左边空格的输出*/

                             for(j=i;j<=9;j++)

                                 printf("%d+%d=%-2d%2c",i,j,i+j,(j==9)?'/n':' ');

                         } /*注意换行的控制和每列的对齐*/

}

 

【问题3】 某铁路线上有10个站,需要准备多少种客票?

main()

{  int s,k,ps=0;

                  clrscr();

    for(s='A';s<='I';s++)         /*各站名称用分别用字母A–J表示*/

                       for(k=s+1;k<='J';k++)

    {  printf("%c-> %c   %c -> %c/n",s,k,k,s);

          ps+=2;                 /*车票统计时注意往返票,所以加2*/

      }

                     printf("ps=%d",ps);

}

 

 

【问题】结构体变量、结构指针变量、结构数组作为函数的参数应用实例分析。

struct stud

{  long int num;  

float score;

};

/*结构体变量作为函数的参数,修改之后的成员值不能返回到主调函数*/

void funvr(struct stud t)

{  t.num=2000101;

t.score=71.0; 

}

/*结构体数组作为函数的参数,修改后的元素的成员值能返回到主调函数*/

void funar(struct stud t[])

{  t[0].num=3000101;         /*注意结构体数组元素的成员的引用形式*/

t[0].score=81.0;

        t[1].num=3000102;

t[1].score=82.0;

}

/*结构体指针变量作为函数的参数,修改后的结构体成员的值能返回到主调函数*/

void funpr(struct stud *t)

{  t->num=4000101;          /*注意通过结构体指针变量引用成员的具体形式*/

(*t).score=92.0;

}

/*在主函数中分别调用上述函数修改成员值,再验证结果的正确性*/

main()

{  struct stud a[2]={{1000101,61.0}, {1000102,62.0}},b=a[0],*p;

printf("old b: b.num:%ld/tb.score:%f/n",b.num,b.score);  

/*显示结构体变量b的成员的原有值*/

        funvr(b);

/*验证第一种情况,观察并分析结果,看结构体变量作为函数参数时,形参结构体变量成员的值的改变能影响实参结构体变量的成员的值,以下为输出调用函数funvr(b)之后的结果值*/

printf("call funvr() new b: b.num:%ld/tb.score:%f/n ",b.num,b.score);

funpr(&b);            /*将结构体变量的指针对作为函数的参数*/

       printf("call funpr() new b: b.num:%ld/tb.score:%f/n ",b.num,b.score);

                            /*输出结构体数组a元素的原来的成员值*/

       printf("old a[0]:a[0].num:%ld/ta[0].score:%f/n ",a[0].num,a[0].score);

       printf("old a[1]:a[1].num:%ld/ta[1].score:%f/n ",a[1].num,a[1].score);

/*将结构体数组a作为函数的参数,然后再输出其元素的成员的值,已经被修改了*/

funar(a); 

      printf(" new a[0]:a[0].num:%ld/ta[0].score:%f/n ",a[0].num,a[0].score);

       printf("new a[1]:a[1].num:%ld/ta[1].score:%f/n ",a[1].num,a[1].score);

}

 

【题例分析】

1)结构体变量作为函数参数[实参与形参]时,形参结构体变量成员值的改变不影响对应的实参构体变量成员值的改变。

2)结构体数组或结构体指针变量作为函数参数[实参与形参]时,形参结构体数组元素[或形参结构体指针变量指向的变量]成员值的改变将影响对应的实参构体数组[或实参结构体指针变量指向的变量]成员值的改变。

3)结构体变量可作为函数的参数,函数可返回一结构体类数据

      4)p=&b; 使结构体指针变量p指向结构体变量b的空间。

            p->num:表示通过指针变量引用结构体变量b的成员num

5)p=a;或p=&a[0];将结构体指针变量指向结构体数组a。则:

             ①p->num:表示通过指针变量引用结构体数组元素的成员num的值。

             ②p->num++:表示通过指针变量先引用结构体数组元素的成员num的值,再使该元素的成员num的值加1,先引用其值然后其加1。

③++p->num:表示使指向的元素的成员num的值加1,再引用其值。

6)p=a;或p=&a[0];表示将结构体指针变量p指向结构体数组a。

           ①(p++)->num:表示通过指针变量先引用结构体数组元素  的成员num的值,再使指针变量本身加1,指针变量加1表示使指针变量指向结构体数组的下一个元素。

           ②(++p)->num:先使指针变量本身加1,先使使指针变量指向结构体数组的下一个元素,然后引用指针变量所指向的结构体数组元素的成员num的值。

原创粉丝点击