结构指针

结构指针的概念

结构指针就是指向结构变量的指针

例:

struct student s1={10,"wang",8,7,9},*p;

p=&s1;

第一条语句定义了struct student 类型的变量s1并初始化,另外还定义了一个结构指针变量

第二条语句使结构指针指向结构变量s1,结构指针的值实际上是结构变量的首地址

用*p访问结构成员
(*p).num=10;

(*p)的括号是不可少的,因为成员运算符“.”的优先级高于“*”的优先级。

用指向运算符->访问指针指向的结构成员
p->num=10;

在使用结构指针访问结构成员时,通常使用指向运算符->

结构指针作为函数参数

int score (struct student *p,int n,int num,int course,int score);

其调用语句

pos=score(students,n,num,course,score);

对应的实参是结构数组名students

PAT (Basic Level) Practice (中文)1003 我要通过!

1003 我要通过! (20 分)

答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。

得到“答案正确”的条件是:

  1. 字符串中必须仅有 PAT这三种字符,不可以包含其它字符;
  2. 任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
  3. 如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 abc 均或者是空字符串,或者是仅由字母 A 组成的字符串。

现在就请你为 PAT 写一个自动裁判程序,判定哪些字符串是可以获得“答案正确”的。

输入格式:

每个测试输入包含 1 个测试用例。第 1 行给出一个正整数 n (<10),是需要检测的字符串个数。接下来每个字符串占一行,字符串长度不超过 100,且不包含空格。

输出格式:

每个字符串的检测结果占一行,如果该字符串可以获得“答案正确”,则输出 YES,否则输出 NO

输入样例:

8
PAT
PAAT
AAPATAA
AAPAATAAAA
xPATx
PT
Whatever
APAAATAA

输出样例:

YES
YES
YES
YES
NO
NO
NO
NO
#include<stdio.h>
#include<string.h>
int main()
{
	int n,i;
	char s1[100];
	int count=0,j=0,k=0,num1,num2,num3,num;
	int a[20]={0}; 
	
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		count=0;num1=0;num2=0;num3=0;num=0; 
		scanf("%s",&s1); 
		for(j=0;j<=strlen(s1);j++)
		{
			if(s1[j]=='A'||s1[j]=='P'||s1[j]=='T')
			{
				count++;	
			}
		}
		for(j=0;j<=strlen(s1);j++)
		{
			if(s1[j]=='A')
			{
				num++;	
			}
		}
		j=0;
		while(s1[j++]!='P')
		{
			num1++;	
		}
		while(s1[j++]!='T')
		{
			num2++;
		}
		num3=strlen(s1)-num1-num2-2;
		if(count==strlen(s1)&&count>=3)
		{
			if(num3==num1*num2)
				a[k++]=1;
			else if(s1[0]=='P'&&s1[strlen(s1)-1]=='T'&&num==count-2)
				a[k++]=1;
			else
				a[k++]=0;
		}
		else
			a[k++]=0;
	}
	for(i=0;i<k;i++)
	{
		if(a[i]==1)
		printf("YES\n");
		else
		printf("NO\n");	
	}
}

个人认为这道题最难的就是对题目的理解,以下是我个人对于题目的分析:

如果 aPbTc 正确,则 aPbATca 正确

如果PAT(a=NULL,b=A,c=NULL)正确,则PAAT,PAAAT,PAAAAT等都正确。

如果APATA(a=A,b=A,c=A)正确,则APAATAA,APAAATAAA,APAAAATAAAA等都正确。

如果PATA(a=NULL,b=A,c=A)正确,则PAATA,PAAATA,PAAAATA等都正确。//这种情况不可能发生,因为“任意形如 xPATx 的字符串都可以获得’答案正确‘”。

如果APAT(a=A,b=A,c=NULL)正确,则APAATA,APAAATAA,APAAAATAAA等都是正确的。//这种情况不可能发生,因为”任意形如 xPATx 的字符串都可以获得’答案正确’

指针,数组和地址间的关系

联系:数组名本身是一个地址即指针值

区别:指针是以地址为值的变量,而数组名的值的值是一个特殊的固定地址,可以把它看作是指针常量。

例1

int a[40],*p;

系统分别把编号为3000,3004,3008等的内存字节作为数组元素a[0],a[1],a[2]等的地址(假设int型变量的长度是4个字节)。其中内存位置3000是数组a的基地址,也是a[0]的地址。

例2

假设a[0]的地址为3000,int类型变量的长度为4字节。

p=a;
p=&a[0];

它们都把3000这个地址赋给了指针p。

p=a+1;
p=&a[1];

它们都把3004这个地址赋给了指针p。

例3

设已对a的数组元素进行了赋值

数组求和法一
sum=0;
for(p=a;p<=&a[99];p++)
    num+=*p;

在循环中,指针变量p的初值是数组a的基地址,p连续取值&a[0],&a[1],&a[2]等。

数组求和法二
sum=0;
for(i-0;i<100;i++)
     sum+=*(a+1);

*[a+i]与a[i]等价,*[p+i]与p[i]等价。

数组求和法三
p=a;
sum=0;
for(i=0;i<100;++i) 
   sum+=p[i];

数组名可以使用指针形式,而指针变量也可以使用转换为数组形式。

 

 

PAT (Basic Level) Practice (中文)1002 写出这个数

读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。

输入格式:

每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 10100

输出格式:

在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。

输入样例:

1234567890987654321123456789

输出样例:

程序示例:
#include<stdio.h>
#include<string.h>
int main()
{
	int a[20];
	int sum=0,i=0;
	char s1[101];
	/*计算各数位之和*/
	gets(s1);
	while(s1[i]!='\0')
	{
		sum+=s1[i]-'0';
		i++;
	}	
	i=0;
	while(sum)
	{
		a[i++]=sum%10;
		sum=sum/10;
	}
	/*数字转化为拼音*/
	for(i=i-1;i>0;i--)
	{
		switch(a[i])
		{
			case 0:printf("ling ");break;
			case 1:printf("yi ");break;
			case 2:printf("er ");break;
			case 3:printf("san ");break;
			case 4:printf("si ");break;
			case 5:printf("wu ");break;
			case 6:printf("liu ");break;
			case 7:printf("qi ");break;
			case 8:printf("ba ");break;
			case 9:printf("jiu ");break;
		}
	}
	/*一行中最后一个拼音数字后没有空格*/
	switch(a[0])
	{
		case 0:printf("ling");break;
		case 1:printf("yi");break;
		case 2:printf("er");break;
		case 3:printf("san");break;
		case 4:printf("si");break;
		case 5:printf("wu");break;
		case 6:printf("liu");break;
		case 7:printf("qi");break;
		case 8:printf("ba");break;
		case 9:printf("jiu");break;
	}
	return 0;
}

做这个起初的想法是定义一个整型的n存储输入的数字,后来发现输入数位较大,改用字符串存储,通过s1[i]-‘0’将字符型化为整型。 对于如何使一行中最后一个拼音数字后没有空格,想了好久没有想到什么好主意,只能把最后一项单独拿出来进行考虑。

大数减法

这里我们来看看大数减法,思想不是很难,看了代码你就知道了。

主要思想:把每一位相减,减完之后从低位判断是否小于0,若小于0向前一位借一,前一位减一即可。

下面是代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<iostream>
using namespace std;
const int Max=10005;
string m,n;
int c[Max],d[Max],sum[Max];
int main()
{
	cin>>m>>n; 
	memset(c,0,sizeof(c));
	memset(d,0,sizeof(d));
	memset(sum,0,sizeof(sum));
	int len1=m.size(),len2=n.size();
		for(int i=len1-1,j=0;i>=0;i--,j++)
			c[j]=m[i]-48;
		for(int i=len2-1,j=0;i>=0;i--,j++)
			d[j]=n[i]-48;
		int len=max(len1,len2);
		for(int i=0;i<len;i++){
			sum[i]=c[i]-d[i];
			for(int i=0;i<len;i++)
				if(sum[i]<0){ //判断正负
					while(c[i]<0){
						c[i+1]-=1;
						c[i]+=10;
					}
				}
			for(int i=len-1;!sum[i];i--) len--;
			for(int i=len-1;i>=0;i--)
				printf("%d",sum[i]);
		}
}

 

本站已加入CDN加速

一直觉得网站打开的很慢,早就想申请一个CDN加速,无奈国内的CDN服务商都需要备案。作为一个新建站的小站长,自然没有备案号了。这件事也就不了了之。

不过最后还是忍不住了,就申请了一个CDN加速。我选择的是cloudflare,一家老牌CDN服务商。虽然是国外的,加速效果不如国内的理想,不过对我而言也是一个不错的选择了。

下面让我说说我是怎么申请的:

1.cloudflare简介

CloudFlare成立于2009年,是国外著名的免费CDN网站加速服务公司,CloudFlare 还提供实时安全保护服务和网络优化等,采用的是免费+增值模式,可以免费使用,也有收费服务。

CloudFlare的CDN节点主要分布于荷兰、美国、香港、法国、日本等国家和地区,使用CloudFlare在亚太地区的CDN节点可以大大加速你在美国或者欧洲的主机访问速度。

2.注册cloudflare

官方网站:dash.cloudflare.com

1.填写你的邮箱和密码,创建你的账号。

2.首次登录后就会进入引导界面,填写你要加速的站点,点击下方按钮即可

3.添加完网站后,cloudflare会提示要自动搜索你域名的解析记录,点击next确认,之后就会要求你选择服务方案,我们选择免费的即可,选好了确定进入下一步。

4.然后就进入到配置界面,你也可以手动添加或修改,支持A记录和CNAME记录,如像下边这样添加,可以添加上你所有的一级或二级域名,点击Add Record添加,点击Continue下一步。

5.根据自己的域名供应商的修改DNS教程修改自己的域名的DNS,我的域名是在万网购买的,去阿里云修改DNS即可。

6.修改好后就等待DNS修改生效就行了,生效时间各不相同,我的站点用了大概2个小时。

 

3.后话

以上就是我申请CDN加速的过程,真的很简单。其他的新站长朋友们如果还没有使用过CDN加速,可以来试一试。

常用的字符串处理函数

  • 1.字符串的输入和输出

  • scanf(格式控制字符串,输入参数表);

例:scanf(“%s”,s);(该函数遇回车和空格输入结束)

  • printf(格式控制字符串,输出参数表);

例:printf(“%s”,s);

  • gets(s)(输入的字符允许带空格)

 

  • puts(s)(输出时遇’\0’自动将其转化为’\n’)

2.字符串的复制,连接和比较及字符串的长度

  • 字符串复制函数char*strcpy(char*s1,char*s2)

参数s1必须是字符型数组基地址,参数s2可以是字符数组名或字符串常量

char s1[80],s2[80],a[80]=”hello”;

strcpy(str1,a); //把a中的字符串复制给str1

strcpy(str2,”world”);//把字符串常量“world”复制给str2

 

  • 字符串连接函数strcat(s1,s2)

char str1[80]=”hello”,str2[80],a[80]=”world”;

strcat(str1,a);//连接str1和a,结果为hello world

strcpy(str2,str1);//将str1中的字符串赋给str2

strcat(str2,”!”);//结果为hello world!

 

  • 字符串比较函数strcmp(s1,s2)

strcmp(“sea”,”sea”)的值为0,”sea’与”sea”相等

strcmp(“compute”,”compare”)的值(‘u’-‘a’)是个正数

strcmp(“happy”,”z”)的值(‘h’-‘z’)是个负数

strcmp(“sea”,”seat”)的值(‘\0-‘t’)是个负数

 

  • 字符串长度strlen(s1)例

strlen(“happy”)的值是5

p.s.

在应用标准库中的任何函数之前,必须提供函数原型。#include<string.h>

 

—–部分内容参考《c语言程序设计》(第三版)