| 这个作业属于哪个班级 | C语言--网络2011/2012 |
| ---- | ---- | ---- |
| 这个作业的地址 | C博客作业00--我的第一篇博客 |
| 这个作业的目标 | 学习Makdown语法,对本专业及C语言课程有个简单了解,记录自学慕课视频的笔记。教师可以对学生有个初步的认识。 |
1.对网络工程的理解
网络工程专业主要讲授计算机科学基础理论、计算机软硬件系统及应用知识、网络工程的专业知识及应用知识。网络工程专业旨在培养具有创新意识,具有本专业领域分析问题和解决问题的能力,具备一定的实践技能,并具有良好的外语应用能力的高级研究应用型专门人才。--百度百科
我最初对于网络工程的理解并不是非常深刻,只是知道这是计算机类专业,且单纯地凭借字面意思认为这个专业是学习研究网络的生成,构建,维护。在这个高度数据化、电子化的时代,计算机总是对人有种莫名的吸引力。
小说、电视剧里对黑客的描写,与在我当时看来仿若天文的代码,都增添了它在我心中的神秘感,也激发了我对它的探索欲。
以下是当时查阅的资料[1]
主干学科
高等数学、线性代数、概率与统计、离散数学、电路与电子学、数字逻辑电路、数据结构、编译原理、操作系统、数据库系统、汇编语言程序设计、计算机组成原理、微机系统与接口技术、通信原理、通信系统、计算机网络、现代交换原理、TCP/IP原理与技术、计算机网络安全、计算机网络组网原理、网络编程技术、计算机网络管理、网络操作系统、Internet技术及应用、软件工程与方法学、数字信号处理、网格计算技术、计算机系统结构等。--百度百科
从上述资料,我大致了解了未来会在大学中学习到的课程。虽然我对这些只有名字的书本的内容没有具体的概念,但笼罩在网络工程这个我并不非常熟悉的名字上方的迷雾总算是消退了些许,我对它学习的大致方向有了一些了解,而不至于盲目。虽然第一眼看着感觉令人窒息
我了解到它学习的主要课程是数学和编程。
当然为了钱途前途着想,我也同样查询了网络工程的就业方向
就业方向
该专业学生毕业后可在国家机关、科研机构、学校、工厂等企事业单位从事计算机应用软件及网络技术的研究、设计、制造、运营、开发及系统维护和教学、科研等工作。--百度百科
同时经由多方资料,我了解到网络工程未来的发展有两个比较热门的方向:网络运维[2]和网络安全[3]
由于对网络运维知识的缺乏,在此我仅谈谈对网络安全的认知。
- 在我看来,网络安全对于个人与国家都是非常重要的。在高度信息化的时代,信息的保护是必不可少的。
对个人而言,信息关乎公民本身的隐私权,网络安全未做好而导致的信息泄露不仅侵犯了公民权益,同时也容易影响到其日常的生活;而对国家而言,没有信息安全就没有国家安全,国家的信息机密库是任何人都不能侵犯的,需要强力的保护。所以我认为,网络安全不仅会是现在的热点,在未来其热度也必将长盛不衰。
虽然现在我还并不清楚自己未来的发展方向,但我会努力顺应时代,重点考虑这两个方面的学习与发展,争取早日成为一个优秀的网络工程师。
2.对C语言的理解?
C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发。C语言能以简易的方式编译、处理低级存储器。C语言是仅产生少量的机器语言以及不需要任何运行环境支持便能运行的高效率程序设计语言。--百度百科
c语言是一种编程使用的程序语言,在编程领域中运用广泛,且其运算符多,运算范围大,这些都使其能够适应多种不同的编程要求,成了执行率最高、质量最高的程序语言。
由图可见,c语言的被使用频率及热度常年都是稳居高位的。
当然,c语言的安全性与变量的类型约束也是它的缺点。但瑕不掩瑜,c语言的广泛适用性,使团队的合作配合更加的方便易懂。且c语言是其他语言的基础,学会了c语言就对其他程序语言有了大概的框架,更便于后续的学习与提升。
所以我认为,在学习代码的最初,学好c语言是十分重要的。
3.希望在这个专业学到哪些内容?大学学习生活时间要怎么安排?(1分)
希望学到的内容
首先,作为大一新生,我希望在未来,通过大量的练习与学习,能熟练的掌握c语言,并能够对java,c++,python等编程语言有所涉入。
其次,我希望自己能对网络运维和网络安全这两个高热度的未来发展方面有所了解,并能掌握相关知识,便于毕业后找工作或继续深造。
最后,我希望还能学习更多计算机专业的知识,如网页设计,软件设计等,拓展自身视野,提升自身价值。
时间安排
- 课余时间至少花费两小时写代码,提升自身打代码能力。
- 在每节c语言课前做到预习,并找出疑难点,课后或课中解决。
- 周末权衡社团与学习的关系,尽量使周末每天学习编程时间不少于4小时。
- 多利用博客来记录编程过程中的重难点与错题。
4.我目前自学的内容
4.0 关于C的变量名
- 驼峰命名法
骆驼式命名法(Camel-Case)又称驼峰式命名法,是电脑程式编写时的一套命名规则(惯例)。正如它的名称CamelCase所表示的那样,是指混合使用大小写字母来构成变量和函数的名字。--百度百科
tip:第一个单词要以小写字母开始,从第二个单词开始以后的每个单词的首字母都采用大写字母,例如:myFirstName、myLastName。
下方是近期写的一段程序
#include<stdio.h>
double pow(int x, int y);
int main()
{
int n, units;
scanf("%d", &n);//输入
for (int i = pow(10, n - 1); i < pow(10, n); i++)
{
int sum = 0, count = 0;//重新定义变量,防止对循环产生影响
for (int x = i; x > 0;)
{
units = x % 10;//存储个位数
sum += pow(units, n);//计算各个数次上数的n次幂和
x = x / 10;
count++;//累计次数
if (count == n)//该数各个数位的n次幂和已计算完成
{
if (i == sum)//满足条件,该数为水仙花数
printf("%d\n", i);
}
}
}
return 0;
}
double pow(int x, int y)
{
double product = 1;
for (int i = 1; i <= y; i++)
{
product *= x;
}
return product;
}
4.1 c语言基础注意事项
在整个的代码编译过程中需注意或记忆的小细节
4.2 分支结构
对于要先做判断再选择的问题需要使用分支结构。分支结构的执行是依据一定的条件选择执行路径,而不是严格按照语句出现的物理顺序。
⭐语法
- 单一分支体
if(条件)
{
分支体
}
- 双分支体
if(条件)
{分支1}
else
{分支2}
- 嵌套分支语句
if(条件1)
{分支1}
else if(条件2)
{分支2}
else if(条件3)
{分支3}
......
else if(条件n)
{分支n}
else
{分支n+1}
- switch语句
switch(变量)
{
case 1:分支1;
break;
case 2:分支2;
break;
......
case n:分支n;
break;
default:分支n+1;
}
⭐疑难点
-
if-else
语句是依据不同的条件来选择执行路径,若已满足其中一个条件,其他就不再进入。 -
switch
语句使用时case
后要先加 -
switch
语句每个分支后要加break
。
⭐pta代码的实现
if-else
语句
#include <stdio.h>
int main()
{
int a,b;
double pay;//应付金额
char c;
scanf("%d %d %c",&a,&b,&c);//输入加油量a,汽油品种b,服务类型c
if(b==90)
{
if(c=='m')
{pay=a*6.95*(1-0.05);}
else if(c=='e')
{pay=a*6.95*(1-0.03);}
}
else if(b==93)
{
if(c=='m')
{pay=a*7.44*(1-0.05);}
else if(c=='e')
{pay=a*7.44*(1-0.03);}
}
else if(b==97)
{
if(c=='m')
{pay=a*7.93*(1-0.05);}
else if(c=='e')
{pay=a*7.93*(1-0.03);}
}
printf("%.2lf",pay);
return 0;
}
switch
语句
#include <stdio.h>
int main()
{
printf("[1] apple\n[2] pear\n[3] orange\n[4] grape\n[0] exit\n");
int n,i;
for(i=1;i<6;i++)
{
scanf("%d",&n);
if(n==0) break;
switch(n)
{
case 1:printf("price = 3.00\n");
break;
case 2:printf("price = 2.50\n");
break;
case 3:printf("price = 4.10\n");
break;
case 4:printf("price = 10.20\n");
break;
default:printf("price = 0.00\n");
}
}
return 0;
}
4.3 循环结构
在程序中需要反复执行某个功能而设置的一种程序结构叫做循环结构。它通过循环体中的条件,判断继续执行某个功能还是退出循环。
⭐语法
while
循环
while(条件)
{
循环体
}
do-while
循环
do
{
循环体
}
while(条件)
for
循环
for(条件1;条件2;条件3)
{
循环体
}
⭐疑难点
-
while
循环和do-while
循环的区别:前者是先判断再循环;后者是先进行一次循环后再判断。 -
for
循环括号内的条件可省略,但;
不能省。 -
对于嵌套循环,需注意循环内部参数的重新赋值,以免影响下次循环。
⭐pta代码的实现
while
循环
-while
后的条件括号内可以写表达式,例:
#include <stdio.h>
int main()
{
int a, b;
char c;
scanf("%d", &a);
while (scanf("%c", &c))
{
switch (c)
{
case'+': {scanf("%d", &b);a+=b; break; }
case'-': {scanf("%d", &b); a -= b; break; }
case'*': {scanf("%d", &b); a *= b; break; }
case'/':
{
scanf("%d", &b);
if (b == 0) { printf("ERROR"); return 0; }
else a /= b;
break;
}
case'=': {printf("%d", a); return 0; }
default: {printf("ERROR"); return 0; }
}
}
return 0;
}
do-while
循环
#include <stdio.h>
#include <math.h>
int main()
{
int i=1;
double eps,sum=0,t=1,n=1;
scanf("%lf", &eps);
do
{
t = n * (1 / ((3.0 * i) - 2));
sum += t;
i++;
n = -n;
} while (fabs(t) > eps);
printf("sum = %.6lf", sum);
return 0;
}
for
循环
- 嵌套循环要注意参数重新赋值,例:
#include <stdio.h>
int main()
{
int n, digit, figure, t, product;
scanf("%d", &n);
if (n == 0)
printf("0 ");
else
{
int number = n;//防止判断位数时n改变,影响输出
for (digit = 0; number > 0; digit++)//判断位数
{
number = number / 10;
}
for (int i = digit; i > 0; i--)//输出各位次的数
{
product = 1;//**对product重新赋值,防止对下次循环产生影响**
for (t = 1; t < i; t++)//计算pow(10,i-1)
{
product *= 10;
}
figure = n / product;
printf("%d ", figure);
n = n % product;
}
}
return 0;
}
4.4 函数
函数是一段可以重复使用的代码,用来独立地完成某个功能。
⭐疑难点
- 函数不能嵌套定义,必须在所有函数之外定义另外一个函数
main
也是一个函数定义,所以要将定义函数放在main
大括号的外面。 - 函数必须先定义后使用,所以要在开头写出函数的定义(即头文件)。
- 如果函数不接收用户传递的数据,那么定义时可以不带参数,例:
int answer()
{
int answer=0;
for(int i=0;i<10;i++)
{
answer*=i;
}
return answer;
}
tip:
①int是返回类型,可以是int、double、char等;
②answer是函数名,后面的`()`一定要有;
- 在开头处定义函数时不用写大括号,参数间用
,
隔开,例:
#int sum(int a,int b,int c);
⭐pta代码的实现
- 递归求Fabonacci数列
int f(int n)
{
int sum1=0, sum2=1, sum;
if (n == 0) sum = 0;
if (n == 1) sum = 1;
else if(n >= 2)
{
for (int i = 2; i <= n; i++)//注意,i=2,而不是3,因为f(2)=f(1)+f(0),其中f(2)为第二项,而不是第三项;
//f(0)不能算作第一项
{
sum = sum1 + sum2;
sum1 = sum2;
sum2 = sum;
}
}
return sum;
}
- 用函数输出水仙花数
int narcissistic(int number)
{
int n = number;
int k,x,t,sum=0;
int ret;
for (k = 0;n>0; k++)//判断位数
{
n = n / 10;
}
n = number;
while (n != 0)
{
x = n % 10;
t=1;
for (int i = 1; i <= k; i++)//计算每位数的次幂
{
t *= x;
}
sum += t;//计算各位次数次幂的和
n = n / 10;
}
n = number;
if (sum == n)
ret = 1;
else
ret = 0;
return ret;
}
void PrintN(int m, int n)
{
for (int i = m+1; i <n; i++)
{
if (narcissistic(i))
printf("%d\n", i);
}
}
4.5数组
数组是用于储存多个相同类型数据的集合。--百度百科
⭐语法
- 一维数组
int number[max];//max为数组内的最大元素数
- 二维数组
int number[m][n]//m为行数,n为列数
⭐疑难点
[]
内的数值为数组内元素的最大上限,不能超出。- 数组下标一般从0开始。
- 数组中的各元素的存储是有先后顺序的,它们在内存中按照这个先后顺序连续存放在一起。
- 必须是整数(如果是小数将四舍五入为整数)。
- 可用循环语句来遍历数组。
- 未初始化的数组元素均默认为0。
- 可用
a[]={1,2,3}
来初始化数组内的元素,即a[0]=1,a[1]=2;a[2]=3;a[3]=a[4]=······a[n]=0。
⭐pta代码的实现
- 一维数组
#include <stdio.h>
int main()
{
int n,i,t,min,max,digit = 0;
int arr[10];
scanf("%d", &n);
for (i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
//找出最小值
min = arr[0];
for (i = 1; i < n; i++)
{
if (arr[i] < min)
{
min = arr[i];
digit = i;
}
}
t = arr[0];
arr[0] = arr[digit];
arr[digit] = t;
//找出最大值
max = arr[0];
for (i = 1; i < n; i++)
{
if (arr[i] > max)
{
max = arr[i];
digit = i;
}
}
t = arr[n-1];
arr[n-1] = arr[digit];
arr[digit] = t;
for (i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
- 二维数组
找鞍点
#include <stdio.h>
int main()
{
int n, i, j,flag,max,maxj,cnt=0;
int arr[6][6];//定义二维数组
//int max[6];//定义数组储存各行最大值所对应的列数
//int min[6];//定义数组储存各列最小值所对应的行数
scanf("%d", &n);
for (i = 0; i < n; i++)//输入二维数组元素
{
for (j = 0; j < n; j++)
{
scanf("%d", &arr[i][j]);
}
}
for (i = 0; i < n; i++)
{
max= arr[i][0],maxj=0;
for (j = 1; j < n; j++)//寻找每行最大值
{
if (arr[i][j] >= max)
{
max= arr[i][j];
maxj= j;
}
}
flag = 1;
for (j = 0; j < n; j++)//判断maxj列上,max是否为最小值,让maxj列上的每一个数与max比较
{
if (arr[j][maxj] < max)//此时,max不为maxj列最小值
{
flag = 0;
break;
}
}
if (flag == 1)
{
printf("%d %d", i, maxj);
cnt++;//用于确定是否有鞍点
}
}
if (cnt == 0) printf("NONE");
return 0;
}
方阵循环右移
#include <stdio.h>
int main()
{
int n, i, j,flag,max,maxj,cnt=0;
int arr[6][6];//定义二维数组
//int max[6];//定义数组储存各行最大值所对应的列数
//int min[6];//定义数组储存各列最小值所对应的行数
scanf("%d", &n);
for (i = 0; i < n; i++)//输入二维数组元素
{
for (j = 0; j < n; j++)
{
scanf("%d", &arr[i][j]);
}
}
for (i = 0; i < n; i++)
{
max= arr[i][0],maxj=0;
for (j = 1; j < n; j++)//寻找每行最大值
{
if (arr[i][j] >= max)
{
max= arr[i][j];
maxj= j;
}
}
flag = 1;
for (j = 0; j < n; j++)//判断maxj列上,max是否为最小值,让maxj列上的每一个数与max比较
{
if (arr[j][maxj] < max)//此时,max不为maxj列最小值
{
flag = 0;
break;
}
}
if (flag == 1)
{
printf("%d %d", i, maxj);
cnt++;//用于确定是否有鞍点
}
}
if (cnt == 0) printf("NONE");
return 0;
}