大计基作业记录(4)

本文介绍了编程中涉及的多项技巧,包括判断回文数、统计字母频率、查找最多出现字符、闰年计算、字符串倒序输出、字符加密、去除多余星号、查找字符位置、统计选票以及字符串排序等。通过示例代码详细展示了每种操作的实现方法。
摘要由CSDN通过智能技术生成

第九周作业记录

q(≧▽≦q)、


1.判断一个正整数是否为回文数

代码示例

/*编写一个函数来判断一个正整数是否为回文数,若是则返回1,否则返回0。所谓回文数是指各位数字左右对称的数,例如1221、3553等。该函数的原型为: 
int ispalindrome(int n);  
其中参数n是待判断的正整数,该函数有返回结果。
编写主函数,对上述函数进行测试,并找出1000∽n (包括1000和n,1000 ≤ n <10000)之间的所有回文数,按从小到大的次序在屏幕上显示输出,每个数之间用一个空格分隔,最后一个数后面没有空格。
*/
//方法一:整数变成字符串,反转字符串法
//整数变字符串,加头文件#include<stdlib.h>,用char itoa(int num,char* str,int radix),radix是进制(如2,10,6)
//字符串变整数,同样的头文件,int atoi(const char *nptr),nptr是待转的整数字符串
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int ispalindrome(int n)
{
	char a[10],b[10];
		itoa(n, a, 10);   //整数转字符串
		strcpy(b, a); 
		strrev(a);   //反转字符串,记为b
		if (strcmp(a, b) == 0)   //若反转前后一样,则是回文数
			return 1;
		else return 0;
}
int main()
{
	int num, space = 0;
	scanf("%d", &num);
	for (int i = 1000; i <= num; i++)
		if (ispalindrome(i) == 1)
		{
			if (space != 0)printf(" ");
			printf("%d", i);
			space++;
		}
	return 0;
}
//方法二,针对本题只有四位回文数,函数可以设简单许多
/*#include<stdio.h>
int ispalindrome(int n);
int main()
{
	int num, space = 0;
	scanf("%d", &num);
	for (int i = 1000; i <= num; i++)
		if (ispalindrome(i) == 1)
		{
			if (space != 0)printf(" ");
			printf("%d", i);
			space++;
		}
		return 0;
}
int ispalindrome(int n)   //注意本题只有四位数字,所以只需判断四位回文数
{
	if (n / 1000 % 10 == n % 10 && n / 100 % 10 == n / 10 % 10)return 1;
	else return 0;
}*/

2.统计其中各个英文字母的出现次数

代码示例

#include<stdio.h>
int main()
{
	char string[200];
	int count = 0,douhao=0;
    gets (string);
	for (char j = 'A'; j <= 'Z'; j++)   //从A/a开始,确定一个字母,一个个数有几个
	{
		for (int i = 0; string[i] != '\0'; i++)   // 在字符串里一个一个数确定的字母个数
			if (string[i] == j || string[i] == j + 32) count++;
		if (douhao != 0)printf(",");    //输出
		printf("%d", count);
		count = 0;
		douhao++;
	}
	return 0;
}

3.找到出现最多的字符

代码示例

/*编写程序,要求在一个字符串中查找连续出现次数最多的一个字符,并显示其所在的开始下标和次数。(如果出现最多的字符不止一个,输出最靠前的字符)
输入:一个字符串(字符个数不超过100,无空格)
输出:出现最多的字符,次数,开始下标(这三个值之间用空格分隔,末尾无空格)*/
#include<stdio.h>
int main()
{
char input[100], cm;
int count = 1, countm = 0, subm, sub = 0,i;   //在设变量时,我们就把最大次数和下标初始化
gets(input);
cm = input[0];   //先把第一个字符当成出现最多的
for (i = 1; input[i] != '\0'; i++)   //我们从第二个字符开始找
  {
	if (input[i] == input[i - 1])	count++;   //如果这个数和上一个相同,则计数加一
	if (input[i] != input[i - 1])    //如果不同,则把已经计的数和最大计数比较,将最大的储存,并初始化计数,和下标开始记录下一个字符
	{
		if (count > countm)
		{
			countm = count;
			cm = input[i - 1];
			subm = sub;
		}
		count = 1;   //初始化,开始记录下一个字符的个数和下标
		sub = i;
	}
  }
//注意,上述for循环没有把最后一个数进行比较,所以还得单独比较一次
if (count > countm)
{
	countm = count;
	subm = sub;
	cm = input[i - 1];
}
printf("%c %d %d", cm, countm, subm);
return 0;
}

4.闰年计算

代码示例

/*闰年计算。程序输入一个正整数Y,以及另一个正整数N,以一个空格分隔。计算从Y年开始后的第N个闰年是哪一年(如果Y本身是闰年,则Y之后的第一个闰年是Y)。

输入格式:两个整数:Y和N。用空格分隔
输出个数:一个整数*/
#include<stdio.h>
int leapyear(int n)    //判断是否是闰年,若是则返回1,不是则返回0
{
	if(!(n%4)&&(n%100)||(!(n%400)) )return 1;
	else return 0;
}
int main()
{
	int Y, N, n=0;
	scanf("%d %d", &Y, &N);
	while (n < N)    //一年一年判断就好了
	{
		if (leapyear(Y) == 1) n++;
		Y++;
	}
	printf("%d", --Y);   //注意,最后一个while循环结束时多加了一年,要减掉。这里注意Y--和--Y的区别
	return 0;
}
/*i++,先返回i的值,再给i加一
++i,先给i加一,再返回i的值*/

5.按规则输出倒序字符串

代码示例

/*编写程序,按下列规则倒序输出子字符串。先输出最后的一个字符,再输出最后两个字符串,在再出后面三个字符..., 最后输出整个字符串。输入的字符串长度不超过100。
输入:一个字符串(无空格,字符个数不超过100)
输出:空格隔开的子字符串,用一个空格间隔。
输入输出样例:

student
t nt ent dent udent tudent student*/
//可以用两层循环来输出
#include<stdio.h>
#include<string.h>
int main()
{
	char a[100];
	int len, space = 0;
	gets(a);
	len = strlen(a);
	/*用for循环输出*/
	for (int i = len - 1; i >= 0; i--)   //从后往前调整每一组的第一个字符下标
	{
		if (space != 0)printf(" ");   //在输出下一组前输出空格
		for (int n = i; n < len; n++)  //输出每一组字符
			printf("%c", a[n]);
		space++;
	}
	return 0;
}

6.单词加密问题

代码示例

/*单词加密。输入一个字符串和一个非负整数k,对字符串中的每一个字母,用字母表中其后的第k个字母代替,不够k个时再从字母a循环计数。例如k=3是,a用d代替,A用D代替,x用a代替,y用b代替,保持大小写不变。字符串中的非字母字符不变。字符串的长度不超过100。

    输入:一个字符串(无空格)和非负整数k,之间用空格分隔
    输出:加密的字符串.
*/
#include<stdio.h>
char enc(char en, int kn)   //设一个加密函数,将每个字母按规则加密
{
    char enm;
    if (((en >= 'A' && en <= 'Z') && en + kn <= 'Z') || ((en >= 'a' && en <= 'z') && en + kn <= 'z')) enm = en + kn;   //如果字母不越界,加kn后输出
    else if ((en >= 'A' && en <= 'Z') && en + kn > 'Z') enm = 'A' + kn - 'Z' + en - 1;   //大写字母循环加密
    else if ((en >= 'a' && en <= 'z') && en + kn > 'z')  enm = 'a' + kn - 'z' + en - 1;   //小写字母循环加密
    else enm = en;   //如果不是字母,则不变
    return enm;
}//注,函数中的else与上面三个if并列,所以所以if必须加else,否则最后那个else就变成了和最邻近的if并列了
int main()
{
    char str[100];
    int k;
    scanf("%s %d",str, &k);
    for (int i = 0; str[i] != '\0'; i++)
        str[i]= enc(str[i], k);
    printf("%s", str);
    return 0;
}

7.按规则去掉字符串末尾多余的星号

代码示例

/*编写程序,去掉字符串末尾多余的星号。输入带星号(*)的字符串和n,使字符串尾部的*号不得多于n个;若多于n个,则删除多余的*号;若少于或等于n个,则什么也不做,字符串中间和前面的*号不删除。字符串的长度不超过200。字符串中的星号是英文星号。 
    输入:一个字符串(无空格,字符串长度不超过100)和一个非负整数,中间用空格隔开。
    输出:去掉多余*号的字符串。

样例:
***street**music****  2
***street**music**
*/
#include<stdio.h>
#include<string.h>
int main()
{
    char st[100];
    int n, num=0,j;
    scanf("%s %d", st, &n);
    strrev(st);   //反转字符串
    for (int i = 0; st[i] == '*'; i++) num++;   //数原来字符串末尾*数量
    if (num <= n)strrev(st);   //如果小于等于n,则不做操作,反转回来
    if (num > n)   //如果大于n,则用切割字符串的方法(把后面的字符往前移),修改*数量
    {
        for (j = 0; st[j + num-n] != '\0'; j++)   //每一项都变成它后面num-n项的数
            st[j] = st[j + num-n];
        st[j] = '\0';
        strrev(st);   //反转回来
    }
    printf("%s", st);
    return 0;
}

8.字符串中查找字符位置

代码示例

/*查找一个字符在字符串中出现的第一个位置并输出这个位置。位置从0开始。

输入输出格式:
输入:待查找的字符串(字符个数不超过100)和需要查找的字符,字符串中可能含有空格。(输入时,待查找的字符串与所需查找的字符用*号隔开)如:“待查找字符串*需要查找的字符”
输出:字符的位置(如有多个相同的字符,只查找第一个,如果没有输出-1。)
*/
#include<stdio.h>
#include<string.h>
int main()
{
	char st[102], seek;
	int judge = 0;
	gets(st);   //由于gets的输入结束是回车键,为了满足题目要求,我们只能把*<seek>也放到字符串里
	strrev(st);
	seek = st[0];   //找到待查数是什么
	strrev(st);
	for (int i = 0; st[i] != '*'; i++)  //一个一个找是否有待查找字符,注意这里找到*为止。
	{
		if (st[i] == seek)   //若找到,则跳出循环,输出位置
		{
			judge = 1;
			printf("%d", i);
				break;
		}
	}
	if (judge == 0)printf("-1");   //若没找到,输出-1
	return 0;
}

9.统计选票

代码示例

/*
统计选票。三个候选人分别是Li、Zhang和Wang, Li 的代号是1;Zhang的代号是2; Wang的代号是3。依次输入代表得票人代号的数字(即投票),直到输入-1则投票结束。然后统计每个人的得票数和废票数。不是-1,1,2,3的数字为废票。

输入:若干整数,最后一个数是-1。(输入的每个数之间有空格)
输出:四个整数,以空格隔开,代表三个人的Li、Zhang、Wang的得票数以及废票数。
输出格式:"%d %d %d %d\n"
*/
#include<stdio.h>
int main()
{
	int vote[4]={0}, x = 0;
	while (x != -1)
	{
		scanf("%d", &x);   //输入
		switch (x)         //判断
		{
		case 1:vote[0]++;
			break;
		case 2:vote[1]++;
			break;
		case 3:vote[2]++;
			break;
		case -1:break;
		default:vote[3]++;
		}
	}
	printf("%d %d %d %d", vote[0], vote[1], vote[2], vote[3]);
	return 0;
}

10.除首尾字符外降序排序

代码示例

/*输入一个字符串(长度不超过200,不包含空格,至少有1个字符),除首尾字符外,将其余的字符按ascii码降序排列,然后输出。
*/
//用冒泡法
#include<stdio.h>
#include<string.h>
void Bubble(char* s, int n)  //类似冒泡排序的排序函数
{
	for(int i = 1; i < n - 2; i++)
		for (int j = n - 2; j > i; j--)
			if(s[j]>s[j-1])
		{
				char temp = s[j];
				s[j] = s[j - 1];
				s[j - 1] = temp;
		}
}
int main()
{
	char st[201];
	int len;  
	scanf("%s", st);
	len = strlen(st);
	Bubble(st,len);
	printf("%s", st);
	return 0;
}

总结

注意一些语法上的小问题,譬如if-else结构,还有冒泡算法;
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值