if(a[i][col]>a[j][col])
break;
if(j==m)
{
flag=1; //有鞍点
printf("i=%d, j=%d, saddle point:%d\n",i,col,a[i][col]);
}
}
if(flag==0)
printf("No saddle point!\n");
}
三、字符串实验
1. 以下程序功能为:输入一个字符串,将其逆序输出。找出并改正以下源程序中错误,通过调试得出正确的运行结果。
源代码(有错误的程序)
#include
#include
void main()
{
int i,j;
char s[80],result[80];
printf("Enter a string:\n");
gets(s);
for(i=strlen(s)-1,j=0;i>=0;i--,j++)
{
result[j]=s[i];
}
result[j]='\0'; //必须给字符串加上串结束标志
printf("This is reverse string:\n");
puts(result);
}
运行结果(改正后的程序)
Enter a string :
asdfg
This is the reverse string:
gfdsa
2. 编程:任意输一个字符串保存在一维字符数组中,求其长度(不用strlen函数)。例如:
Input a string: aadfdg
length=6
提示:字符串的有效长度就是有效字符的个数,即数组中第一个‘\0’前面的字符个数。
#include
void main()
{
int i, len=0;
char s[80];
printf("请输入字符串,以回车键结束:");
gets(s);
for(i=0; s[i]!='\0'; i++)
len++;
printf("字符串%s的长度为:%d\n",s, len);
}
3. 编程:任意输入两个字符串分别保存在一维字符数组中,把第二个字符串连接到第一个字符串末尾(不用strcat函数)。例如:
Input two string:
asdfg
erty
after strcat: asdfgerty
#include
void main()
{
int i,j;
char s1[80], s2[80];
printf("请输入字符串1以回车键结束:\n");
gets(s1);
printf("请输入字符串2以回车键结束:\n");
gets(s2);
for(i=0; s1[i]!='\0'; i++) ; /* 定位第一个字符串的结束标志*/
for(j=0; s2[j] && i<80; i++, j++ ) /*将s2接到s1后*/
s1[i]=s2[j];
s1[i]='\0';
printf("两个串连接后:%s\n",s1);
}
4. 编程:从键盘读入两个字符串分别保存在一维字符数中,比较两个字符串大小(不用strcmp函数),输出较大的字符串。
#include
void main()
{
int i;
char a[80], b[80];
printf("请输入字符串1以回车键结束:\n");
gets(a);
printf("请输入字符串2以回车键结束:\n");
gets(b);
//逐个比较直到两个字符不同或其中一个字符串结束
for(i=0; a[i] && b[i] ; i++)
{
if(a[i]!=b[i])
break;
}
if (a[i]>b[i])
printf("第一个字符串%s大!\n", a);
else if (a[i]==b[i])
printf("两字符串相同!\n");
else
printf("第二个字符串%s大!\n", b);
}
5. 编程:任意输入一个字符串保存在一维字符数组中,判断里面数字字符的个数。例如:
Input a string:
adg4521gadg4adg
number: 5
#include
void main()
{
int i, n=0;
char s[80];
printf("请输入一个字符串以回车键结束:\n");
gets(s);
for(i=0 ; s[i]; i++)
if(s[i]>='0' && s[i]<='9')
n++;
printf("字符串中包含的数字个数为:%d\n",n);
}
6. 编程:从一个字符串中删除从某个特定字符开始的所有字符。例如原字符串为"abcdefg",特定字符为'd',删除后的字符串为"abc"。
#include
void main()
{
int i, flag=0;
char c, s[80];
printf("请输入一个字符串以回车键结束:\n");
gets(s);
printf("请输入特定字符:");
c=getchar();
for(i=0 ; s[i]; i++)
if(s[i]==c)
{
s[i]='\0';
flag=1;
break;
}
if(flag==0)
printf("输入字符中没有特定字符!\n");
else
puts(s);
}
7. 编程:编写程序,从一个输入的字符串中抽取一部分(从第n个字符开始,抽取m个字符)构成一个新的字符串,并输出。要求:n和m都由用户输入。
#include
#include
void main()
{
unsigned int i, j, m, n;
char s1[80], s2[80];
printf("请输入一个字符串以回车键结束:\n");
gets(s1);
printf("请输入子串的起始位置和长度:");
scanf("%d%d", &n, &m);
if( n>0 && n<=strlen(s1) )
{
if (m>0 && n+m <= strlen(s1)+1 )
{
for(i=n-1,j=0; s1[i] && i< n+m-1 ; i++, j++)
s2[j]=s1[i];
s2[j]='\0';
puts(s2);
}
else
printf("长度超出围!\n");
}
else
printf("起始位置超出围!\n");
}
8. 编程:利用字符串库函数puts, gets, strcat, strcmp, strcpy, strlen完成下述操作:
●读入三个字符串str1,str2,str3
●输出这三个字符串
●分别求出这三个字符串的长度;
●比较str1和str2的大小;
●将str2连接到str1之后,并输出连接后的str1;
●复制str3到str1,并输出复制操作后的str1;
#include
#include
void main()
{
char str1[80], str2[80], str3[80];
printf("请输入字符串str1以回车键结束:\n");
gets(str1);
printf("请输入字符串str2以回车键结束:\n");
gets(str2);
printf("请输入字符串str3以回车键结束:\n");
gets(str3);
printf("三个字符串分别是:\n");
printf("str1: %s\n", str1);
printf("str2: %s\n", str2);
printf("str3: %s\n", str3);
printf("三个字符串的长度分别是:\n");
printf("str1: %d\n", strlen(str1));
printf("str2: %d\n", strlen(str2));
printf("str3: %d\n", strlen(str3));
if(strcmp(str1, str2)>0)
printf("字符串str1大于str2\n");
else if(strcmp(str1, str2)==0)
printf("字符串str1等于str2\n");
else
printf("字符串str1小于str2\n");
strcat(str1,str2);
printf(" str2连接到str1之后: %s\n",str1);
strcpy(str1,str3);
printf("复制str3到str1: %s\n",str1);
}
选作题:
输入一个小写字母组成的英文句子,统计该句子有几个英文单词,并统计每个字母出现的次数,并将句子中每个单词的首字母大写后输出。
如:输入: this is a cat!
输出:4个单词;
每个字母出现次数t:2 h:1 i:2 s:2 a:2 c:1
This Is A Cat!
#include
void main()
{
char s[80];
int count[26]={0}; //与26个字母对应,统计各个字母出现的次数
int i, j, wordnum=0, flag=0;
printf("请输入一个英文句子(小写字母)以回车键结束:");
gets(s);
for(i=0; s[i]; i++)
{
if(s[i]>='a' && s[i]<='z') //逐个字母判断,使其对应的出现次数增加1
{
j=s[i]-'a'; // 计算该字母在26个字母中的序号
count[j]++;
}
if(i==0 && s[i]!=' ' || flag==1) //句首单词及每个单词第一个字母的处理
{
wordnum++; //单词个数增加1
s[i]=s[i]-32; //小写换大写
flag=0;
}
else if(s[i]==' ' && s[i+1]>='a' && s[i+1]<='z')
flag=1;
//当前是空格,但下一个字符是字母,则该字母一定是单词的起始字母flag=1。
//即判断一个单词的起始字符,单词间用空格区分,这里考虑了单词间多个空格的情况}
printf("句子中有%d个单词;\n", wordnum);
printf("每个字母出现的次数:");
for(i=0; i<26; i++)
{
if(count[i]!=0)
printf("%c: %d ", i+'a', count[i]);
}
printf("\n");
printf("每个单词首字母大写后:");
puts(s);
}