数组学习3

1、一维字符数组:
一维字符组用于存放字符型数据,其定义、初始化、引用与其它类型的一维数组一样。
例如:char str[80] //定义一个有80个字符型元素的数组str
例1:char t[5] = {'H','A','P','P','Y'}; //初始化数组t
例2:static char s[6] = {'H','A','P','P','Y'}; //对static静态数组前5个元素赋初值,其余元素为0
注:整数0代表字符'\0',即ASCII码为0的字符。
数据初始化时,如果对所有元素赋了初值,就可以省略数组长度。
字符组数组的输出也用for循环来进行。


2、字符串:
字符串常量就是用一对双引号括起来的字符序列,即一串字符。
!!!它的结束标志为'\0','\0'是字符串结束符!!!
例如:字符串”Happy“由6个字符组成,分别是:'H'、'a'、'p'、'p'、'y'和'\0'。
static char s[6] = {'H','a','p','p','y','\0'};   等价于:static char s[6] = "Happy";
字符串的有效长度就是有效字符的长度,即上述字符串有效长度为5。
字符串长度由有效字符和字符串结束符'\0'组成。

1)字符串的存储——数据的初始化:
如上。
将字符串存储入字符型数组时,由于有字符串结束符'\0',数组长度至少是字符串的有效长度+1,
即字符串只占用了数组的一部分。

2)字符串的操作:
与普通字符数组的区别:由于字符串存在字符串结束符'\0',所以:
普通字符串数组的循环结束标志:很明确,为数组个数。
字符串循环的结束标志:等于'\0',一般通过比较是否等于'\0'来决定是否结束循环。

3)字符串的存储——赋值与输入:
将字符串存入数组,还可以采用赋值和输入的方法。
例如:static char s[80]; s[0] = 'a';  s[1] = '\0';
等价于:static char s[80] = "a";
!!!注意:'a'是字符常量,只有一个字符,可以赋值给字符变量。
!!!注意:"a"是字符串常量,包括两个字符'a'和'\0',用于一维字符数组存放。


例1:判断回文字符串。输入一个以回车符为结束标志的字符串(至少80个字符),判断该字符是否为回文。回文就是字符串中心对称,如:”noon“、”radar“、是回文,”reader“不是回文。

代码如下:

#include <stdio.h>
#define MAXLINE 80
int main(void)
{
	int i,k = 0,op;
	int a[MAXLINE];
    //以下为输入字符
	while((a[k] = getchar()) != '\n'){
		k++;
	}
	a[k] = '\0';
    //输入完毕
    //以下为从两端分别向中间比较是否字符相等的代码
	i = 0;
	k = k - 1;
	while(i < k){
        //不等的情况直接跳出循环
		if(a[i] != a[k]){
			break;
		}
		i++;
		k--;
	}
	if(i >= k){
		printf("Yes\n");
	}else{
		printf("No\n");
	}
	
	return 0;
}


比较:判断回文数。输入任意正整数,判断该数是否为回文数,所谓回文数就是从左到右读这个数与从右到左读这个数是一样的。例如12321、1221都是回文数。

代码如下:

#include <stdio.h>
int main(void)
{
	int num,numm,sum,a,c,b;
	scanf("%d",&num);
	sum = 0;
	numm = num;
	while(numm != 0){
		b = numm % 10;
		numm = numm / 10;
		sum = 10 * sum + b;
	}
	if(sum == num){
		printf("Yes\n");
	}else{
		printf("No\n");
	}
	
	return 0;
}


3、使用字符串编程:

例2:凯撒密码。输入一个以回车符为结束标志的字符串(少于80个字符),再通过一个正整数
offset,用凯撒密码将其加密后输出。凯撒密码是指将明文中的所有字母都在字母表上向后偏移
offset后被替换成密文。由于字符串少于80个字符,数组长度就取其上限80,以回车符'\n'作为
输入结束符。

代码如下:

#include <stdio.h>
#define MAXLINE 80
int main(void)
{
	int i = 0,offset;
	//以下为定义字符型数组 
	char str[MAXLINE];
	//定义完毕
	char ch;
	//以下为输入字符串进入数组
	while((ch = getchar()) != '\n'){
		str[i] = ch;
		i++;
	} 
	//以下还要输入字符串结束符 
	str[i] = '\0';
	//输入完毕
	//以下为输入字符偏移量 
	scanf("%d",&offset);
	if(offset > 26){
		offset = offset % 26;
	}
	//输入完毕
	
	//以下为对数组中的字符串进行加密处理
	for(i = 0;str[i] != '\0';i++){
		//1、对小写字母进行处理
		if(str[i] > 'a' && str[i] < 'z'){
			//考虑是否越位的情况
			if('z' - str[i] > offset){
				str[i] = str[i] + offset;
			}else{
				str[i] = 'a' + offset - 'z' + str[i];
			} 
		}
		//2、对大写字母进行处理,类比如上
		if(str[i] > 'A' && str[i] < 'Z'){
			//考虑是否越位的情况
			if('Z' - str[i] > offset){
				str[i] = str[i] + offset;
			}else{
				str[i] = 'A' + offset - 'Z' + str[i];
			} 
		} 
	}
	//处理完毕!
	//以下对数组进行输出
	for(i = 0;str[i] != '\0';i++){
		printf("%c",str[i]);
	} 
	printf("\n");
	//输出完毕! 
	return 0;
}

从中获得的启示:

字符串类数组一般为for循环一般用判断是否等于换行符'\n'来判断循环是否结束。


比较OJ系统练习:本题要求编写程序,将英文字母替换加密。为了防止信息被别人轻易窃取,
需要把电码明文通过加密方式变换成为密文。变换规则是:将明文中的所有英文字母替换为字母表
中的后一个字母,同时将小写字母转换为大写字母,大写字母转换为小写字母。例如,字母a->B、b->C、…、z->A、A->b、B->c、…、Z->a。输入一行字符,将其中的英文字母按照以上规则转换后输出,其他字符按原样输出。

非数组代码编程如下:

#include <stdio.h>
int main(void)
{
	int i = 0;
	char ch;
	while((ch = getchar()) != '\n'){
		if(ch >= 'a' && ch < 'z'){
			ch = ch + 1 - 'a' + 'A';
		}else if(ch >= 'A' && ch < 'Z'){
			ch = ch + 1 - 'A' + 'a';
		}else if(ch == 'z'){
			ch = 'A';
		}else if(ch == 'Z'){
			ch = 'a';
		}else{
			
		}
		printf("%c",ch);
		i++;
	}

	return 0;
}

数组代码编程如下:

#include <stdio.h>
#define MAXLINE 100
int main(void)
{
	char ch;
	char str[MAXLINE];
	int i = 0;
	while((ch = getchar()) != '\n'){
		str[i] = ch;
		i++;
	}
	str[i] = '\0';
	for(i = 0;str[i] != '\n';i++){
		if(str[i] >= 'a' && str[i] < 'z'){
			str[i] = str[i] + 1 - 'a' + 'A';
		}else if(str[i] == 'z'){
			str[i] = 'A';
		}else if(str[i] >= 'A' && str[i] < 'Z'){
			str[i] = str[i] + 1 - 'A' + 'a';
		}else if(str[i] == 'Z'){
			str[i] = 'a';
		}else{
			
		}
	}
	for(i = 0;str[i] != '\0';i++){
		printf("%c",str[i]);
	}
	printf("\n");
	
	return 0;
}

从中的启示:

!!!记得输入换行符'\n'!!!

!!!字符与数字之间的转换!!!
例3:字符转换。输入一个以回车符为结束标志的字符串(少于10个字符),提取其中的所有字符
('0',……,'9'),将其转换为一个十进制整数输出。由于字符串少于10个字符,数组长度就取其上限10,以回车符'\n'作为输入结束符。

代码如下:

#include <stdio.h>
#define MAXLINE 10
int main(void)
{
	char str[MAXLINE];
	char ch;
	int i = 0,number = 0;
	//以下为输入 
	while((ch = getchar()) != '\n'){
		str[i] = ch;
		i++;
	}
	str[i] = '\0';
	//输入完毕
	//以下对数字进行提取
	for(i = 0;str[i] != '\0';i++){
		if(str[i] >= '0' && str[i] <= '9'){
		//以下进行数字组合 
		number = number * 10 + str[i] - '0';
		} 
	}
	//处理完毕 
	printf("%d",number); 
	
	return 0;
}

!!!进制之间的转换!!!
例4:十六进制字符串转换成十进制非负整数。输入一个以'#'为结束标志的字符串(少于10个字符),滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数字的字符串,输入该字符串并将其转换为十进制数后输出。表示十六进制数字的字符为数字字                      符'0'、'1'、'2'、……、'9',大写英文字母'A'、'B'、'C'、'E'、'F'以及小写英文字母'a'、'b'、'c'、'd'、'e'、'f'。将十六进制字hexad[i]转换成十进制数number的表达式如下:
number = number * 16 + hexad[i] - '0'
number = number * 16 + hexad[i] - 'A' + 10
number = number * 16 + hexad[i] - 'a' + 10

代码如下;

#include <stdio.h>
#define MAXLINE 10
int main(void)
{
	char ch;
	char str1[MAXLINE];//原始数组
	char str2[MAXLINE];//处理后数组 
	int i = 0,number = 0,j = 0;
	//以下为输入 
	while((ch = getchar()) != '#'){
		str1[i] = ch;
		i++;
	}
	str1[i] = '\0';
	//输入完毕
	//以下为筛选十六进制字符串
	for(i = 0;str1[i] != '\0';i++){
		if((str1[i]>='0'&&str1[i]<='9')||(str1[i]>='A'&&str1[i]<='F')||(str1[i]>='a'&&str1[i]<='f')){
			str2[j] = str1[i];
			j++;
		} 
	} 
	str2[j] = '\0';
	//筛选完毕
	//以下对筛选后的数组元素进行输出
	for(i = 0;str2[i] != '\0';i++){
		printf("%c",str2[i]);
	} 
	printf("\n");
	//输出完毕
	//以下对十六进制字符转换为十进制整数
	for(i = 0;str2[i] != 0;i++){
		if(str2[i]>='0'&&str2[i]<='9'){
			number = number * 16 + str2[i] - '0';
		}else if(str2[i]>='a'&&str2[i]<='f'){
			number = number * 16 + str2[i] - 'a' + 10;
		}else if(str2[i]>='A'&&str2[i]<='F'){
			number = number * 16 + str2[i] - 'A' + 10;
		}
	}
	//转换完毕
	//以下进行输出
	printf("%d",number);
	//输出完毕
	 
	return 0;
}

代码运行如下: 

本章节数组全部学习完毕!

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值