目录
写在前面
本文代码是我自己所作,本人水平有限,可能部分代码看着不够简练,运行效率不高,但都能运行成功。另外,如果想了解更多,请订阅专栏
头歌C语言程序与设计
正文
第1关:字符逆序
题目描述
:输入一个字符串,输出反序后的字符串。样例输入:
123456abcdef
样例输出:
fedcba654321
#include<stdio.h>
#include<string.h>
int main(void)
{
/*********Begin*********/
char str[20]={0};
int i=0;
gets(str);
int len=strlen(str);
for(i=len-1;i>=0;i--)
{
printf("%c",str[i]);
}
/*********End**********/
return 0;
}
第2关:字符统计
题目描述:
对于给定的一个字符串,统计其中数字字符出现的次数。样例输入:
2
asdfasdf123123asdfasdf
asdf111111111asdfasdfasdf
样例输出:
6
9
#include<stdio.h>
int main(void)
{
/*********Begin*********/
int n=0,i=0,j=0,count=0;
char str[5][40]={0};
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%s",&str[i]);
}
for(i=0;i<n;i++)
{
j=0;
count=0;
while(str[i][j]!='\0')
{
if(str[i][j]>='0'&&str[i][j]<='9')
count++;
j++;
}
printf("%d\n",count);
}
/*********End**********/
return 0;
}
第3关:字符插入
题目描述
:输入两个字符串
a
和
b
,将
b
串中的最大字符插入到
a
串中最小字符后面。样例输入:
MynameisAmy
MynameisJane
样例输出:
MynameisAymy
#include <stdio.h>
#include <string.h>
int main(void)
{
/*********Begin*********/
int i=0,j=0;
char MAX,MIN;
char str1[100]={0};
char str2[100]={0};
gets(str1);
gets(str2);
int len1=strlen(str1);
int len2=strlen(str2);
//找最大字符
MAX=str2[0];
for(i=0;i<len2;i++)
{
if(MAX<str2[i])
MAX=str2[i];
}
//找最小字符
MIN=str1[0];
for(i=0;i<len1;i++)
{
if(MIN>str1[i])
{
MIN=str1[i];
j=i;
}
}
for(i=len1-1;i>j;i--)
{
str1[i+1]=str1[i];
}
str1[j+1]=MAX;
printf("%s",str1);
/*********End**********/
return 0;
}
第4关:字符串处理
题目描述
:编写程序,输入字符串
s1
和
s2
以及插入位置
f
,在字符串
s1
中的指定位置f处插入字符串
s2
。如输入
"BEIJING"
,
"123"
,
3
,则输出:
"BEI123JING"
。样例输入:
BEIJING
123
3
样例输出:
BEI123JING
#include<stdio.h>
#include<string.h>
int main(void)
{
/*********Begin*********/
char s1[200],s2[200];
int i,n;
gets(s1);
gets(s2);
scanf("%d",&n);
strcat(s2,s1+n);//把s1中n之后的字符串接到s2中
strcpy(s1+n,s2);//把s2整体复制到s1的n之后
printf("%s",s1);
/*********End**********/
return 0;
}
//本关使用字符串函数比较简单些
第5关:字符串统计
题目描述
:输入一段字符(由空格、字母和数字几种组成,保证开头不为空格),里面有若干个字符串,求这些字符串的长度和,并输出最长字符串内容,如果有多个输出最先出现的那个字符串。以
stop
作为最后输入的字符串。样例输入:
My name is Amy
My name is Jane
stop
样例输出:
11 name
12 name
变量作用须知:
i 用于倒序遍历字符串
WordLength 用于记录字符串中`单个单词的长度`
LongestWord 记录单词长度中的最大值
LongestWord_mark 记录最长单词的下标,方便后面打印输出
count 记录字符串中`所有单词的总长度`(不包含空格)——这就要求遍历一个非空格字符,count要+1
大题思路是,倒序遍历,遇到字符,单词长度+1和字符个数+1,遇到空格,记录最大单词长度,并将单词长度清零
下面拿实际例子来说,至于为什么倒着遍历,还得多看看题目的一个小要求😀
My name is Jane
stop
1.拿这个例子举例,首先输入My name is Jane,倒着从e遍历,遇到字符会执行这段代码,遍历M后循环结束
if(a[i]!=' ')
{
WordLength++;
count++;
}
2.中途遇到空格,会执行这段代码,更新一下LongestWord和LongestWord_mark,WordLength重置为0,方便记录下一个单词的长度
if(WordLength >= LongestWord)
{
LongestWord=WordLength;
LongestWord_mark=i //记录最长单词前的空格的下标
}
//遇到空格之后,单词长度重置
WordLength=0;
3.但是这样会有问题,遍历完M这时,需要执行1来计数,也需要执行2来判断最长单词,但实际上只会执行1
既执行1又执行2,但是if-else语句只执行其一
我的想法是将遍历到M的情况单独讨论,禁止在1中执行,而在2中单独列出来
#include<stdio.h>
#include <string.h>
int main( )
{
int i,WordLength=0,LongestWord_mark,count,LongestWord;
char a[1000];
//输入一行,判断一次,打印一次
while(1)
{
//输入
gets(a);
count=0,LongestWord=0,LongestWord=0,WordLength=0;
//终止条件
if(strcmp(a,"stop")==0)
break;
//倒序遍历
for(i=strlen(a)-1;i>=0;i--)
{
//处理字符(首字符除外)
if(a[i]!=' '&& i!=0)
{
WordLength++;
count++;
}
//处理空格和首元素
else
{
if(i==0)
{
count++;
WordLength++;
}
//将最长单词前,空格的下标记录
if(WordLength >= LongestWord)
{
LongestWord=WordLength;
LongestWord_mark=i+1;
//应对最长单词是首单词的情况
if(i==0)
{
LongestWord_mark=i;
}
}
//遇到空格之后,单词长度重置
WordLength=0;
}
}
//输出
printf("%d ",count);
for(i=LongestWord_mark;i<LongestWord_mark+LongestWord;i++)
printf("%c",a[i]);
printf("\n");
}
return 0;
}
第6关:字符串排序
题目描述
:输入
3
行,每行
n
个字符串,按由小到大的顺序输出样例输入:
cde
afg
abc
样例输出:
abc
afg
cde
#include<stdio.h>
#include<string.h>
int main(void)
{
/*********Begin*********/
char str[4][35];
int i;
for(i=0;i<3;i++)
gets(str[i]);
if(strcmp(str[0],str[1])>0)
{
strcpy(str[3],str[1]);
strcpy(str[1],str[0]);
strcpy(str[0],str[3]);
}
if(strcmp(str[0],str[2])>0)
{
strcpy(str[3],str[2]);
strcpy(str[2],str[0]);
strcpy(str[0],str[3]);
}
if(strcmp(str[1],str[2])>0)
{
strcpy(str[3],str[1]);
strcpy(str[1],str[2]);
strcpy(str[2],str[3]);
}
for(i=0;i<3;i++)
printf("%s\n",str[i]);
/*********End**********/
return 0;
}
写在最后
👍🏻点赞,你的认可是我创作的动力!
⭐收藏,你的青睐是我努力的方向!
✏️评论,你的意见是我进步的财富!