博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第三章:数组和字符串
阅读量:5084 次
发布时间:2019-06-13

本文共 6590 字,大约阅读时间需要 21 分钟。

2018-10-21-18:37:41

随学笔记

小计

<1>:比较大的数组一般定义在main函数外面,否则程序很容易出错。

<2>:memset 函数:

  原型:void *memset(void *s, int ch, unsigned int n); //将s中当前位置后面的n个字节 用 ch 替换并返回 s。

<3>:memcpy函数:

       原型:void *memcpy(void *dest, const void *src, unsigned int n);//从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。

1 #include 
2 #include
3 #include
4 using namespace std; 5 6 int main() 7 { 8 char s[20]="I ' m cruel king "; 9 char cpy[20];10 memcpy(cpy,s,(strlen(s)+1));11 printf("%s\n",cpy);12 return 0;13 }

 

<4>:sprinrf函数:

  原型:int sprintf(char *buffer, const char *format, [argument]...)

参数:

(1)buffer:是char类型的指针,指向写入的字符串指针;

(2)format:格式化字符串,即在程序中想要的格式;

(3)argument:可选参数,可以为任意类型的数据;

函数返回值:buffer指向的字符串的长度;

用法:

①:连接字符串

1 #include 
2 #include
3 using namespace std; 4 5 int main() 6 { 7 char buffer[10]; 8 char *a = "i'm "; 9 char *b = "cruel king !"; 10 sprintf(buffer, "%s%s", a, b); 11 printf("%s\n", buffer); 12 return 0; 13 }

 

②:将int型数字格式化为字符型

1 sprintf(buffer, "%d", 123456);执行后buffer即指向字符串“123456”

 

③:连接结尾没有'\0'的字符数组或字符串缓冲区:

1 #include
2 #include
3 using namespace std; 4 5 int main() 6 { 7 char a[] = {
'1', '2', '3', '4'}; 8 char b[] = {
'5', '6', '7', '8'}; 9 char buffer[10];10 sprintf(buffer, "%.4s%.4s", a, b);11 printf("%s\n", buffer);12 return 0;13 } /*在本例中,%.4s是指字符串的前四个字符。  For example   用scanf读取字符串时可以限制一次性读入的字符数 scanf("%.5f",str);前5个字符以后的输入留在输入缓冲区里    

 

④:如果想动态获取要处理的字符缓冲区长度时可以采用 sprintf(buffer, "%.*s%.*s", sizeof(a), a, sizeof(b), b);

⑤:strchr 函数:

  函数原型:char *strchr(const char* _Str,char _Val)
  头文件:#include <cstring>
  功能:查找字符串_Str中首次出现字符_Val的位置
  说明:返回首次出现字符_Val的位置的指针,返回的地址是被查找字符串指针开始的第一个与Val相同字符的指针,如果Str中不存在Val则返回NULL。
  返回值:成功则返回要查找字符第一次出现的位置,失败返回NULL。
⑥:isalpha函数:
  函数原型:int isalpha( int ch );
  头文件:#include <cctype>
  功能:判断ch是否为字母,若为英文字母,返回非0(小写字母为2,大写字母为1),若不是字母,返回0。
⑦:输入输出函数中:%o为八进制,%d为十进制,%x为十六进制。  
  %i表示有符号十进制整数,
它与%d相比较的优点:%i可以自动将输入的八进制或十六进制转换为十进制。
⑧:移位运算符:在C语言中,"乘以2"也可以写为"<<1",意思就是左移一位。类似的左移四位就是乘以2的四次方。"除以2"也可以写为">>1"。若要表示2的八次方也可以写为(1<<8)-1。移位运算符的优先级没有减法高。
⑨:原码,反码,补码。
  原码:规定正数的符号为0,负数的符号为1,其他位为真值的绝对值的二进制表示。
  反码:正数的原码与反码相同,负数的反码为符号位不变其他位按位取反。
  补码:正数的补码与原码相同,负数的补码为在其反码的基础上加一。
  计算机中数值广泛采用补码的形式来保存和计算。

课内练习:

蛇形填数:先利用memset函数将地图初始化为零,接着找到蛇头,设置一个递增器按照逻辑一 一循环填入即可。

循环条件中避开蛇碰到身体和自身的情况即可,当蛇走完全程退出总循环。

总体思路就和智能贪吃蛇一样,每次都按照上一次的方向前进,当判断出下一步会撞墙或者撞到自己时转向即可。

1 #include 
2 #include
3 #include
4 using namespace std; 5 6 int main() 7 { 8 int length,width,flag,x,y; 9 scanf("%d %d",&length,&width);10 int snack[width][length];11 memset(snack,0,sizeof(snack));12 flag=snack[x=0][y=length-1]=1;13 while(flag
=0&&!snack[x][y-1]) snack[x][--y]=++flag;16 while(x-1>=0&&!snack[x-1][y]) snack[--x][y]=++flag;17 while(y+1

 

竖式问题:

从小到大依次枚举如果符合条件就按照相应格式输出。

1 #include 
2 #include
3 #include
4 using namespace std; 5 6 int main() 7 { 8 int count=0; 9 char s[20],buf[99];10 scanf("%s",s);11 for(int abc=111;abc<=999;abc++){12 for(int de =11;de<=99;de++){13 int x=abc*(de%10),y=abc*(de/10),z=abc*de;14 sprintf(buf,"%d%d%d%d%d",abc,de,x,y,z);15 int flag=1;16 for(int i=0;i
\n",++count);21 printf("%5d\nX%4d\n-----\n%5d\n%4d\n-----\n%5d\n\n",abc,de,x,y,z);22 }23 }24 }25 printf("The number of solutions = %d\n",count);26 return 0;27 }

 

竞赛题目选学:

<1>:需要读入一连串连续的字符时可以采用while((c=getchar())!=EOF)读入。

For example

  例题3-2 QWERTU

      本题思路:利用常量数组储存所有字符,接着一次性读入字符串然后对单个字符依次处理。

1 #include
2 #include
3 using namespace std; 4 char s[]="1234567890-=QWERTYUIOP[]\\ASDFGHJKL;'ZXCVBNM,./"; 5 int main() 6 { 7 int i,c; 8 while((c=getchar())!=EOF){ 9 for(i=1;s[i]&&s[i]!=c;i++);10 if(s[i]) putchar(s[i-1]);11 else putchar(c);12 }13 return 0;14 } 

     

  例题3-3 回文词

 本题思路:利用常量数组储存每个字母所对应的镜像字符,只需对应位置的镜像字符是否相等即可。

    

1 #include 
2 #include
3 #include
4 #include
5 using namespace std; 6 const char*rev="A 3 HIL JM O 2TUVWXY51SE Z 8 "; 7 const char*msg[]={
"not a palindrome","a regular palindrome","a mirrored string","a mirrored palindrome"}; 8 char re(char ch){ 9 if(isalpha(ch)) return rev[ch-'A'];10 return rev[ch-'0'+25];11 }12 13 int main()14 {15 char s[30];16 while(scanf("%s",s)==1){17 int len=strlen(s);18 int p=1,m=1;19 for(int i=0;i<(len+1)/2;i++){20 if(s[i]!=s[len-1-i]) p=0;//判断是否回文21 if(re(s[i])!=s[len-i-1]) m=0;//判断是否镜像22 }23 printf("%s -- is %s.\n\n",s,msg[m*2+p]);24 }25 return 0;26 }

  例题3-4 猜数游戏的提示

    水题,注意输入输出即可。

1 #include 
2 #include
3 #include
4 using namespace std; 5 const int maxn=1010; 6 int ques[maxn],ans[maxn]; 7 8 int main() 9 {10 int n,Case=0;11 while(scanf("%d",&n)==1&&n){12 for(int i=0;i
=c2? b+=c2:b+=c1;29 }30 printf(" (%d,%d)\n",a,b-a);31 }32 }33 return 0;34 }

 

  例题3-5  生成元

    本题思路:将规定范围内所有数的最小生成元打表,接着直接查表输出即可。

1 #include 
2 #include
3 #include
4 using namespace std; 5 const int maxnumber=100000; 6 int ans[maxnumber]; 7 8 int main() 9 {10 int n,T;11 //将表所有元素初始化为零12 memset(ans,0,sizeof(ans));13 //将1-100000以内所有最小生成元打表14 for(int i=1;i<=maxnumber;i++){15 int y=i,x=i;16 while(x>0){17 y+=x%10;18 x/=10;19 }20 if(ans[y]==0||ans[y]>i)21 ans[y]=i;22 }23 scanf("%d",&T);24 while(T--){25 scanf("%d",&n);26 printf("%d\n",ans[n]);27 }28 return 0;29 }

 

  例题3-6 环状序列

     本题思路:所谓字典序,就是字符串在字典中的顺序。推广到任意序列时,例如序列1,2,4,7比1,2,5的小。本题先假设第零个位置为字典序最小的位置,接着从第一个开始遍历字符串,当遇到以

  s[i]开头的子串小于s[ans]开头的子串时让ans=i,当i=n-1时结束循环。

1 #include 
2 #include
3 #include
4 using namespace std; 5 const int maxn=105; 6 char s[maxn]; 7 int lessc(char*s,int p,int q,int n); 8 9 int main()10 {11 int T;12 scanf("%d",&T);13 while(T--){14 scanf("%s",s);15 int n=strlen(s),ans=0;16 for(int i=1;i

 

转载于:https://www.cnblogs.com/bianjunting/p/9826185.html

你可能感兴趣的文章
在centos上开关tomcat
查看>>
重启rabbitmq服务
查看>>
正则表达式(进阶篇)
查看>>
无人值守安装linux系统
查看>>
【传道】中国首部淘宝卖家演讲公开课:农业本该如此
查看>>
jQuery应用 代码片段
查看>>
MVC+Servlet+mysql+jsp读取数据库信息
查看>>
黑马程序员——2 注释
查看>>
用OGRE1.74搭建游戏框架(三)--加入人物控制和场景
查看>>
转化课-计算机基础及上网过程
查看>>
android dialog使用自定义布局 设置窗体大小位置
查看>>
ionic2+ 基础
查看>>
互联网模式下我们更加应该“专注”
查看>>
myeclipse集成jdk、tomcat8、maven、svn
查看>>
查询消除重复行
查看>>
Win 10 文件浏览器无法打开
查看>>
HDU 1212 Big Number(C++ 大数取模)(java 大数类运用)
查看>>
-bash: xx: command not found 在有yum源情况下处理
查看>>
[leetcode]Minimum Path Sum
查看>>
内存管理 浅析 内存管理/内存优化技巧
查看>>