注册 登录
LUPA开源社区 返回首页

仰空冥思 http://www.lupaworld.com/?26540 [收藏] [复制] [分享] [RSS]

我的博客

入门教学试探

热度 4已有 1652 次阅读2011-3-16 11:31 |个人分类:授课之感|系统分类:IT技术|

 与一位在企业工作但热衷于教学的老师,关于入门教学有诸多争论,焦点在于给鱼还是给渔。授人以渔是冠冕的说法。作为教师,我们可以在讲台上滔滔不绝地讲授对学生来说像天书一样的一套套理论。至于学生是否听懂或者老师是否从内心正真理解,因为理论的不可及,就难以检验了。
  那么,是否把鱼先塞给学生,让学生能拿得起,看得见摸得着,这看起来不失为一种有效的办法。但是,有一种隐隐的担心从心中升起,作为初学者,当他拿到一条鱼的时候,他是否会把鲫鱼当做是全部鱼类的象征,可是世界上鱼的种类有2万多种,这种单一的认识是否会制约初学者的思维?
  如此看来,授予渔和鱼是理想的途径,但如何赋之实施。几经思考,在大一的C教学中先实践一下,于是关于C中的函数给学生讲了一次课,其过程概述一下:
1.从main()函数入手,告诉大家函数其实是大家所熟知的东西。
2. 把没有返回值的main()函数改造为有返回值的(这其实是main函数的本来面目,但因为教材上没有这么讲,因此只好改造了),告诉大家函数长什么样的。
3. 让大家动手写一个z=max(x,y)的函数,想写成什么样就是什么样,至于正确与错误是无关紧要的,关键是写出自己心目中的函数。很多同学已经写对了
4. 我动手写出max()函数,告诉学生,其实,我是把一些同学的写程序搬到黑板上了,让学生建立一种自信,说明自己可以动手做没有见过的东西。
5. 从主函数中调用max(),从而引入几个概念:调用函数,被调用函数,实参,形参,从实例到抽象,把这些概念引出来,同时让这些抽象的概念落到地上。
6. 再增加一个函数,求两个数的最小数,学生几乎可以很快写出来了。这样打突破常规讲了一堆堆函数的概念和形式,但动起手来还不会写函数的弊病。尽管有些学生还是写的不对,但告诉学生写的不对纯属正常,接下来会越来越熟悉。
 
至此,把函数类型,返回值,实参,形参,调用函数,被调函数等概念全部引出来了。但有一个关键的点,就是为什么要引入函数还没有涉及到,这是讲函数的重点。
 
于是,又让学生动手写代码,要求很简单,就是就是做加减乘除,每个运算写一个函数,同时告诉学生写自己内心想到的,先不管对与错。5分钟后,看到很多学生写出了样子,但是很粗糙。
 
然后,告诉一个结构化的程序应该长成什么样的,把一个程序从0.01版开始改造,改造成附录中的1.0版,引入模块程序设计的思想,程序设计的风格,甚至从来没有接触过的指针,代码的可重用性等等软件工程中的概念。学生对这些一知半解,但告诉他们没有关系,在慢慢的接触中会体现在自己的代码中。还告诉学生,这个程序如何改造,成为一个有趣的小游戏,引入随机数函数,就可以给小学生出考题了,如此等等。

代码的演示和执行在Linux环境下进行,告诉大一学生如何使用Linux中的vim,gcc以及简单的命令等待。
 
本次讲授主要出发点就是让学生克服为难思想,固化的思维,建立起一种开放的思想,尤其是自学的方法和方向,不要像中学一样只局限于一章一章的学。
 

附 C代码:
#include <stdio.h>
#include <stdlib.h> 

int getOption (void); 
void getData (int* num1, int* num2); 
float calc (int option, int num1, int num2); 
float add (int num1, int num2); 
float sub (int num1, int num2); 
float mul (int num1, int num2); 
float divs (int num1, int num2); 
void printData (int nun1, int num2, int option, float result); 


int getOption (void) 
    int option; 

    printf("\t********************************"); 
    printf("\n\t* MENU *"); 
    printf("\n\t* *"); 
    printf("\n\t* 1. ADD *"); 
    printf("\n\t* 2. SUBTRACT *"); 
    printf("\n\t* 3. MULTIPLY *"); 
    printf("\n\t* 4. DIVIDE *"); 
    printf("\n\t* *"); 
    printf("\n\t********************************"); 

    printf("\n\nPlease type your choice "); 
    printf("and key return:");
    scanf ("%d", &option); 
    return option; 

void getData (int* a, int* b) 
    printf("Please enter two integer numbers:");
    scanf ("%d %d", a, b); 
    return; 

float calc (int option, int num1, int num2) 
    float result; 

    switch(option) 
    { 
        case 1 : result = add (num1, num2);       break;
 
        case 2 : result = sub (num1, num2);       break; 
  
        case 3 : result = mul (num1, num2);      break;
        
        case 4 : if (!num2 )  
                { 
                 printf("\n\a\aError:"); 
                 printf("division by zero\n");
                exit (100); 
                    } 
                else    
                result = divs (num1, num2);
        break; 
        default: printf("\aOption not available\n"); 
        exit (101);  
    } 
    return result; 

float add (int a, int b) 
    float sum; 

    sum = a + b; 
    return sum; /*可直接写为 return a+b */

float sub (int a, int b) 
    float dif; 

    dif = a - b; 
    return dif; 

float mul (int a, int b) 
    float product; 

    product = a * b; 
    return product; 

float divs (int a, int b) 
    float quotient; 

    quotient = (float)a / b; 
    return quotient;  

void printData (int a, int b, int option, float result) 
    switch(option) 
    { 
    case 1 : printf("\n%d + %d = %.0f\n", a, b, result);    break; 
 
    case 2 : printf("\n%d - %d = %.0f\n", a, b, result);     break; 

    case 3 : printf("\n%d * %d = %.0f\n", a, b, result);     break;

    case 4 : printf("\n%d / %d = %.2f\n", a, b, result);     break; 
 
    default: printf("\n\a\a未知错误!\n");      exit (102); 

    } 
    return; 
}


int main (void)    
    /*定义有意义的变量名*/
    int option; 
    int num1; 
    int num2; 
    float result;   

    option = getOption(); 
    getData (&num1, &num2); 
    result = calc (option, num1, num2); 

    printData (num1, num2, option, result);
    return 0; 

刚表态过的朋友 (0 人)

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册
验证问答 换一个 验证码 换一个

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部