C++一个程序解释
#include<iostream.h>#include<stdio.h>#include<ctype.h>structca{charc;ca*next;};voidIn...
#include<iostream.h>
#include<stdio.h>
#include<ctype.h>
struct ca {
char c;
ca *next;
};
void InitList(ca *L) {
cout<<"输入一页文字(以#结束): "<<endl;
while((L->c = getchar()) != '#') {
L->next = new ca;
L = L->next;
}
L->next = NULL;
}
void StrNo(ca *L) {
int n = 0;
char s[80], *q;
ca *p;
cout<<"输入一字符串: ";
cin>>s;
while(L->next) {
for (p = L, q = s; *q != '\0' && p->next; p = p->next, q++)
if (p->c != *q) break;
if (*q == '\0') n++;
L = L->next;
}
cout<<"字符串 "<<s<<" 出现 "<<n<<" 次\n";
}
ca *DelStr(ca *L) {
ca *H = L;
char s[80], *q;
ca *p;
cout<<"输入该子串: ";
cin>>s;
if (H->c == *s) {
for (p = H->next, q = s+1; *q != '\0' && p->next; p = p->next, q++)
if (p->c != *q) break;
if (*q == '\0') H = p;
}
while(L->next) {
for (p = L->next, q = s; *q != '\0' && p->next; p = p->next, q++)
if (p->c != *q) break;
if (*q == '\0') L->next = p;
else L = L->next;
}
return H;
}
void print1(ca *L) {
while(L->next) {
cout<<L->c;
L = L->next;
}
cout<<endl;
}
void print2(ca *L, int &p1, int &p2, int &p3, int &n) {
n = p1 = p2 = p3 = 0;
for( ; L->next; L = L->next, n++)
if(isalpha(L->c)) p1++;
else if(isdigit(L->c)) p2++;
else if(L->c == ' ') p3++;
else if(L->c == '\n') n--;
cout<<"\n全部字母数: "<<p1;
cout<<"\n数字个数: "<<p2;
cout<<"\n空格个数: "<<p3;
cout<<"\n文章总字数: "<<n<<endl;
}
void main() {
ca *L = new ca;
int p1, p2, p3, n, c;
InitList(L);
do {cout<<"\n0:退出\n"
"1:统计中英文字母和空格数以及整篇文章总字数\n"
"2:统计某一字符串在文章中出现次数\n"
"3:删除某一子串\n"
"4:分行输出用户输入的各行字符\n";
cin>>c;
switch(c) {
case 1:print2(L, p1, p2, p3, n);break;
case 2:StrNo(L);break;
case 3:DelStr(L);
case 4:print1(L);
}
}while(c);
}
每个函数,数据结构都解释,我用来答辩的.详细的加分
这个程序是个文本编辑的东西 展开
#include<stdio.h>
#include<ctype.h>
struct ca {
char c;
ca *next;
};
void InitList(ca *L) {
cout<<"输入一页文字(以#结束): "<<endl;
while((L->c = getchar()) != '#') {
L->next = new ca;
L = L->next;
}
L->next = NULL;
}
void StrNo(ca *L) {
int n = 0;
char s[80], *q;
ca *p;
cout<<"输入一字符串: ";
cin>>s;
while(L->next) {
for (p = L, q = s; *q != '\0' && p->next; p = p->next, q++)
if (p->c != *q) break;
if (*q == '\0') n++;
L = L->next;
}
cout<<"字符串 "<<s<<" 出现 "<<n<<" 次\n";
}
ca *DelStr(ca *L) {
ca *H = L;
char s[80], *q;
ca *p;
cout<<"输入该子串: ";
cin>>s;
if (H->c == *s) {
for (p = H->next, q = s+1; *q != '\0' && p->next; p = p->next, q++)
if (p->c != *q) break;
if (*q == '\0') H = p;
}
while(L->next) {
for (p = L->next, q = s; *q != '\0' && p->next; p = p->next, q++)
if (p->c != *q) break;
if (*q == '\0') L->next = p;
else L = L->next;
}
return H;
}
void print1(ca *L) {
while(L->next) {
cout<<L->c;
L = L->next;
}
cout<<endl;
}
void print2(ca *L, int &p1, int &p2, int &p3, int &n) {
n = p1 = p2 = p3 = 0;
for( ; L->next; L = L->next, n++)
if(isalpha(L->c)) p1++;
else if(isdigit(L->c)) p2++;
else if(L->c == ' ') p3++;
else if(L->c == '\n') n--;
cout<<"\n全部字母数: "<<p1;
cout<<"\n数字个数: "<<p2;
cout<<"\n空格个数: "<<p3;
cout<<"\n文章总字数: "<<n<<endl;
}
void main() {
ca *L = new ca;
int p1, p2, p3, n, c;
InitList(L);
do {cout<<"\n0:退出\n"
"1:统计中英文字母和空格数以及整篇文章总字数\n"
"2:统计某一字符串在文章中出现次数\n"
"3:删除某一子串\n"
"4:分行输出用户输入的各行字符\n";
cin>>c;
switch(c) {
case 1:print2(L, p1, p2, p3, n);break;
case 2:StrNo(L);break;
case 3:DelStr(L);
case 4:print1(L);
}
}while(c);
}
每个函数,数据结构都解释,我用来答辩的.详细的加分
这个程序是个文本编辑的东西 展开
展开全部
#include<iostream.h> // ISO C++ IO library
#include<stdio.h> // ISO C IO library其实这样写是不必要的,建议如下:
#include<ctype.h> //
// #include <iostream>
// using namespace std;
// #include <ctype>
struct ca { // 定义一个结构
char c; // 用来保存char字符
ca *next; // 用来保存本结构类型的指针
};
void InitList(ca *L) { // 定义一个带参InitList函数,参数类型为ca结构体的指针
cout<<"输入一页文字(以#结束): "<<endl; // 如果头文件不改,这样这语法是错误的,
//除非,std:: cout << …… << std:: endl;
while((L->c = getchar()) != '#') { // 循环讲得到的字符放在由new申请的ca类型堆中,第一次的堆在function main中申请并将其指针付给形参L,循环到得不到字符(即读完文本时)时退出循环
L->next = new ca;// 再次申请一个堆,用来存放下一次循环得到的字符;并将L的next指针指向这个堆;
L = L->next; // L指向新申请的堆,即L存放新申请的堆的地址,即上个注释中的next指针值
}
L->next = NULL;// 将最后一个堆的next指针赋值为空,防止野指针的存在,加强程序健壮性;
}
void StrNo(ca *L) {
int n = 0; // 申请一个整形变量n作为计数器,并初始化为0;
char s[80], *q; //char s[80]并不安全,当你输入字符大于80的时候会出错,建议用C++中的string重写这个函数,string s("");
ca *p;
cout<<"输入一字符串: ";
cin>>s; // 换取输入的字符串,存入s中;
while(L->next) { // 当L->next != NULL的时候执行循环,否则退出循环
for (p = L, q = s; *q != '\0' && p->next; p = p->next, q++)//当*q的字符不为‘\0’结束符,同时p->next不为空时执行循环,之后p指向下一个节点,q指向下一个字符
if (p->c != *q) break; // 当p所指的结点中存放的字符和q指针指向的字符不等的时候break退出for循环继续执行while循环;
if (*q == '\0') n++; //如果退出for循环时q已经指向了结束符,那么计数器n自增1;
L = L->next;//L指向下一个结点,继续while循环统计子字符串功能;
}
cout<<"字符串 "<<s<<" 出现 "<<n<<" 次\n";//舒服子字符串出现的次数;
}
ca *DelStr(ca *L) { 定义一个返回ca结构体指针的function DelStr()
ca *H = L;
char s[80], *q;
ca *p;
cout<<"输入该子串: ";
cin>>s;// 本函数至此的注释参见上一个函数
if (H->c == *s) {//如果第一个结点储存的字符和字符串数组s中的第一个字符相等,条件成立,执行下个{}中的code 其实没什么必要这样写,可以直接执行for循环,稍作修改即可;
for (p = H->next, q = s+1; *q != '\0' && p->next; p = p->next, q++)//当*q的字符不为‘\0’结束符,同时p->next不为空时执行循环,之后p指向下一个节点,q指向下一个字符
if (p->c != *q) break;// 当p所指的结点中存放的字符和q指针指向的字符不等的时候break退出for循环
if (*q == '\0') H = p;//如果退出for循环时q已经指向了结束符,将H结点的指针替换为p
}
while(L->next) { // 当L->next不为NULL执行循环;
for (p = L->next, q = s; *q != '\0' && p->next; p = p->next, q++)//当*q的字符不为‘\0’结束符,同时p->next不为空时执行循环,之后p指向下一个节点,q指向下一个字符
if (p->c != *q) break;// 当p所指的结点中存放的字符和q指针指向的字符不等的时候break退出for循环
if (*q == '\0') L->next = p;// 当p所指的结点中存放的字符和q指针指向的字符不等的时候,讲p结点连接到L所指结点中的next指针;
else L = L->next;//否则L移动向下一个节点;
}
return H; 返回新产生的链表的头结点;
}
void print1(ca *L) {//本函数功能为循环输出链表中的文本数据;
while(L->next) {// 当L->next不为NULL执行循环;
cout<<L->c;// 输出L所指结点的字符数据
L = L->next;// L指向下一个结点;
}
cout<<endl;//换行;
}
void print2(ca *L, int &p1, int &p2, int &p3, int &n) {
n = p1 = p2 = p3 = 0;
for( ; L->next; L = L->next, n++)// 当L->next为NULL时退出循环;这个句子写的不免有点炫耀for的写法之疑
if(isalpha(L->c)) p1++; //L结点数据如果是字母,计数器p1自增1;
else if(isdigit(L->c)) p2++;//L结点数据如果是数字,计数器p2自增1;
else if(L->c == ' ') p3++;//L结点数据如果是空格,计数器p3自增1;
else if(L->c == '\n') n--;//L结点数据如果是换行,计数器n自增1;
cout<<"\n全部字母数: "<<p1;
cout<<"\n数字个数: "<<p2;
cout<<"\n空格个数: "<<p3;
cout<<"\n文章总字数: "<<n<<endl; // 这里舒服的是总行数吧?
}
void main()// 根据最新标准,为了程序的安全性,这里建议改为 int main(int argc, char *argv[])
{
ca *L = new ca;// 定义一个ca类型的指针指向一个新申请的ca类型的堆;
int p1, p2, p3, n, c;// 定义整形变量
InitList(L);// 执行function InitList(ca*),传刚刚申请的堆的地址给他;
do {cout<<"\n0:退出\n" // 关于这里的错误见function InitiList中的解释;
"1:统计中英文字母和空格数以及整篇文章总字数\n"
"2:统计某一字符串在文章中出现次数\n"
"3:删除某一子串\n"
"4:分行输出用户输入的各行字符\n";
cin>>c; // 将输入的字符放在变量C中;
switch(c) { // switch(C)判断你输入的是数字几,执行相应的函数;
case 1:print2(L, p1, p2, p3, n);break;
case 2:StrNo(L);break;
case 3:DelStr(L);// 这里是不是落下了break; 呢
case 4:print1(L);
// 这里建议放置如下语句:
// default:cout << "Error,It's not a number in (1,2,3,4)!"
// return -1;
}
}while(c);
// 这里建议放置如下语句:
// return 0;
}
#include<stdio.h> // ISO C IO library其实这样写是不必要的,建议如下:
#include<ctype.h> //
// #include <iostream>
// using namespace std;
// #include <ctype>
struct ca { // 定义一个结构
char c; // 用来保存char字符
ca *next; // 用来保存本结构类型的指针
};
void InitList(ca *L) { // 定义一个带参InitList函数,参数类型为ca结构体的指针
cout<<"输入一页文字(以#结束): "<<endl; // 如果头文件不改,这样这语法是错误的,
//除非,std:: cout << …… << std:: endl;
while((L->c = getchar()) != '#') { // 循环讲得到的字符放在由new申请的ca类型堆中,第一次的堆在function main中申请并将其指针付给形参L,循环到得不到字符(即读完文本时)时退出循环
L->next = new ca;// 再次申请一个堆,用来存放下一次循环得到的字符;并将L的next指针指向这个堆;
L = L->next; // L指向新申请的堆,即L存放新申请的堆的地址,即上个注释中的next指针值
}
L->next = NULL;// 将最后一个堆的next指针赋值为空,防止野指针的存在,加强程序健壮性;
}
void StrNo(ca *L) {
int n = 0; // 申请一个整形变量n作为计数器,并初始化为0;
char s[80], *q; //char s[80]并不安全,当你输入字符大于80的时候会出错,建议用C++中的string重写这个函数,string s("");
ca *p;
cout<<"输入一字符串: ";
cin>>s; // 换取输入的字符串,存入s中;
while(L->next) { // 当L->next != NULL的时候执行循环,否则退出循环
for (p = L, q = s; *q != '\0' && p->next; p = p->next, q++)//当*q的字符不为‘\0’结束符,同时p->next不为空时执行循环,之后p指向下一个节点,q指向下一个字符
if (p->c != *q) break; // 当p所指的结点中存放的字符和q指针指向的字符不等的时候break退出for循环继续执行while循环;
if (*q == '\0') n++; //如果退出for循环时q已经指向了结束符,那么计数器n自增1;
L = L->next;//L指向下一个结点,继续while循环统计子字符串功能;
}
cout<<"字符串 "<<s<<" 出现 "<<n<<" 次\n";//舒服子字符串出现的次数;
}
ca *DelStr(ca *L) { 定义一个返回ca结构体指针的function DelStr()
ca *H = L;
char s[80], *q;
ca *p;
cout<<"输入该子串: ";
cin>>s;// 本函数至此的注释参见上一个函数
if (H->c == *s) {//如果第一个结点储存的字符和字符串数组s中的第一个字符相等,条件成立,执行下个{}中的code 其实没什么必要这样写,可以直接执行for循环,稍作修改即可;
for (p = H->next, q = s+1; *q != '\0' && p->next; p = p->next, q++)//当*q的字符不为‘\0’结束符,同时p->next不为空时执行循环,之后p指向下一个节点,q指向下一个字符
if (p->c != *q) break;// 当p所指的结点中存放的字符和q指针指向的字符不等的时候break退出for循环
if (*q == '\0') H = p;//如果退出for循环时q已经指向了结束符,将H结点的指针替换为p
}
while(L->next) { // 当L->next不为NULL执行循环;
for (p = L->next, q = s; *q != '\0' && p->next; p = p->next, q++)//当*q的字符不为‘\0’结束符,同时p->next不为空时执行循环,之后p指向下一个节点,q指向下一个字符
if (p->c != *q) break;// 当p所指的结点中存放的字符和q指针指向的字符不等的时候break退出for循环
if (*q == '\0') L->next = p;// 当p所指的结点中存放的字符和q指针指向的字符不等的时候,讲p结点连接到L所指结点中的next指针;
else L = L->next;//否则L移动向下一个节点;
}
return H; 返回新产生的链表的头结点;
}
void print1(ca *L) {//本函数功能为循环输出链表中的文本数据;
while(L->next) {// 当L->next不为NULL执行循环;
cout<<L->c;// 输出L所指结点的字符数据
L = L->next;// L指向下一个结点;
}
cout<<endl;//换行;
}
void print2(ca *L, int &p1, int &p2, int &p3, int &n) {
n = p1 = p2 = p3 = 0;
for( ; L->next; L = L->next, n++)// 当L->next为NULL时退出循环;这个句子写的不免有点炫耀for的写法之疑
if(isalpha(L->c)) p1++; //L结点数据如果是字母,计数器p1自增1;
else if(isdigit(L->c)) p2++;//L结点数据如果是数字,计数器p2自增1;
else if(L->c == ' ') p3++;//L结点数据如果是空格,计数器p3自增1;
else if(L->c == '\n') n--;//L结点数据如果是换行,计数器n自增1;
cout<<"\n全部字母数: "<<p1;
cout<<"\n数字个数: "<<p2;
cout<<"\n空格个数: "<<p3;
cout<<"\n文章总字数: "<<n<<endl; // 这里舒服的是总行数吧?
}
void main()// 根据最新标准,为了程序的安全性,这里建议改为 int main(int argc, char *argv[])
{
ca *L = new ca;// 定义一个ca类型的指针指向一个新申请的ca类型的堆;
int p1, p2, p3, n, c;// 定义整形变量
InitList(L);// 执行function InitList(ca*),传刚刚申请的堆的地址给他;
do {cout<<"\n0:退出\n" // 关于这里的错误见function InitiList中的解释;
"1:统计中英文字母和空格数以及整篇文章总字数\n"
"2:统计某一字符串在文章中出现次数\n"
"3:删除某一子串\n"
"4:分行输出用户输入的各行字符\n";
cin>>c; // 将输入的字符放在变量C中;
switch(c) { // switch(C)判断你输入的是数字几,执行相应的函数;
case 1:print2(L, p1, p2, p3, n);break;
case 2:StrNo(L);break;
case 3:DelStr(L);// 这里是不是落下了break; 呢
case 4:print1(L);
// 这里建议放置如下语句:
// default:cout << "Error,It's not a number in (1,2,3,4)!"
// return -1;
}
}while(c);
// 这里建议放置如下语句:
// return 0;
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询