问题:
文章编辑
功能:输入一页文字,程序可以统计出文字、数字、空格的个数。
静态存储一页文章,每行最多不超过80个字符,共N行;要求(1)分别统计出其中英文字母数和空格数及整篇文章总字数;(2)统计某一字符串在文章中出现的次数,并输出该次数;(3)删除某一子串,并将后面的字符前移。
存储结构使用线性表,分别用几个子函数实现相应的功能;
输入数据的形式和范围:可以输入大写、小写的英文字母、任何数字及标点符号。
输出形式:(1)分行输出用户输入的各行字符;(2)分4行输出"全部字母数"、"数字个数"、"空格个数"、"文章总字数"(3)输出删除某一字符串后的文章;
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include "string.h"
#include<time.h>
#define MaxSize 256
//链表的插入操作
void insertElem(char *sqlist,int*len,int index,char elem){
if(index>(*len)||index<0){
printf("Error!");
exit(1);
}else {
for(int i=*len;i>=index;i--)
sqlist[i+1]=sqlist[i];
sqlist[index]=elem;
*len=*len+1;
}
}
//链表的删除操作
void deleteElem(char *sqlist,int*len,int index){
if(index>(*len)||index<0){
printf("Error!");
exit(1);
}else
{
for(int i=index;i<*len;i++)
sqlist[i]=sqlist[i+1];
*len=*len-1;
}
}
void initSqlist(char *sqlist){
int index=0;
while(index<MaxSize){
char ch=getchar();
if(ch==‘#‘){
sqlist[index]=ch;
break;}
sqlist[index]=ch;
index++;
}
}
int sum_A(char*sqlist,int len){
int in_len=0;
for(int i=0;i<len;i++){
if(sqlist[i]>=‘A‘&&sqlist[i]<=‘Z‘||sqlist[i]>=‘a‘&&sqlist[i]<=‘z‘){
in_len++;
}
}
return in_len;
}
int sum_B(char*sqlist,int len){
int in_len=0;
for(int i=0;i<len;i++){
if(sqlist[i]==‘ ‘){
in_len++;
}
}
return in_len;
}
int sum(char*sqlist){
int in_len=0;
while(sqlist[in_len]!=‘#‘){
in_len++;
}
return in_len;
}
int sum_C(char*sqlist,int len){
int in_len=0;
for(int i=0;i<len;i++){
if(sqlist[i]!=10){
in_len++;
}
}
return in_len;
}
void print_A(char *sqlist,int len){
for(int i=0;i<len;i++){
printf("%c",sqlist[i]);
}
printf("\n");
}
void print_B(char *sqlist,int len){
printf(" 其中字母总数:%d\n",sum_A(sqlist,len));
printf(" 其中空格总数:%d\n",sum_B(sqlist,len));
printf(" 其中文字总数:%d\n",sum_C(sqlist,len));
}
int sun_Char(char*sqlist,int len1,char* substr,int len2){
int flag=0;
for (int i=0;i<len1;i++)
{
for(int j=0;j<len2;j++){
if(sqlist[i+j]!=substr[j])
break;
}
if (j==len2)
{
flag++;
}
}
return flag;
}
void delete_sub_str(char *str, char *sub_str, int *len1,int *len2);
int main(){
char sqlist[MaxSize];
printf("请输入您要编写的文章以字符‘#‘结尾!\n");
initSqlist(sqlist);
int len=sum(sqlist);
printf("您编写的文章如下:\n");
print_A(sqlist,len);
print_B(sqlist,len);
char sub[MaxSize];
char sub1[MaxSize];
go:
printf("输入1表示查询,输入2表示删除:");
int var=0;
scanf("%d",&var);
switch(var){
case 1:
printf("请输入您要查找的字符串:\n");
scanf("%s",sub);
printf("您要查询的字符串在文章中的个数如下:\n%d\n",sun_Char(sqlist,len,sub,strlen(sub)));
break;
case 2:
printf("请输入您要删除的字符串\n");
scanf("%s",sub1);
int len2=strlen(sub1);
delete_sub_str( sqlist, sub1, &len,&len2);
break;
}
printf("您是否要继续操作?\n输入1表示继续");
scanf("%d",&var);
if(var==1){
goto go;
}else
printf("程序操作结束!");
return 0;
}
void delete_sub_str( char *str, char *sub_str, int *len1,int *len2)
{
int i,j,succ;
i=0;succ=0; /*用i扫描正文t,succ为匹配成功标志*/
while((i<=*len1-*len2+1)&&(!succ))
{
j=0;succ=1; /*用j扫描模式p*/
while((j<=*len2-1)&&succ)
if(sub_str[j]==str[i+j]) j++;
else succ=0;
i++;
}
if(succ)
{
for(j=0;j<(*len1-*len2-1);j++)
{
str[i-1]=str[i+*len2-1];
i++;
}
*len1=*len1-*len2;
printf("删除结果如下:\n");
for(i=0;i<*len1;i++)
{
printf("%c",str[i]);
}
printf("\n");
}
else printf("\n错误!没有与字符串相配的子串!");
}