《程序设计实践》第03练——字符串与结构体

《程序设计实践》第03练——字符串与结构体
注意:打开相关源程序后,只能在//********与//=======之间编写程序,若修改其它部分可能得0分。

  1. 字符串——删除小写字母

【题目描述】
从键盘输入一个字符串s,删除其中所有的小写字符后形成一个新字符串,然后输出。打开SC4_5B.cpp文件,完成程序的编写。
【输入】
输入文件SC4_5B.in有1行,包含1个字符串s。
【输出】
输出文件SC4_5B.out有1行,即删除后的新字符串。
【输入输出样例1】
SC4_5B.in SC4_5B.out
www.163.com .163.
【输入输出样例2】
SC4_5B.in SC4_5B.out
Visual Basic 6.0 V B 6.0
【数据限制】
字符串s长度小于30。

#include <stdio.h>
#include <string.h>
int main() {
	char s[30];	//待处理字符串
	int i,j;	//i,j-循环控制变量
	
	FILE *fp;
	if((fp=fopen("SC4_5B.in", "r")) != NULL ){
		fclose(fp);  //存在的话,要先把之前打开的文件关掉
		
		freopen("SC4_5B.in", "r", stdin);
		freopen("SC4_5B.out", "w", stdout);
	}

	gets(s);	//输入(接收)字符串
	//**********************************
	/*(1):方法1:删除字符串中的小写英文字母*/
	//i=0;
	//while(s[i]!='\0' && i<30){//字符非空,且在有效字符数组范围内
	//	/*(1)若当前字符为小写英文字母a~z*/
	//	if(s[i]>='a' && s[i]<='z'){//()若当前位(第i位)为小写字母
	//		for(j=i+1; j<30; j++){//当前小写字母的后续所有字符往前移一位
	//			s[j-1]=s[j];
	//		}
	//		//continue;
	//	}else{
	//		i++;
	//	}
	//}
	/*(2):方法2:删除字符串中的小写英文字母*/
	i=0; j=0;
	while (s[j]!='\0'){	//字符非空
		if (s[j]<'a' || s[j]>'z'){//若当前字符'不'为小写英文字母a~z,则保留下来-->复制到字符数组相应位置s[i]
			s[i]=s[j];
			i++;
		}
		j++;
	}
	s[i]='\0';
	
	/*(2)输出字符串*/
	printf("%s\n", s);	//或者 puts(s);
	//==================================
	return 0;
}

1.2. 拓展题:SC4_5C.cpp(本题25分)
【题目描述】
朱迪斯·恺撒在其政府的秘密通信中使用恺撒密码进行信息加密,恺撒加密因而得其名。凯撒密码的基本思想是将待加密的信息(称为明文)中每个字母在字母表中向后移动常量key(大写字母仍为大写字母,小写字母仍为小写字母),得到加密信息(称为密文)。例如,假设字母表为小写英文字母表,key等于3,则对于明文computer systems将加密为frpsxwhu vbvwhpv。打开SC4_5C.cpp文件,完成程序的编写。
【输入】
输入文件SC4_5C.in有2行,第1行是一个整数(key),第2行是1个字符串值s(value)。
【输出】
输出文件SC4_5C.out有1行,包含1个字符串,即加密后的字符串。
【输入输出样例1】
SC4_5C.in SC4_5C.out
3
computer systems frpsxwhu vbvwhpv
【输入输出样例2】
SC4_5C.in SC4_5C.out
5
www.163.com bbb.163.htr
【输入输出样例3】
SC4_5C.in SC4_5C.out
4
China TiMe.520.cOm Glmre XmQi.520.gSq
【数据限制】
字符串s长度小于100。
【提示】
必须需要ASCII码的范围是0~127,一个字符移动步长key后,是否还在此范围?

#include <stdio.h>
#include <string.h>

int main() {
	char s[100];	//字符串
	int i,key;		//i-循环控制变量; key-移动常量
	
	FILE *fp;
	if((fp=fopen("SC4_5C.in", "r")) != NULL ){
		fclose(fp);  //存在的话,要先把之前打开的文件关掉
		
		freopen("SC4_5C.in", "r", stdin);
		freopen("SC4_5C.out", "w", stdout);
	}

	scanf("%d",&key);	//输入(接收)移动常量
	getchar();			//获得换行(回车)符
	gets(s);			//输入(接收)字符串
	//**********************************

	/*
	//(1)方法1(有问题!!!):顺序遍历字符串中的各字符
	for(i=0; i<100 && s[i]!='\0'; i++){//字符非空, 且在有效字符数组范围内
		if(s[i]>='a' && s[i]<='z'){//【A】若当前位(第i位)为小写字母
			//printf("##1>s[i]=%c, int=%d, key=%d \n", s[i], s[i], key);
			//(A.1)字母在字母表中向后移动常量key (这里要特别注意:ASCII字母表中字符的最大值是127, s[i]+key的值不能超过此值!)
			s[i] += key;			
			//printf("##2>s[i]=%c, int=%d, temp=%d \n", s[i], s[i], temp);

			//(A.2)字母越界处理
			if(s[i] > 'z'){
				s[i] = 'a' + (s[i]-'z')%('z'-'a') - 1;	//注意 "-1"
				//printf("==>s[i]'=%c\n", s[i]);
			}
		}else if(s[i]>='A' && s[i]<='Z'){//【B】若当前位(第i位)为小写字母
			//(B.1)字母在字母表中向后移动常量key (这里要特别注意:ASCII字母表中字符的最大值是127, s[i]+key的值不能超过此值!)
			s[i] += key;
			
			//(B.2)字母越界处理 
			if(s[i] > 'Z'){
				s[i] = 'A' + (s[i]-'Z')%('Z'-'A') - 1;	//注意 "-1"
				//printf("++>%c\n", s[i]);
			}
		}
	}
	*/

	//(1)方法2(此方法不会出现 0~127 之外的整数赋值给字符的情况!):顺序遍历字符串中的各字符*/
	i=0;
	while (s[i]!=0){
		if(s[i]>='a' && s[i]<='z'){
			s[i]='a'+((s[i]+key-'a') % 26);	//或 s[i]='a'+((s[i]+key-'a') % ('z'-'a'+1));
		}else if(s[i]>='A' && s[i]<='Z'){
			s[i]='A'+((s[i]+key-'A') % 26);	//或 s[i]='A'+((s[i]+key-'A') % ('Z'-'A'+1));
		}
		i++;
	}
	
	/*(2)输出字符串*/
	printf("%s\n", s);	//或者 puts(s);
	//==================================
	return 0;
}
  1. 结构体——学生

【题目描述】
有n个学生,每个学生的数据包括学号、姓名和成绩,要求输出成绩优秀(90分及以上)学生的信息(包括学号、姓名和成绩)。如果没有符合条件的,则输出“No”。打开SC4_6B.cpp文件,完成程序的编写。
【输入】
输入文件SC4_6B.in有n+1行,第1行包含1个整数,即学生数n;接下来n行,每行有3个数据项,分别为学号、姓名和成绩,数据项之间用空格隔开。
【输出】
输出文件SC4_6B.out有3行,有多行,每行包含3个数据项,即学号、姓名和成绩,数据项之间用空格隔开。
【输入输出样例1】
SC4_6B.in SC4_6B.out
3
1001 Make 86
1002 Linda 58
1003 Jone 90 1003 Jone 90
【输入输出样例2】
SC4_6B.in SC4_6B.out
5
1011 Kitty 66
1012 Lena 48
1013 Marry 83
1014 Jack 50
1015 Mike 68 No
【数据限制】
学生数n大于1小于等于20,“学号”是4位整数,“姓名”为不超过8个字符的字符串,“成绩”为0~100。

#include <stdio.h>
int main() {
	struct student {	//学生结构体
		int num;		//学号
		char name[10];	//姓名
		int score;		//成绩
	};
	struct student stu[20];	//学生(结构体)数组
	int n,i,flag=0;		//n-学生个数;  i-循环控制变量;  flag-所有学生中是否有成绩优秀的->标识变量
	
	FILE *fp;
	if((fp=fopen("SC4_6B.in", "r")) != NULL ){
		fclose(fp);  //存在的话,要先把之前打开的文件关掉
		
		freopen("SC4_6B.in", "r", stdin);
		freopen("SC4_6B.out", "w", stdout);
	}

	scanf("%d",&n);		//输入(接收)学生个数
	for(i=0;i<n;i++){
		scanf("%d%s",&stu[i].num, stu[i].name);	//输入学生的学号\姓名
		scanf("%d",&stu[i].score);				//输入学生的成绩
	}
	//********************************************************
	/*(1)遍历所有n个学生,若发现优秀的,则输出相关信息*/
	for(i=0; i<n; i++){
		if(stu[i].score >= 90){//若此学生优秀,...
			//输入优秀学生的学号、姓名和成绩
			printf("%d %s %d\n", stu[i].num, stu[i].name, stu[i].score);

			//将是否有优秀学生的标识变量flag置为1--->有优秀学生!
			flag = 1;
		}
	}

	/*(2)如果所有学生中没有优秀的学生,则输出"No"*/
	if(!flag){
		printf("No\n");
	}	
	//========================================================
	return 0;
}

2.2. 拓展题:SC4_6C.cpp(本题25分)
【题目描述】
有n个学生,每个学生的数据包括学号、姓名和3门课程的成绩,要求输出平均成绩不少于90分或全部课程成绩均不少于85分的学生信息(包括学号和姓名),如果没有符合条件的,则输出“No”。打开SC4_6C.cpp文件,完成程序的编写。
【输入】
输入文件SC4_6C.in有n+1行,第1行有1个整数,即学生数n;接下来n行,每行有5个数据项,分别为学号、姓名和3门课程成绩,数据项之间用空格隔开。
【输出】
输出文件SC4_6C.out有多行,每行包含2个数据项,即学号、姓名,数据项之间用空格隔开。
【输入输出样例1】
SC4_6C.in SC4_6C.out
3
1001 Make 86 91 89
1002 Linda 78 78 80
1003 Jone 90 67 71 1001 Make
【输入输出样例2】
SC4_6C.in SC4_6C.out
5
1011 Kitty 66 71 79
1012 Lena 78 79 90
1013 Marry 83 77 78
1014 Jone 91 89 92
1015 Make 85 85 86 1014 Jone
1015 Make
【数据限制】
学生数n大于1小于等于20,“学号”是4位整数,“姓名”为不超过8个字符的字符串,“成绩”为0~100。

#include <stdio.h>
int main(){
	struct student{ // 声明一个结构体类型struct student	
		int num;		//学生学号
		char name[10];	//学生姓名
		int score[3];	//3门课程成绩
		double avg;		//总分
	};
	struct student stu[20];	//定义含20个元素结构体数组
	int i,j,n,flag=0;		//n-学生个数;  i,j-循环控制变量;  flag-所有学生中是否有成绩优秀的->标识变量
	
	FILE *fp;
	if((fp=fopen("SC4_6C.in", "r")) != NULL ){
		fclose(fp);  //存在的话,要先把之前打开的文件关掉
		
		freopen("SC4_6C.in", "r", stdin);
		freopen("SC4_6C.out", "w", stdout);
	}

	scanf("%d",&n);			//输入(接收)学生个数
	for (j=0;j<n;j++){
		scanf("%d%s",&stu[j].num,stu[j].name);	//输入学生的学号\姓名
		for (i=0;i<3;i++)
			scanf("%d",&stu[j].score[i]);		//输入学生3门课程的成绩
	}
	//********************************************************
	/*(1)遍历所有n个学生,若发现优秀的,则输出相关信息*/
	for(i=0; i<n; i++){
		//(1.1)计算当前学生stu[i]的平均成绩
		stu[i].avg = (stu[i].score[0] + stu[i].score[1] + stu[i].score[2])/3.0;

		//若平均成绩>=90 或 三门课的成绩均不少于85
		if(stu[i].avg >=90 || (stu[i].score[0]>=85 && stu[i].score[1]>=85 && stu[i].score[2]>=85)){
			//输入学生的学号、姓名
			printf("%d %s\n", stu[i].num, stu[i].name);

			//将是否有满足条件的学生的标识变量flag置为1--->有!
			flag = 1;
		}
	}

	/*(2)如果没有满足条件的学生,则输出"No"*/
	if(!flag){
		printf("No\n");
	}
	//========================================================
	return 0;
}

不要忘记留下你学习的脚印哦【点赞+收藏+评论】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值