#include<stdio.h>
#include<math.h>
char m[10][80]; //用于暂存数据
char str[80]; //用于读入字符串
int sz[10][80] = {0}; //用于计算
int mid[3][80] = {0}; //储存相乘的两数组
//任务1
int demo_1()
{
extern char str[]; //调用全局变量 str
printf("请输入字符串: ");
gets(str); //读取字符串
printf("字符串英文字数为:%d\n", find_letter(str));
printf("字符串含空格数为:%d\n", find_kg(str));
printf("字符串英文单词为:%d\n", find_word(str));
printf("\n");
}
//输入 字符串 返回 所含字母个数
int find_letter(char a[])
{
int i = 0, sum = 0;
while (a[i] != '\0')
{
if ('a' <= a[i] && a[i] <= 'z' || 'A' <= a[i] && a[i] <= 'Z')
sum++;
i++;
}
return sum;
}
//输入 字符串 返回 所含空格个数
int find_kg(char a[])
{
int i = 0, sum = 0;
while (a[i] != '\0')
{
if (a[i]==' ')
sum++;
i++;
}
return sum;
}
//输入 字符串 返回 所含单词个数
int find_word(char a[])
{
int i = 0, sum = 0;
while (a[i] != '\0')
{
if (('a' <= a[i] && a[i] <= 'z' || 'A' <= a[i] && a[i] <= 'Z' <= 'z')&&(a[i+1]==' '|| a[i + 1] == ',' || a[i + 1] == '.'))
sum++;
i++;
}
return sum;
}
//任务2
int demo_2()
{
extern char str[]; //调用全局变量 str
extern int sz[10][80];
int i,k,index;
printf("请输入字符串: ");
gets(str); //读取字符串
//printf("%s\n",str);
index= jiequ_sz(str);
//printf("%d", index);
for (k = 0; k < index; k++)
{
nixu_str(k);
//用于检测返回数组
//for (i = 0; i < 5; i++)printf("%d", sz[k][i]);
//printf( "\n" );
}
qiuhe_str(index);
nixu_str(10);
printf("字符串中整数的和为: ");
i = 0;
while (sz[10][i] != ';')
{
printf("%d", sz[10][i]);
i++;
}
printf("\n");
}
//从字符串中截取数组
int jiequ_sz(char a[])
{
extern char m[10][80];
int i = 0,index=0,j; //index 用于切换不同 m
while (a[i] != '\0') //判断字符串是否结束
{
j = 0; //将 j 复位
while ('0'<= a[i]&& a[i] <='9') //当找到的是数字时进入循环
{
//printf("%c",a[i]);
m[index][j]=a[i]; //将找到的一串数放到一个 m 中
j++;
i++;
//当第一串数字结束 退出内层循环 回到外层循环
}
//printf("%d\n",sz[index][0]);
if (j != 0)
{
m[index][j+1] = '\0'; //将字符串末尾加上 '\0' 用于之后的识别
index++; //当内层循环退出时 j 不为0 切换到下一个数组
}
i++;
}
return index; //返回找到数组的个数
}
//将数组倒过来排列
int nixu_str(int index)
{
extern char m[10][80];
extern int sz[10][80];
int num=0,i=0;
while (m[index][num] != '\0') //判断字符串结尾
{
//printf("%c", m[0][num]);
num++;
}
//将字符串倒过来放入数组
i = num;
for (; num > 0; num--)
{
sz[index][i-num]=m[index][num-1]-'0';
//printf("\n");
//printf("%d,%d:%d",index,(i-num) ,sz[index][i - num]);
}
sz[index][i] = ';'; //在数组后加入 ';' 用于后面判断 ';' 对应ascll码为59
}
//用于计算两数组的和
int qiuhe_str(int index)
{
int j, i, sum, jin = 0, k=0;
extern int sz[10][80];
for (j = 0; j <= 80; j++)
{
if (k == index)break; //当找到index组数组的结尾则跳出循环
sum = 0; //将sum复位
for (i = 0; i < index; i++) //有index组数据
{
if (sz[i][j]==';') //判断数组结尾
{
k++;
continue;
}
sum += sz[i][j];
//printf("%d\n", sum);
}
sum += jin; //sum 加上 上一位进的位数
jin = sum / 10; //计算这意味要进的位数
sum %= 10; //取出这位保留的数
m [10] [j] = sum+'0'; //转换为字符串为了方便之后的相互调用
//printf("%c", m [10][j]);
}
m[0][j] = '\0'; //手动添加字符串结尾
//printf("\n");
}
//字符串转数组
int str_sz(int index1, int index2)
{
extern char m[10][80];
extern int sz[10][80];
int i=0;
while(m[index1][i]!='\0')
{
sz[index2][i] = m[index1][i] - '0';
i++;
}
sz[index2][i] = ';';
//printf( "\n" );
}
//任务3
int demo_3()
{
extern char str[]; //调用全局变量 str
extern int sz[10][80];
extern int mid[3][80];
extern char m[10][80];
int i, k, index,num,a=0,b=0;
printf("请输入字符串: ");
gets(str); //读取字符串
//printf("%s\n",str);
index = jiequ_sz(str);
//printf("%d", index);
i = 0;
while (m[0][i] != '\0') //读取第一段数字长度
{
a++;
i++;
}
i = 0;
while (m[1][i] != '\0') //读取第二段数字长度
{
b++;
i++;
}
for (k = 0; k < index; k++) //转换为逆序数
{
nixu_str(k);
//用于检测返回数组
//for (i = 0; i < 80; i++)printf("%d", sz[k][i]);
//printf( "\n" );
}
qiuhe_str(index); //求和
nixu_str(10);
printf("和: ");
i = 0;
if(a!=b)i++;
while (sz[10][i] != ';') //显示输出
{
printf("%d", sz[10][i]);
i++;
}
printf("\n");
chengji_str(); //求乘积
//printf("\n");
num = a+b; //乘积的长度
/*
for (i = 0; i < a+b-1; i++)
{
//printf("i=:%d %d\n", i,mid[2][i]);
}
for (i = 0; i <= 80; i++)
{
//printf("%d", mid[2][i]);
}
*/
//printf("\n");
i = 0;
while(i<num) //将逆序数还原
{
sz [0][i] = mid [2][num-2-i];
//printf("%d\n", sz[0][i]);
i++;
}
printf("乘积:");
for (i = 0; i <num; i++) //显示输出
{
printf("%d", sz[0][i]);
}
printf("\n");
}
//计算数组的乘积
int chengji_str()
{
int i, j,n;
extern int mid[3][80];
extern char m[10][80];
extern int sz[10][80];
int cj = 0,jin=0;
//获取两个需要相乘的数组
for (j = 0; j <= 80; j++)
for (i = 0; i < 2; i++)
mid[i][j] = sz[i][j];
//用于检测输入
/*
for (i = 0; i < 80; i++)printf("%d", mid[0][i]);
printf("\n");
for (i = 0; i < 80; i++)printf("%d", mid[1][i]);
printf("\n");
*/
for (i = 0; i <=80; i++) //求出所有个位数的乘积
{
//printf("i:%d\n", i);
if (mid[0][i] == ';')break;
j = 0;
while (mid[1][j]!=';')
{
cj = 0;
mid[2][j+i] += mid[1][j] * mid[0][i];
//printf("j=:%d i=:%d %d*%d=%d\n",j, i, mid[1][j], mid[0][i],mid[2][j+i]);
//printf("cj%d:%d\n", j,cj);
//mid[2][j+i] += jin;
//mid[2][j+i] += cj % 10;
//jin = cj / 10;
j++;
}
//printf("i=%d:\n",i );
//for (n = 0; n <= 10; n++)printf("%d\n", mid[2][n]);
}
//printf("i=%d:\n", i);
for (n = 0; n <= 80; n++) //对超过10的数进行进位处理
{
jin = 0;
//printf("%d\n", mid[2][n]);
if (mid[2][n] >= 10)
jin = mid[2][n] / 10;
mid[2][n] %= 10;
mid[2][n + 1] += jin;
//printf("%d\n", mid[2][n]);
}
/* n = 0;
mid[2][0] = ';';
while(mid[0][n] != ';')
{
for (i = 0; i < mid[0][n]; i++)
{
for (j = 0; j <= 80; j++)
{
sz[i][j] = mid[1][j];
//printf("%d", sz[i][j]);
}
//printf("\n");
}
qiuhe_str(mid[0][n]);
for(i=80;i>=n;i--)
{
sz[10][i] = sz[10][i - n];
}
for (i = 0; i < n; i++)
{
sz[10][i] = 0;
}
str_sz(10, 0);
for (j = 0; j <= 80; j++)
{
sz[1][j] = mid[2][j];
//printf("%d", mid[2][j]);
}
qiuhe_str(2);
str_sz(10, 10);
for (j = 0; j <= 80; j++)
{
mid [2][j] = sz [10][j];
//printf("%d", mid[2][j]);
}
n++;
}*/
}
int main()
{
int a,i=1;
while (i)
{
printf("------------------------------------------------------------------------------------------------------------------------\n");
printf("-------请选择功能-------\n");
printf("(请输入功能对应的数字)\n");
printf("(1)---第一种字符串---(1)\n");
printf("(2)---第二种字符串---(2)\n");
printf("(3)---第三种字符串---(3)\n");
printf("(0)-------退出-------(0)\n");
printf("------------------------------------------------------------------------------------------------------------------------\n");
printf("功能序号: ");
scanf("%d", &a);
getchar();
switch (a)
{
case 1:
demo_1();
break;
case 2:
demo_2();
break;
case 3:
demo_3();
break;
case 0:
i = 0;
break;
default:
printf("对不起该功能还在开发中。。。");
break;
}
printf("------------------------------------------------------------------------------------------------------------------------\n");
}
}