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;
}*/
第二天的内容到此结束了,显然比第一天写的程序要多,因为慢慢的自己的水平是在不断提高的。第二天给大家的建议是,一定要把基础打好,基础好了,写的程序会越来越快,越来越好的。基础不扎实,越到后面学习,越是问题重重,你会不断翻看之前学习过的基础内容,而耽误自己的学习进度。
版权声明:本文为博主原创文章,未经博主允许不得转载。
12天学好C语言——记录我的C语言学习之路(Day 2)的更多相关文章
- 12天学好C语言——记录我的C语言学习之路(Day 12)
12天学好C语言--记录我的C语言学习之路 Day 12: 进入最后一天的学习,用这样一个程序来综合考量指针和字符串的关系,写完这个程序,你对字符串和指针的理解应该就不错了. //输入一个字符串,内有 ...
- 12天学好C语言——记录我的C语言学习之路(Day 11)
12天学好C语言--记录我的C语言学习之路 Day 11: 因为指针部分比较的难,所以我们花费的时间也是最长的,希望大家耐的住性子,多多理解,多多打代码.好了,废话不多说,来看第11天的学习. //编 ...
- 12天学好C语言——记录我的C语言学习之路(Day 10)
12天学好C语言--记录我的C语言学习之路 Day 10: 接着昨天的指针部分学习,有这么一个题目: //还是四个学生,四门成绩,只要有学生一门功课没及格就输出这个学生的所有成绩 /*//progra ...
- 12天学好C语言——记录我的C语言学习之路(Day 9)
12天学好C语言--记录我的C语言学习之路 Day 9: 函数部分告一段落,但是我们并不是把函数完全放下,因为函数无处不在,我们今后的程序仍然会大量运用到函数 //转入指针部分的学习,了解指针是什么 ...
- 12天学好C语言——记录我的C语言学习之路(Day 8)
12天学好C语言--记录我的C语言学习之路 Day 8: 从今天开始,我们获得了C语言中很有力的一个工具,那就是函数.函数的魅力不仅于此,一个程序到最后都是由众多函数组成的,我们一定要用好函数,用熟练 ...
- 12天学好C语言——记录我的C语言学习之路(Day 7)
12天学好C语言--记录我的C语言学习之路 Day 7: 昨天进行了一天的数组学习,今天大家可以先写几个昨天的程序热热身,回顾回顾,然后今天第一个新程序也是关于数组的,比较难,准备好就开始啦! //输 ...
- 12天学好C语言——记录我的C语言学习之路(Day 6)
12天学好C语言--记录我的C语言学习之路 Day 6: 今天,我们要开始学习数组了. //①数组部分,数组的大小不能够动态定义.如下: //int n; scanf("%d,& ...
- 12天学好C语言——记录我的C语言学习之路(Day 5)
12天学好C语言--记录我的C语言学习之路 Day 5: 第五天的学习开始了,今天我们主要对几个程序进行编写,让自己充分的熟练编程语言,大量的题目会让自己变的精炼.以一个程序(program 5.1) ...
- 12天学好C语言——记录我的C语言学习之路(Day 4)
12天学好C语言--记录我的C语言学习之路 Day 4: 首先来看一段程序: //输出下面4*5的矩阵 /* 1 2 3 4 5 2 4 6 8 10 3 6 9 12 ...
- 12天学好C语言——记录我的C语言学习之路(Day 3)
12天学好C语言--记录我的C语言学习之路 Day 3: 不知不觉到了第三天的学习,我们前两天学习的东西很杂乱,各个方面都有学习.我觉得这不是不系统,也不是学的不扎实,这种学习对于初学者而言我认为是很 ...
随机推荐
- iOS: ARC和非ARC下使用Block属性的问题
1. Block的声明和线程安全 Block属性的声明,首先需要用copy修饰符,因为只有copy后的Block才会在堆中,栈中的Block的生命周期是和栈绑定的,可以参考之前的文章(iOS: 非AR ...
- Windows 环境下基于 nginx 的本地 PyPI 源
Windows 环境下基于 nginx 的本地 PyPI 源的搭建: 1.登录 nginx 官网,下载安装包
- JNI-使用RegisterNatives注册本地方法
转自: http://blog.chinaunix.net/uid-26009923-id-3410141.html 1. 以前在jni中写本地方法时,都会写成 Java_com_example_he ...
- <meta 标签的详细使用
meta是用来在HTML文档中模拟HTTP协议的响应头报文.meta 标签用于网页的<head>与</head>中,meta 标签的用处很多.meta 的属性有两种:na ...
- DES 算法的 C++ 与 JAVA 互相加解密
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- Jfinal极速开发微信系列教程(一)--------------Jfinal_weixin demo的使用分析
概述: Jfinal_weixin已经出了有好一段时间了!一直在关注当中......最近工作上有需要到这个东西,所以,话了两个小时来看看这个东西,看完demo以后,豁然开朗,原理微信和一般的web项目 ...
- [AngularJS] angular-schema-form -- 1
Check out on gitHub, see the example on Demo page, see the document, extension. Mainly, there are th ...
- iOS开发——新特性OC篇&IOS9 系统新特性
IOS9 系统新特性 2015年6月89号凌晨召开的WWDC 2015苹果开发者大会发布了全新的iOS 9系统,PC6小编今天给大家整理了这次iOS9的系统更新带来了哪些新的功能与升级,本次新功能一览 ...
- javascript中false值及其常见比较运算
1. ture或者false的值 if判断中会被隐式转换成false的boolean类型的值有 false, 0, undefined , null , '', NaN(not a number) 除 ...
- Android(java)学习笔记135:Android中assets文件夹资源的访问
Android资源文件分类: Android资源文件大致可以分为两种: 第一种是res目录下存放的可编译的资源文件: 这种资源文件系统会在R.java里面自动生成该资源文件的ID,所以访问这种资源文件 ...