20级大数据1班第3次堂测题解
这次堂测题目比较难,同学们好好理解
1 最长的单词
完整代码1
#include <stdio.h>
#include <string.h>
int main()
{
int i,max=0,count=0,flag,len;
char msg[80];
gets(msg);
len=strlen(msg);
for (i=0;i<len;i++) //遍历整个字符串
{
count=0; //初始化单词长度
while (msg[i]>='A'&&msg[i]<='Z'||(msg[i]>='a'&&msg[i]<='z')) //判断是否是字母
{
count++; //单词长度加一
i++; //位置加一
}
if (max<count) //判断count所数的单词长度是否最大
{
max=count; //记录单词长度
flag=i; //记录单词结束位置
}
}
for (i=flag-max;i<flag;i++)
printf("%c",msg[i]);
return 0;
}
完整代码2
#include<stdio.h>
#include<string.h>
int main()
{
char a[85],b[25],c[25];
int i,j=0,k=0,len=0; //j为数组b的单词长度,k则为数组c的长度
gets(a);
len=strlen(a);
for(i=0; i<=len; i++)
{
if(a[i]>='a'&&a[i]<='z')//若为单词,则找个新的数组b存储字母
{
b[j]=a[i];
j++;
}
else if(a[i]>='A'&&a[i]<='Z')//若为单词,则找个新的数组b存储字母
{
b[j]=a[i];
j++;
}
else //若不是单词,则开始判断这个单词的长度和初始的长度
{
b[j]='\0';
if(j>k) //如果b的长度大于c的长度,则复制b中的单词给c
{
strcpy(c,b);
k=j; //这里记得将c的长度更新
}
j=0; //清空b的长度
}
}
puts(c); //最后输出c即为最长单词
return 0;
}
2 回文串的判断
完整代码1
#include <stdio.h>
#include <string.h>
int palindrome(char msg[80]);
int main()
{
int i,j,len,flag=0;
char msg[80],b[80];
gets(msg);
flag=palindrome(msg); //判断原本的字符串是否为回文串
if (flag!=1) //若不是再去判断删去一个字母是否为回文串
{
len=strlen(msg);
for (i=0;i<len;i++) //逐一删去
{
for (j=0;j<len-1;j++) //第i个位置之前原样赋值,第i个位置后后一个值赋值给前一个值
{
if (j<i)
b[j]=msg[j];
else b[j]=msg[j+1];
}
b[len-1]='\0'; //非常关键的一步:要在字符串最后添上结束符,否则最后一个值会乱码,无法正常判断是否回文串
flag=palindrome(b); //判断删减字母后的字符串是否为回文串
if (flag==1)
break;
}
}
if (flag==1)
printf("Y");
else
printf("N");
return 0;
}
int palindrome(char msg[80])
{
int len,i,j,result;
char a[80];
len=strlen(msg);
msg[len]='\0'; //其实按照字符串的存储模式最后一个字符后是会自动添加'\0'的,我这里是为了强调
j=len-1;
for (i=0;i<len;i++)
{
a[j]=msg[i];
j--;
}
a[len]='\0'; //防止乱码
result=strcmp(a,msg);
if (result==0)
return 1;
else
return 0;
}
完整代码2
# include <stdio.h>
# include <string.h>
int main()
{
char s[81], s1[81];//按题目要求控制数组长度
int i, flag = 1, count = 0, k, len, j;//flag为标记
gets(s);//读入字符串
len = strlen(s);//测量长度,记得头文件
for(i = 0; i < len / 2; i++)//判断原本的字符串串是否为回文串
{
if (s[i] != s[len - i - 1])//若有两个对应字符不相等
{
flag = 0;
break;
}
}
if (flag == 1)//若原本的字符串串为回文串,则输出Y,程序结束
{
printf("Y\n");
return 0;
}
count = 0;
while(count != len)//依次遍历,每次删除一个字符,判断删除该字符后的字符串是否为回文串
{
flag = 1;//重新设立标记
k = 0;
for(i = 0; i < len; i++)
{
if (count == i)//当为需删除的字符时,不存储改字符
{
continue;
}
else
{
s1[k++] = s[i];//找一个新的字符串数组存字母
}
}
for(j = 0; j < k; j++)
{
if (s1[j] != s1[k -j - 1])//判断这个新的数组是否为回文串
{
flag = 0;
break;//如果首尾不一样,直接跳出循环
}
}
if (flag == 1)//如果删除之后为回文串就直接输出结果
{
printf("Y\n");
return 0;//记得结束程序
}
count++;//判断完一个之后,进行下一个的判断
}
printf("N\n");//若检查到最后发现无满足的情况,则输出N
return 0;
}
3 最近对问题
#include <stdio.h>
#include <math.h>
#include <string.h>
int main()
{
int t,i,j;
double d;
scanf("%d",&t);
double a[t],b[t];
for(i=0; i<t; i++)
scanf("%lf%lf",&a[i],&b[i]);
double min=sqrt(pow(a[1]-a[0],2)+pow(b[1]-b[0],2));
for(i=0; i<t; i++)
{
for(j=i+1; j<t; j++)
{
d=sqrt(pow(a[j]-a[i],2)+pow(b[j]-b[i],2));
if(min>=d)
min=d;
}
}
printf("%.3lf",min);
return 0;
}
4 打印图案
#include <stdio.h>
#include <math.h>
int main()
{
int n,i,j;
scanf("%d",&n);
for(i=-(n/2); i<=n/2; i++)\\运用负数直接打印全部图案
{
if(i==-(n/2)||i==(n/2))\\打印第一行和最后一行
{
if(i==-(n/2))
{
for(j=1; j<=n; j++)
{
printf("*");
}
printf("\n");\\如果是第一行,要加回车
}
else
{
for(j=1; j<=n; j++)
{
printf("*");
}
}
}
else \\打印剩下的图案
{
for(j=1; j<=abs(i)+1; j++) \*第2行,前面三个*,第三行,前面两个*,因此找到规律*\
printf("*");
for(j=1; j<=(n-2*(abs(i)+1)); j++) \*根据规律,可以打印相应的空格*\
printf(" ");
for(j=1; j<=abs(i)+1; j++) \\跟之前相同
printf("*");
printf("\n");
}
}
return 0;
}