学习内容
1IP地址
基本概念:IP是Internet Protocol(网际互连协议)的缩写,是TCP/IP体系中的网络层协议。设计IP的目的是提高网络的可扩展性:一是解决互联网问题,实现大规模、异构网络的互联互通;二是分割顶层网络应用和底层网络技术之间的耦合关系,以利于两者的独立发展。根据端到端的设计原则,IP只为主机提供一种无连接、不可靠的、尽力而为的数据报传输服务。
2广域网
广域网(英语:Wide Area Network,缩写为 WAN),又称广域网、外网、公网。是连接不同地区局域网或城域网计算机通信的远程网。通常跨接很大的物理范围,所覆盖的范围从几十公里到几千公里,它能连接多个地区、城市和国家,或横跨几个洲并能提供远距离通信,形成国际性的远程网络。广域网并不等同于互联网。
在一个区域范围里超过集线器所连接的距离时,必须要通过路由器来连接,这种网上类型称为广域网。如果有北、中、南等分公司,甚至海外分公司,把这些分公司以专线方式连接起来,即称为“广域网”。
广域网的发送介质主要是利用电话线或光纤,由ISP业者将企业间做连线,这些线是ISP业者预先埋在马路下的线路,因为工程浩大,维修不易,而且带宽是可以被保证的,所以在成本上就会比较为昂贵。
一般所指的互联网是属于一种公共型的广域网,公共型的广域网的成本会较低,为一种较便宜的网上环境,但跟广域网比较来说,是没办法管理带宽,走公共型网上系统,任何一段的带宽都无法被保证。
局域网
局域网(Local Area Network(LAN))是一个可连接住宅,学校,实验室,大学校园或办公大楼等有限区域内计算机的计算机网络。相比之下,广域网(WAN)不仅覆盖较大的地理距离,而且还通常涉及固接专线和对于互联网的链接。 相比来说互联网则更为广阔,是连接全球商业和个人计算机的系统。
这些只是了解,说实话,不知道该从什么地方系统学起,有点迷茫,还好最近主要学C语言。
C语言指针
1数组与指针的
数组的数组名其实可以看作一个指针。看下例:例九:int array[10]={0,1,2,3,4,5,6,7,8,9},value; value=array[0]; //也可写成:value=array; value=array[3]; //也可写成:value=(array+3); value=array[4]; //也可写成:value=(array+4);上例中,一般而言数组名array 代表数组本身,类型是int[10],但如果把array 看做指针的话,它指向数组的第0 个单元,类型是int 所指向的类型是数组单元的类型即int。因此array 等于0 就一点也不奇怪了。同理,array+3 是一个指向数组第3 个单元的指针,所以(array+3)等于3。其它依此类推。
2结构体与指针
可以声明一个指向结构类型对象的指针。例十二: struct MyStruct { int a; int b; int c; }; struct MyStruct ss={20,30,40}; //声明了结构对象ss,并把ss 的成员初始化为20,30 和40。 struct MyStruct *ptr=&ss; //声明了一个指向结构对象ss 的指针。它的类型是 //MyStruct *,它指向的类型是MyStruct。 int pstr=(int)&ss; //声明了一个指向结构对象ss 的指针。但是pstr 和 //它被指向的类型ptr 是不同的。 请问怎样通过指针ptr 来访问ss 的三个成员变量?答案:ptr->a; //指向运算符,或者可以这们(ptr).a,建议使用前者ptr->b;ptr->c;又请问怎样通过指针pstr 来访问ss 的三个成员变量?答案:pstr; //访问了ss 的成员a。(pstr+1); //访问了ss 的成员b。(pstr+2) //访问了ss 的成员c。虽然我在我的MSVC++6.0 上调式过上述代码,但是要知道,这样使用pstr 来访问结构成员是不正规的,为了说明为什么不正规,让我们看看怎样通过指针来访问数组的各个单元: (将结构体换成数组)
3函数与指针
可以把一个指针声明成为一个指向函数的指针。int fun1(char *,int);int (*pfun1)(char *,int);pfun1=fun1;int a=(*pfun1)(“abcdefg”,7); //通过函数指针调用函数。可以把指针作为函数的形参。在函数调用语句中,可以用指针表达式来作为实参。例十四: int fun(char *); inta; char str[]=“abcdefghijklmn”; a=fun(str); int fun(char *s) { int num=0; for(int i=0;😉 { num+=*s;s++; } return num; } 这个例子中的函数fun 统计一个字符串中各个字符的ASCII 码值之和。前面说了,数组的名字也是一个指针。在函数调用中,当把str作为实参传递给形参s 后,实际是把str 的值传递给了s,s 所指向的地址就和str 所指向的地址一致,但是str 和s 各自占用各自的存储空间。在函数体内对s 进行自加1 运算,并不意味着同时对str 进行了自加1 运算。
C语言结构体
这周课堂细讲结构体,完善了许多自己以前自学的漏洞,独立完成了结构体有关的问题,学生成绩。
#include<stdio.h>
struct student
{
char name[10];
char num[8];
char sex[6];
float grades[5];
}ads[30],t;
float average(float asd[])
{
float sum=0.0;
for(int i=0;i<4;i++)
{
sum+=asd[i];
}
return (sum/4);
}
main()
{
for(int i=0;i<30;i++)
{
scanf("%s",ads[i].num);
scanf("%s",ads[i].name );
scanf("%s",ads[i].sex );
for(int j=0;j<4;j++)
{
scanf("%f",&ads[i].grades[j] );
}
ads[i].grades[4]=average(ads[i].grades);
}
for(int i=0;i<30;i++)
{
for(int j=0;j<30-i-1;j++)
{
if(ads[j].grades[4] <ads[j+1].grades[4])
{
t=ads[j];
ads[j]=ads[j+1];
ads[j+1]=t;
}
}
}
for(int i=0;i<30;i++)
{
printf("%s ",ads[i].num);
printf("%s ",ads[i].name);
printf("%s\n",ads[i].sex);
for(int j=0;j<5;j++)
printf("%f\n",ads[i].grades[j]);
}
}
c语言习题
写一个程序从输入文件中去读取四行大写字母(全都是大写的,每行不超过100个字符),然后用柱状图输出每个字符在输入文件中出现的次数。严格地按照输出样例来安排你的输出格式。
输入格式
四行字符,由大写字母组成,每行不超过100个字符
输出格式
由若干行组成,前几行由空格和星号组成,最后一行则是由空格和字母组成的。在任何一行末尾不要打印不需要的多余空格。不要打印任何空行。
输入输出样例
输入 #1 复制
THE QUICK BROWN FOX JUMPED OVER THE LAZY DOG.
THIS IS AN EXAMPLE TO TEST FOR YOUR
HISTOGRAM PROGRAM.
HELLO!
输出 #1 复制
*
*
* *
* * * *
* * * *
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
说明/提示
每行输出后面不允许出现多余的空格。
#include<stdio.h>
#include<string.h>
int main()
{
char a[100];
int b[26]={0};
int i,j,t;
for(i=0;i<4;i++)
{
gets(a);
for(j=0;j<strlen(a);j++)
{
if(a[j]>='A'&&a[j]<='Z')
{
t=a[j]-'A';
b[t]++; \\计数:每个大写字母出现的次数
}
}
}
t=b[0];
for(i=1;i<26;i++)
{
if(t<b[i])
{
t=b[i]; \\找到最大值
}
}
for(i=t;i>=1;i--)
{
for(j=0;j<26;j++)
{
if(b[j]>=i)
{
printf("* ");
}
else
printf(" ");
}
printf("\n");
}
for(i=0;i<26;i++)
printf("%c ",'A'+i);
printf("\n");
}
这个题关键在于理解输出行好事的情况。理解方法很多,但是基本的思路都差不多,即从最高输出*。
某蒟蒻迷上了“小书童”,有一天登陆时忘记密码了(他没绑定邮箱or手机),于是便把问题抛给了神犇你。
题目描述
蒟蒻虽然忘记密码,但他还记得密码是由一个字符串组成。密码是由原文字符串(由不超过 50 个小写字母组成)中每个字母向后移动 nn 位形成的。z 的下一个字母是 a,如此循环。他现在找到了移动前的原文字符串及 nn,请你求出密码。
输入格式
第一行:n。第二行:未移动前的一串字母
输出格式
一行,是此蒟蒻的密码
输入输出样例
输入 #1 复制
1
qwe
输出 #1 复制
rxf
说明/提示
字符串长度<=50
#include<stdio.h>
#include<string.h>
int main()
{
char a[50];
int i,n,t;
scanf("%d",&n);
scanf("%s",a);
for(i=0;i<strlen(a);i++)
{
printf("%c",(a[i]-'a'+n)%26+'a');
}
}
我们要求找出具有下列性质数的个数(包含输入的自然数nnn):
先输入一个自然数nnn(n≤1000n \le 1000n≤1000),然后对此自然数按照如下方法进行处理:
不作任何处理;
在它的左边加上一个自然数,但该自然数不能超过原数的一半;
加上数后,继续按此规则进行处理,直到不能再加自然数为止.
输入格式 111个自然数nnn(n≤1000n \le 1000n≤1000)
输出格式 111个整数,表示具有该性质数的个数。
输入输出样例 输入 #1
复制
6
输出 #1
复制
6
说明/提示 满足条件的数为
6,16,26,126,36,136
#include<cstdio>
int n,cnt=1;
void func(int x)
{
for(int i=1;i<=x/2;i++)
{
cnt++;
func(i);
}
}
int main()
{
scanf("%d",&n);
func(n);
printf("%d\n",cnt);
}
这段代码没啥说的,暴力递归,但是问题就是如果n过大,运行就会超时,递归嵌套太多。所以我查找资料,学习一种新的方式。
#include<stdio.h>
int main()
{
int n,i,f[1010];
f[0]=f[1]=1;
scanf("%d",&n);
for(i=2;i<=n;i++)
{
if(i%2==0)
{
f[i]=f[i-1]+f[i/2];
}
else
{
f[i]=f[i-1];
}
}
printf("%d\n",f[n]);
}
2n与2n+1(n为非负整数)的答案是一样的
这就是第一个规律
然后我们以n=8为例,手动模拟一下
一共有10组解
8
1 8 2 8 3 8 4 8
1 2 8 1 3 8 1 4 8 2 4 8
1 2 4 8
我打出的东西很像一棵搜索树。。。
当我们把8和8下面的左三棵子树放在一起(即8和下面三列),并将所有的8都改成7,我们能发现,我们得到了n=7时的所有解;
我们再把最右端的子树(即剩下的部分)中的所有8删去,我们得到了n=4时的所有解
就这样,我们可以得到一个递推式,
f(n)=f(n-1) //7=8-1
+f(n/2) //4=8/2
再结合之前发现的规律
就能得到:
n%20时
f(n)=f(n-1)+f(n/2)
n%21时
f(n)=f(n-1)