C语言学习日记 week1
作为一名业外人士,时光辗转已经从学校毕业两年半了,经历了工作、考研(失败)、再找工作最终决定向一名程序员发展。虽说最近人工智能传的沸沸扬扬,未来要取代各种基础工作岗位(当然也包括程序员),但是我认为只要比机器人学的更深入就行了,如果学的不如机器人那做什么行业又不是一样是被取代呢?当然也是有很多行业职能是人工智能暂时难以触及的,不过很多对于我来说并不是很感冒,至少现在是的。
虽然报名学的Java,但是还未正式上课,老师先普及了一下C语言,为期两周,第一周已经结束了,同样也是在老师的建议下开通了这样的博客来记录学习过程。好处自然是很多的,只是对于一向不爱做笔记的我来说有点不舒服。不过该做的还是要做,不管是为巩固也好,完成任务也罢,如果认认真真记录每日所得总归是大有益处的,只是费些时罢了。
言归正传,已经学习C语言5天了,博客开的有些迟,就把这5天的重要内容回顾一下总结为一篇把:
首先作为一段程序的开始
#include <stdio.h>用来一用C语言的标准输入输出库;
void main(){}代表主程序,里面的程序作为主程序被编译,一般在所有的函数中()中的内容代表函数条件、 {}中写入函数执行的程序,每一句可执行的程序都必须以;作为结束(程序中的所有符号均为半角),void代表函数无 返回值,也可以写成 int main(void){程序+return 0;},代表返回值为零;
程序中可加入 //+注释内容 代表单行的注释 用以说明当前程序含义;
或者用/* 注释内容 */ 来进行多行注释,/* 代表注释开始,*/代表注释结束,注释的内容是不会被编译执行的;
这一周主要学习的几个函数:
1.printf("");
用来打印出""内的字符串,其中可以用%d,%f,%ld,%lf,%c等来代表不同类型的占位符,用来引用程序中的数据变 量,在""后面加上,进行依次分别引用。例:
#include <stdio.h>
void main()
{
int num=1; //int(整形)、float(浮点)、char(单字符) 指定义相应类型的变量
//不同类型变量分配的内存大小不同,而相应的所能代表的取值范围也不同
//num代表被声明变量名称 变量名称只能由字母(区分大小写)、数字、_、来组成且不能以数字开头 不能与关键字相同
//=为赋值符号,将=后的数值赋值给=前的变量
float numf=1.1;
char character=‘a’;
printf("输出%d/t%f/t%c/n",num,numf,character);
}
本段程序就是打印出 1 1.1
a
其中/t和/n分别代表制表位和换行
2.scanf("",&);
用来获取输入的数据;例:
#include <stdio.h>
void main()
{
int num; //变量num被赋值之后会根据赋值的类型在内存中分配一定的地址
prinf("请输入您需要给num的赋值:\n");
scanf("%d",&num); //%d 依旧是代表int类型的占位符,&代表取址符,&num就代表将前面输入的数据存入num被分配的地址中
//相当于num=输入的内容
printf("您输入的%d已经赋值给num\n",num); //程序会根据上下顺序一一执行
}
此段程序就是将输入值赋给变量num,然后打印;
3.if(){} else{} else if(){}
if(){}用于条件判断,()中的内容为条件为布尔类型,ture or false,如果为条件为真则执行{}中的语句,如果条件为假则不会执 行{}中的语句; else if(){}与if() {}连接使用,其()中的条件应与if()中的条件相; else{}表示如果前面的 if()和else if()条件均不满足则执行其下{}中的语句
{}可以省略而在满足()内条件的情况下执行if()或者else if()或者else()下面的一个语句;
其中if(){}可以单独使用,而else if{}和else{}只能与其上的if(){}成对使用;
例:
#include <stdio.h>
void main() //一段根据输入的年,月,日来计算该天是当年第几天的程序 { int year,month,day,feb,count; //feb代表二月份天数,count代表当年的第几天
printf("请输入年份:\n"); scanf("%d",&year); printf("请输入月份:\n"); scanf("%d",&month); printf("请输入日期:\n"); scanf("%d",&day); if((year%4==0&&year%100!=0)||(year%400==0)){ //()内的条件用于判断当前年份是否为闰年 //条件中%运算符代表求余,同样的运算符有+,-,*,/等, 若/的左右两侧均为int(short、long)型即整形则预算结果会自动取整
//条件中的==以及未出现的<,<=,>,>=为比较运算符用于比较符号两边的值 比较结果为ture/false
//条件中的!=,||,&&为逻辑运算符分别代表非,或,与 用于判断多个条件的ture/false
feb=29; //若条件为真则执行本行 否则执行else下面语句
}else{
feb=28;
}
//根据输入的不同月份计算count值 从而得到结果
if(month==1){
count=day;
}else if(month==2){
count=day+31;
}else if(month==3){
count=day+31+feb;
}else if(month==4){
count=day+31+feb+31;
}else if(month==5){
count=day+31+feb+31+30;
}else if(month==6){
count=day+31+feb+31+30+31;
}else if(month==7){
count=day+31+feb+31+30+31+30;
}else if(month==8){
count=day+31+feb+31+30+31+30+31;
}else if(month==9){
count=day+31+feb+31+30+31+30+31+31;
}else if(month==10{
count=day+31+feb+31+30+31+30+31+31+30;
}else if(month==11{
count=day+31+feb+31+30+31+30+31+31+30+31;
}else if(month==12{
count=day+31+feb+31+30+31+30+31+31+30+31+30;
}
//输出结果
printf("%d年%d月%d日是%d年中的第%d天\n",year,month,day,year,count);
}
4.switch(表达式){case 值1: case 值2: ... default :}
类似于if...else switch也是条件结构,不同的是switch其下{}中的 case 值 与()中的表达式相比较,如果相同则执行case 值:下的语句,否则执行default下语句;case后面所跟必须是一个特定的值;不同于if....else if语法,从表达式值等于某个case语句后的值开始,它下方的所有语句都会一直运行,并忽略其他case,直到遇到一个break为止,
假如任何一个case语句的值都不等于表达式的值,就运行可选标签default之下的语句;
例:
用switch结构写一段与上面相同的程序
#include <stdio.h>
void main()
{
int year,month,day,feb,count=0;
printf("请输入年份:\n");
scanf("%d",&year);
printf("请输入月份:\n");
scanf("%d",&month);
printf("请输入日期:\n");
scanf("%d",&day);
if((year%4==0&&year%100!=0)||(year%400==0)){
feb=29;
}else{
feb=28;
}
switch(month)
{
case 12:
count+=30;//这里的+=是运算符相当于count=count+30
//类似的还有-=,/=,*=用法一样
//还有一种++,--代表自+1或者自-1
case 11:
count+=31;
case 10:
count+=30;
case 9:
count+=31;
case 8:
count+=31; //其间如果出现break;则会跳过后面的case和default
case 7:
count+=30;
case 6:
count+=31;
case 5:
count+=30;
case 4:
count+=31;
case 3:
count+=feb;
case 2:
count+=31;
case 1:
count+=day;
}
printf("%d年%d月%d日是%d年的第%d天\n",year,month,day,year,count);
}
5.while(){} do{}while();
while是一种循环语法,()中的内容为循环执行的条件,如果()中条件为ture则执行{}中的程序,否则停止执行;
do..while不同与while,会先执行do{}内的程序后再进入while()中条件进行判断,如果ture则继续执行do{}中的程序,其中while作为一条单独的语句需要以;结尾;
例:
#include <stdio.h>
void main()
{
//打印100~1000之间所有的水仙花数,并统计其个数
int i=100;//循环变量
int count=0,ge,shi,bai,sum;
do{
ge=i%10;//获取个位
shi=i/10%10;//获取十位
bai=i/100; //获取百位
sum=ge*ge*ge+shi*shi*shi+bai*bai*bai;
if(sum==i){ //用于判定进入循环中的i值是否为水仙花数
//while,do....while,if等语句中都可以彼此嵌入
printf("%d\t",i);
count++; //用于计数
}
i++; //每次循环的间隔,i++代表每次循环后i的值+1
}while(i<1000); //()中为循环条件如果满足会一直执行do{}中程序
printf("\n100~1000之间共有%d个水仙花数",count);
}
循环嵌套的用法示例:
#include <stdio.h>
void main()
{
//打印正的等腰三角形
// *
// ***
// *****
//*******
int i=0,j,k;
while(i<4){ //外层循环控制行数
j=0,k=0;
while(j<3-i){ //找到变量与需要循环次数的关系
printf(" "); //利用空格定位
j++;
}
while(k<2*i+1){ //打印每一行星号
printf("*");
k++;
}
printf("\n"); //每一行的循环结束后换行
i++;
}
}
6.for(;;){}
for循环效果类似与while循环;都是在()中条件满足的情况下执行{}中的程序
在for循环中;是不能或缺的,表达式1,表达式2,表达式3都可以省略;
for(表达式1 ;表达式2 ;表达式3 ){//循环体;}
执行顺序: 初始化循环变量即表达式1;循环条件判断即表达式2;执行循环体即{}内语句;更改循坏变量即表达式 3;其中表达式1初始化循环变量,只执行1次;
例1:
#include <stdio.h>
void main()
{
/****************************************************
*************zhaoyi 2017.3.18 test2************
******根据用户输入的数据输出合适数量大小整齐排列的菱形
***************************************************/
//size代表菱形大小,row输出行数,colum输出列数,xyij内外循环变量
int size,row,column,x,y,i,j;
//获取用户输入信息
printf("请输入你要显示菱形的对角线长:\n");
scanf("%d",&size);
printf("请输入你要显示菱形的行数:\n");
scanf("%d",&row);
printf("请输入你要显示菱形的列数:\n");
scanf("%d",&column);
printf("\n");
for(x=0;x<column;x++){ //循环行数
for(i=0;i<size/2+1;i++){
for(y=0;y<row;y++){ //循环菱形的列数
for(j=0;j+i<size/2;j++){ //单个菱形的上半部分
printf(" ");
}
for(j=0;j<2*i+1;j++){
printf("*");
}
for(j=0;j+i<size/2;j++){
printf(" ");
}
}
printf("\n");
}
for(i--;i>0;i--){
for(y=0;y<row;y++){ //循环菱形的列数
for(j=0;j+i<size/2+1;j++){ //单个菱形下半部分
printf(" ");
}
for(j=0;j<2*i-1;j++){
printf("*");
}
for(j=0;j+i<size/2+1;j++){
printf(" ");
}
}
printf("\n");
}
}
printf("\n");
}
另外循环中可以插入break和contine关键字
break:跳出循环
continue: 跳过本次循环,继续下一次循环
例2:
#include <stdio.h>
void main()
{
/**********************************************
****打印0,1,2,3,4可以组成的数字各不相同的三位数
**********************************************/
int num,ge_5,shi_5,bai_5,count=0;
for(num=25;num<125;num++){
ge_5=num%5; //将十进制数转化为三位数的5进制(25~125对应100~1000)
shi_5=num/5%5; //并分别提取各位的数字
bai_5=num/5/5%5;
if(ge_5==shi_5||ge_5==bai_5||shi_5==bai_5){ //判定如果每位数字都不相同就跳过该循环
continue;
}
printf("%d%d%d\t",bai_5,shi_5,ge_5); //输出得到的五进制数字
count++; //循环计次
}
printf("\n\n0,1,2,3,4可以组成的数字各不相同的三位数有%d个\n",count);
}
写了这么多依然没有将这周老师所教授的全部总结到位,只是通过这一周学习的几个函数穿插几个典型的案例来阐述总结,不免疏漏、不到位或是出错的地方,最后两个案例是老师布置的周末作业,老师还未点评,不一定是最佳写法,不过我还是挺满意的。
至此结束本周的回顾。
ps:刚开始没发现注意到插入代码的功能懒得再改了,后续的再完善把~