12天学好C语言——记录我的C语言学习之路(Day 2)

12天学好C语言——记录我的C语言学习之路

Day 2:

我建议大家每一天学习之前都仅凭记忆去敲前一天敲过的最后一个程序,或者敲前一天你认为最难最长的一个程序,如果一晚上的睡眠之后不看书还能敲的出来,那就非常不错了。至少这个程序你会记很长时间!

首先我们以一个程序敲开今天的学习。(program 2.1)

//求1-1/2+1/3-1/4+...+1/99-1/100的值
/*//program 2.1
#include<stdio.h>
int main()
{
    int sign=1;
    double term,sum=1,demo=2;
    while(demo<=100)
    {
        sign=-sign;     //while里面的这四行非常重要,将程序分城四个变量,sign单单表示分子,将符号全部提
        term=sign/demo; //到分子上来,可以看出分子是1和-1交替循环, 而sum从1开始计算,省略了第一个数1/1,
        sum=sum+term;   //所以demo从2开始,不断增加demo的数值,最后因为demo到100停止,所以while的循环条件
        demo++;            //就是demo的变化了。
    }
    printf("%f\n",sum);
    return 0;
}
*/

这种程序应该大家见过不少,可能有分子分母差个2,有的分子不全是1的,都大同小异,记住做类似题的关键在于抓住四个变量:sign(分子),demo(分母),sum(最后的结果,也就是求和),term(当前一项的值)。找到关键变量,自己现想算法也来的及。

我们知道,变量的类型有不少,上面我们都是对一些数值型的变量做运算,下面我们看一下字符型变量。(program 2.2)

/*//program 2.2
#include<stdio.h>
int main()
{
    char c='?';
    printf("%d %c",c,c); //分别按照整型和字符型输出字符'?',当然一个表示'?'的ASCII值,一个直接输出字符'?'
    return 0;
}
*/

再看一个程序(program 2.3)

 /*//program 2.3
#include<stdio.h>
int main()
{
    char a=120;  //改为int a=120;的话,结果不变,因为结果和a无关,a只是一个变量名,看结果要看120
    printf("%d %c",a,a);
    return 0;   
    
}*/

还有一个这样的程序,大家肯定也见过类似的(program 2.4)

/*//program 2.4
#include<stdio.h>
int main()
{
    char c1='V';
    char c2=c1+32;
    printf("%d\n",c2);
    printf("%c\n",c2);
    return 0;
}
*/

上面这几个程序敲一敲之后发现,都牵扯一个事情,就是int型和char型的变量可以隐式转换,后面的程序中还会有说明。另外读者一定要熟记ASCII值的特殊值(比如字母、数字的ASCII值)。
下面的 program 2.5 是一个验证程序,读者一定要敲一敲,敲完之后自然明白。

/*//program 2.5
#include<stdio.h>
int main()
{   
           int c6,c7; //int和char类型可以转化(隐式转化)。
    
    char c1,c2,c3,c4,c5;//-128~127之间的数值才可以用%d输出,超出界限会输出一个负整数,这跟你的
    //编译系统有关,要知道编译系统是一个系统软件,而不是应用软件。
    c1=-128;
    c2=128;
    c3=127;
    c4=-127;
    c5=0;     
    
    c6=97;
    c7=98;
    
    printf("c1=%d,c2=%d,c3=%d,c4=%d,c5=%d\n",c1,c2,c3,c4,c5);
    printf("c1=%c,c2=%c,c3=%c,c4=%c,c5=%c\n",c1,c2,c3,c4,c5);
    
    printf("c6=%c,c7=%c\n",c6,c7);
    printf("c7=%d,c7=%d\n",c6,c7);
    //如果是按照%c的格式输出的话,则要在ASCII表中查找有没有对应的字符,如果没有,则输出'?'
    return 0;
}
*/

我们再写一个求一元二次方程的程序(program 2.6)

/*//program 2.6
#include<stdio.h>
#include<math.h> //这也是一个头文件,里面包含sqrt函数
int main()
{
    double a,b,c,x1,x2,p,q;   //为了方便、美观,可以把变量一口气定义完毕,然后下面只写变量的组合加减
    scanf("%lf %lf %lf",&a,&b,&c);
    p=-b/2*a;
    q=sqrt(b*b-4*a*c)/(2*a);
    x1=p+q;
    x2=p-q;
    printf("%7.4f %7.4f",x1,x2);
    return 0;
}
*/

这里我们接触到了%lf,这种特殊的格式符,那么我们就来介绍一下常用的格式符。

//%lld双长整型     %ld长整型     %llf双长浮点型     %lf长浮点型

/*//program 2.7
#include<stdio.h>
int main()
{
    double a=1;
    printf("%20.15f",a/3);  //结果为   0.333333333333333  0前面有三个空格,
      return 0;               //因为整数部分有20-15=5位,除去小数点和0,还有三位需要补齐
}*/

//输出时数据向左对齐,右端补空格  %-m.nf  (好处是,如果前面整数部分不够的话,一般前面会
//有大量空格,但是将空格移至末尾,就好看许多了)

//注意的是%m.nf是说该数据一共有m位,小数点后有n位,整数部分有m-n位,若不够所设定的位数,小数点前的不够位数用空格补齐,小数点后的不够位数用0补齐。

下面看 program 2.8 ,我们对两个输入输出字符的函数作一下解释说明

/*//program 2.8
#include<stdio.h>
int main()
{
    char a,b,c;
    a=getchar();  //getchar(); 函数不仅能从键盘获得可显示字符,也能获得在屏幕上无法显示的字符(显然这里只能获得一个字符,不能多输入)
    b=getchar();  //输入时应该连续输入三个字符,中间不要打空格
    c=getchar();  //如果打上了空格,那么默认空格也是赋给了一个变量,即b
    putchar(a);   //如果输入一个字符再回车,再输入一个字符,那么还是默认三个字符
    putchar(b);   //第二个字符是  回车,赋给了b
    putchar(c);
    putchar('\n');
    return 0;
}
*/

当然,我们也可以这样组合使用这两个函数。(program 2.9)

/*//program 2.9
#include<stdio.h>
int main(){
    putchar(getchar());   //将接收到的字符输出,两个函数可以这样组合叠加。
    putchar(getchar());
    putchar(getchar());
    return 0;
}
*/

做一个简单的应用题:用getchar函数读入一个小写字母,把它转化为大写字母,再用putchar函数输出小写字母。(program 2.10)

/*//program 2.10
#include<stdio.h>
int main()
{
    char c1,c2;
    c1=getchar();
    c2=c1-32;   //这里不做解释,细心的读者应该明白
    putchar(c2);
    putchar('\n');
    return 0;
}
*/

当然我们也可以简化上面的程序。(program 2.11)


/*//program 2.11
#include<stdio.h>
int main()
{
    putchar(getchar()-32);
    return 0;    
}
*/

做了这么多简单的程序,目的是为了让大家先对C程序有一定的认知,但是就和数学题一样,不可能都是那么简单的,所以下面我们的程序会带一点点的简单的算法,更加深入的带大家探讨C程序的奥妙。


 /*//program 2.12
//求输入一个数,求他是不是素数;
#include<stdio.h>
int main()
{
    printf("请输入一个数,我们将判断他是否是素数\n");
    int a;
    scanf("%d",&a);
    int i;
    if(a==1)
        printf("%d是素数",a);
    else if(a==2)
        printf("%d不是素数",a);
    else
    {
        for(i=2;i<a;i++) //我们知道,素数是只能被自身和1整除的数,那么为了for循环方便,我们
        {                //把1和2单独拿出来判断,
            if(a%i==0)
        break;             //如果能整除,说明肯定不是素数了,那么直接跳出循环,此时的a值并没有被释放,所以转到         
        }                //下面的else里,直接输出不是素数。如果所有i遍历过来都没法整除a的话,那么肯定a是素数,
        if(a==i)                   //所以,a肯定就和自身相等了,因为i=a-1时跳出的循环,但是调出循环的时候又执行的一遍i++,
            printf(“%d是素数\n”,a);//因为表达式二运行完后运行for循环体,再运行表达式3,参照课本kp120(这里的课本当时我是看的谭浩强版的,这本书特别适合初学者看,不过看完之后你会觉得上面的算法很low,哈哈,就这么一说)
        else
            printf("%d不是素数\n",a);
    }
    return 0;
}
*/

/* //program 2.13
 //求两个数的最大公约数
 #include<stdio.h>
 int main()
 {
     printf("请先输入两个数字,我们接下来要计算这两个数的最大公约数\n");
     int m,n,temp,t;
     scanf("%ld %ld",&m,&n);
     if(m<n)    //先比较两个数的大小,然后将较小的值找出来
     {
         temp=n;
         n=m;
         m=temp;
     }
    for(t=n;t>=1;t—)   //两个数的最大公约数肯定小于这两个数,所以范围缩小到1~n(根据计算结果,设n为较小值)
    {
        if(m%t==0&&n%t==0)
        {
            printf("最大公约数是%d\n",t);
            break;
        }    
    }
    printf("%d\n",t);
    return 0;
 }
 */

我再学习的过程中,经常会发现之前不知道的一些知识点,我再写笔记的时候会立即记录下来,下面我对int和char之间的隐式转化又有了新的收获。为了体现我整个学习过程的阶段性,我没有把这里的隐式转化部分与之前的相关部分合并介绍,希望大家能见谅。

//int 和 char 之间的隐式转化
/*//program 2.14
#include<stdio.h>    //这个程序是正确的,因为int型可以隐式转化为char型。
int main()
{
    int a1=98;
    char c1=a1;
    printf("%c\n",c1);
    return 0;
} */

/*//program 2.15
//这个程序是错误的,因为char型转化为int型不可以。
#include<stdio.h>
int main()
{
    char c1=b;
    int a1=c1;
    printf("%d\n",a1);
    return 0;    
}*/

第二天的内容到此结束了,显然比第一天写的程序要多,因为慢慢的自己的水平是在不断提高的。第二天给大家的建议是,一定要把基础打好,基础好了,写的程序会越来越快,越来越好的。基础不扎实,越到后面学习,越是问题重重,你会不断翻看之前学习过的基础内容,而耽误自己的学习进度。

版权声明:本文为博主原创文章,未经博主允许不得转载。

posted @ 2015-07-19 17:10  王中尧  阅读(170)  评论(0编辑  收藏  举报