立fang
学习内容:C语音
学习时间:6.11 - 8.10 (共60天)
学习资料:C Primer Plus 第6版
备注:初学,欢迎共同喜欢C语言一起共同学习,相互交流。后面开始逐渐更新代码,及对代码的理解。
7.21
知识体系大致搭建完成,历时41天。
接下来20天对于C语言中如下几个未掌握好的知识点做进一步的巩固:
数组、指针、对文件操作、二进制 和 链表。
继续加油。
7.18
学C以来写过的最长的程序。
程序目的是每次递增一秒,依次增加分,时,日,月,年。另外对于不同月份不同天数,及平年和闰年在二月的不同天数,用if函数作了判断。但是目前还不知道如何让每次循环间隔一秒?
#include <stdio.h>
#define RunTime 110000
struct dateAndtime* next_minutes(struct dateAndtime* dt);
struct date
{
int year;
int month;
int day;
};
struct time
{
int hour;
int minutes;
};
struct dateAndtime
{
struct date d1;
struct time t1;
};
int main(int argc, char const *argv[])
{
struct dateAndtime dt1 = {{2019, 10, 18},{10, 59}};
struct dateAndtime* p2;
struct dateAndtime* p = &dt1;
printf("It's %d年%d月%d日 %d : %d nown",
dt1.d1.year, dt1.d1.month, dt1.d1.day, dt1.t1.hour, dt1.t1.minutes);
printf("It's %d年%d月%d日 %d : %d nown",
p->d1.year, (*p).d1.month, p->d1.day, p->t1.hour, (*p).t1.minutes);
for (int i = 0; i < RunTime; ++i)
{
p2 = next_minutes(p);
printf("It's %d年%d月%d日 %d : %d nown",
p2->d1.year, (*p2).d1.month, p2->d1.day, p2->t1.hour, (*p2).t1.minutes);
}
return 0;
}
struct dateAndtime* next_minutes(struct dateAndtime* dt)
{
(*dt).t1.minutes += 1;
int monthday[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30 , 31};
if(((((*dt).d1.year % 4 == 0) && ((*dt).d1.year % 100 != 0)) || ((*dt).d1.year % 400 == 0) ))
monthday[1] = 29;
else
monthday[1] = 28;
if (((*dt).t1.minutes) == 60 )
{
(*dt).t1.hour += 1;
(*dt).t1.minutes = 0;
}
if (((*dt).t1.hour) == 24)
{
(*dt).d1.day += 1;
(*dt).t1.hour = 0;
}
if (((*dt).d1.day) > monthday[(*dt).d1.month - 1])
{
(*dt).d1.month += 1;
(*dt).d1.day = 1;
}
if (((*dt).d1.month) == 13)
{
(*dt).d1.year += 1;
(*dt).d1.month = 1;
}
return dt;
}
7.17
已经学了一大部分了,最近更新得比较少一些,沉迷学习无法自拔哈哈。刚学到结构里面的指针,似乎比数组里面的指针更容易理解一些。(独立写出30行代码了哈哈)
#include <stdio.h>
struct time changetime(struct time t);
struct time* changetimep(struct time* p);
struct time
{
int hour;
int mins;
} t1, t2;
int main(void)
{
struct time* p = &t1;
(*p).mins = 59;
p->hour = 9;
printf("t1 : %d : %dn", t1.hour, t1.mins);
printf("t3 : %d : %dn",changetime(t1).hour, changetime(t1).mins);
printf("t1 : %d : %dn", t1.hour, t1.mins);
printf("*p : %d : %dn", changetimep(p)->hour, changetimep(p)->mins);
return 0;
}
struct time changetime(struct time t)
{
struct time t3;
t3.hour = 8;
t3.mins = 58;
return t3;
}
struct time* changetimep(struct time* p)
{
p->hour = 7;
p->mins = 57;
return p;
}
7.2
写了个判断最大值的函数,通过运算符 ?: 来进行的判定,感觉比用条件来判断简洁很多。似乎越来越有意思了呢
int imax(int a, int b, int c)
{
return (a > b) ? ((a > c) ? a : ((b > c) ? b : c)) : (b > c ? b : (a > c ? a : c));
}
P288 ( 共730页 )
6.25
今天学完了第七章,刚开始学的时候在思考一个问题,如何输入一个字符串,计算并返回其中的单词数量、行数,在动手做的时候遇到了几个问题:
- 字符串一直输入没有结束
- 不知道怎么来判断行
后面解析看得也比较迷,还要乃至bool值来判断是否在单词中。
以下是第七章编程习题第1题,只用判断空格及换行字符即可,相对比较简单。
/*返回一个字符串中空格、换行字符和其他字符的数量*/
#include <stdio.h>
#include <ctype.h>
#define SPACE ' '
#define LINE 'n'
int main(void)
{
int sc = 0; //计算空格的数量
int nc = 0; //计算换行符的数量
int oc = 0; //计算其它字符的数量
char ch;
while ((ch = getchar()) != '|')
{
if (ch == SPACE)
sc++;
else if (ch == LINE)
nc++;
else
oc++;
}
printf("字符串中空格的数量为: %dn"
"换行符的数量为: %dn
其它字符的数量为:%dn", sc, nc, oc); /*使用了两种分隔输出内容的方法,活学活用*/
return 0;
}
明天做完第七章习题,一鼓作气进入第八章的学习。
优化了一下代码,能够在没有偶数或奇数时返回0,如下:(?: 真好用哈哈)
#include <stdio.h>
int main()
{
int num;
int oc = 0; //偶数的个数
int jc = 0; //奇数的个数
int osum = 0; //偶数的和
int jsum = 0; //奇数的和
scanf("%d", &num);
while (num != 0)
{
if (num % 2 == 0)
{
oc++;
osum += num;
}
else
{
jc++;
jsum += num;
}
scanf("%d", &num);
}
printf("偶数的个数:%dn偶数的平均值:%.2fn /*使用了两种分隔输出内容的方法,活学活用*/
奇数的个数:%dn奇数的平均值:%.2fn",
oc, osum == 0 ? 0 : (float)osum / oc, jc, jsum == 0 ? 0 : (float)jsum / jc);
return 0;
}
P214 ( 共730页 )
Day6
今天学完了第五章,并完成了第五章的全部练习。
练习题有9个,前面8个顺利完成,最后一个尝试了很多种,程序没有报错,但运行越来之后报错。
在第9题中定义了double类型的数,感觉对于浮点数的输入和输出还存在一些问题。
P137 ( 共730页 )
Day5
感觉对于字符格式化的输入输出还没理解清楚,有太多格式要求,并且在格式化输出时,如果使用错误的转换说明,程序也会按照一定的规律报错。
现在在学习运算符相关知识,后期需要使用到格式化输出时再回头重新学习一遍。
运算符常见的有五种:= + - * /
在C语言中没有指数运算符,需要中pow()函数来实现。
P112 ( 共730页 )
Day3
今天学习了如何定义符号常量
#define NAME value
以及头文件中包含的明示常量
今天学习的内容相对较少,工作比较多,但还是坚持学习了一点,明天一定补上来。
Day2
今天发现昨天下载的VS在C语言上兼容得不太好,正常使用输出函数scanf,运行的时候会报错,并且在一个文件夹下面不能够同时建立多个.c文件,所以每新建一个,就要把上一个文件移除,操作比较麻烦,当然,最主要原因是它会一直报错。
查找了资料,VS上面要使用安全性更高的scanf_s函数输出,但是这样当把源代码移至其它编译器上面有时候也会出现错误,另外其它的编译器上面可以直接用scanf函数输出,所以今天花了将近两个小时更换了编译器。首先安装了MinGW,接着安装了CodeBlocks,都是免费开源的软件,前面一个需要下载完整的安装包,如果在官网下载安装器,网络始终出现错误(需要VPN),后面一个正常下载安装,现在可以正常敲代码了。
今天主要对昨天没有学习完成的数据类型作了学习,并完成了关于数据类型的习题,现在涉及到的内容都是数据之间加减乘除的运算,还算比较简单。
觉得有点复杂的地方是关于浮点数,还没理清。
明天学习字符串相关内容!
Day1
今天学习了C语言的一些概念性东西,以及对于一个标准的C语言程序作了细致的分析;同时还学习了部分关于数据类型方面的知识。
因为C语言的严谨性,所以今天几乎写出来的每个C语言程序在执行时都会出现错误;刚开始学习,头文件stdio.h中包含输出函数 printf(),能做出很多东西出来,但是做不到和用户的交互,每次输出的内容都是固定的,如需修改要重新修改程序的源代码。
C语音在数据类型方面主面包括整数类型和浮点类型,具体在定义变量及输出变量时需要记忆的东西比较多。
明天继续加油!
PS: 今天学习使用的软件如下图,没有专门针对C语言的,但是可以通过新建C++的空项目来新建.c文件,学习前花了一点时间摸索了一下,大概知道了如何写代码,运行代码,感兴趣的朋友可以一起交流哟。