这周作业有八道题,所以分为上下两部分。
先来第一题:
编程题#1:求字母的个数
来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩。)
注意: 总时间限制: 1000ms 内存限制: 65536kB
描述
在一个字符串中找出元音字母a,e,i,o,u出现的次数。
输入
输入一行字符串(字符串中可能有空格,请用cin.getline(s,counts)方法把一行字符串输入到字符数组s中,其中counts是s的最大长度,这道题里面可以直接写80。),字符串长度小于80个字符。
输出
输出一行,依次输出a,e,i,o,u在输入字符串中出现的次数,整数之间用空格分隔。
样例输入
If so, you already have a Google Account. You can sign in on the right.
样例输出
5 4 3 7 3
提示
注意,只统计小写元音字母a,e,i,o,u出现的次数。
这道题貌似简单粗暴的解决就可以了:
#include<iostream>
using namespace std;
int main() {
char s[80];
cin.getline(s, 80);
int a = 0;
int e = 0;
int i = 0;
int o = 0;
int u = 0;
for (int j = 0; j < 80; j++) {
if (s[j] == 'a' )
a++;
if (s[j] == 'e' )
e++;
if (s[j] == 'i' )
i++;
if (s[j] == 'o' )
o++;
if (s[j] == 'u' )
u++;
}
cout << a << ' ' << e << ' ' << i << ' '<< o <<' '<< u << endl;
return 0;
}
编程题#2:忽略大小写比较字符串大小
来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩。)
注意: 总时间限制: 1000ms 内存限制: 65536kB
描述
一般我们用strcmp可比较两个字符串的大小,比较方法为对两个字符串从前往后逐个字符相比较(按ASCII码值大小比较),直到出现不同的字符或遇到'\0'为止。如果全部字符都相同,则认为相同;如果出现不相同的字符,则以第一个不相同的字符的比较结果为准。但在有些时候,我们比较字符串的大小时,希望忽略字母的大小,例如"Hello"和"hello"在忽略字母大小写时是相等的。请写一个程序,实现对两个字符串进行忽略字母大小写的大小比较。
输入
输入为两行,每行一个字符串,共两个字符串。(请用cin.getline(s,80)录入每行字符串)(每个字符串长度都小于80)
输出
如果第一个字符串比第二个字符串小,输出一个字符"<"
如果第一个字符串比第二个字符串大,输出一个字符">"
如果两个字符串相等,输出一个字符"="
样例输入
第一组 Hello hello 第二组 hello HI 第三组 hello HELL
样例输出
第一组 = 第二组 < 第三组 >
提示
注意,只统计小写元音字母a,e,i,o,u出现的次数。
strcmp的实现如下,结果用result保存。
int i = 0; char result; while (s1[i] != '\0' && (s1[i] == s2[i])){ i++; } if (s1[i] > s2[i]) { result = '>'; } else if (s1[i] < s2[i]) { result = '<'; } else{ result = '='; }
#include <stdio.h>
#include <string.h>
#include<iostream>
using namespace std;
int main() {
char str1[80];
char str2[80];
cin.getline(str1, 80);
cin.getline(str2, 80);
for (int i = 0; i < 80; i++) {
if (str1[i] >= 'A'&&str1[i] <= 'Z')
str1[i] = str1[i] + 32;//对于ACSⅡ码而言,大写字母是从65(A)到90(Z),
//小写字母是从97(a)到122(z),所以大写字母+32就变成了与其对应的小写字母。
if (str2[i] >= 'A'&&str2[i] <= 'Z')
str2[i] = str2[i] + 32;
}
int i = 0;
char result;
if (strcmp(str1, str2) == 0)
result = '=';
if (strcmp(str1, str2) > 0)
result = '>';
if (strcmp(str1, str2) <0)
result = '<';
cout << result << endl;
return 0;
}
接着来第三题:
编程题#3:最长单词2
来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩。)
注意: 总时间限制: 1000ms 内存限制: 65536kB
描述
一个以'.'结尾的简单英文句子,单词之间用空格分隔,没有缩写形式和其它特殊形式
输入
一个以'.'结尾的简单英文句子(长度不超过500),单词之间用空格分隔,没有缩写形式和其它特殊形式
输出
该句子中最长的单词。如果多于一个,则输出第一个
样例输入
第一组 I am a student of Peking University. 第二组 Hello world.
样例输出
第一组 University 第二组 Hello直接来代码吧:
#include<iostream>
using namespace std;
int main() {
char input[500];
cin.getline(input, 500);
int end = 0;//这个用来标记最大单词结尾在字符数组中的位子
int count = 0;//这个用来数每个单词的长度
int longest = 0;//用来记录当前所找到的最长单词的长度
int i = 0;
while (i < 500)
{
if (input[i] != ' '&&input[i] != ','&&input[i] != '.') {
count++;
i++;
if (count > longest) {//如果这里是》=,那么如果有相同长度的单词,就会打印最后面的。
longest = count;
end = i;
}
}
if (input[i] == ' ' || input[i] == ',' ) {
count = 0;
i++;
}
if (input[i] == '.'|| input[i] == '\0' )
break;
}
for (int j = end - longest; j < end; j++) {
cout << input[j];//end-longest就是最长单词的开始位子,然后输出整个单词。
}
cout << endl;
return 0;
}
这么写的好处是不需要创建第二个数组储存最长单词,就能解决为题。
第四题
编程题#4:矩阵交换行
来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩。)
注意: 总时间限制: 1000ms 内存限制: 65536kB
描述
在main函数中, 生成一个5*5的矩阵,输入矩阵数据,并输入n,m的值。判断n,m是否在数组范围内,如果不在,则输出error;如果在范围内,则将n行和m行交换,输出交换n,m后的新矩阵。
输入
5*5矩阵的数据,以及n和m的值。
输出
如果不可交换,则输出error
如果可交换,则输出新矩阵
样例输入
第一组 1 2 2 1 2 5 6 7 8 3 9 3 0 5 3 7 2 1 4 6 3 0 8 2 4 0 4 第二组 1 2 2 1 2 5 6 7 8 3 9 3 0 5 3 7 2 1 4 6 3 0 8 2 4 5 1
样例输出
第一组 3 0 8 2 4 5 6 7 8 3 9 3 0 5 3 7 2 1 4 6 1 2 2 1 2 第二组 error
提示
输出error格式如下:
cout<< "error" << endl;
输出矩阵格式如下:
cout<< setw(4)<< num;
输出矩阵一行后要输出cout<< endl;
setw是iomanip库里定义的格式控制操作符,需要#include <iomanip> 包含这个头文件。
#include<iostream>
#include<iomanip>
using namespace std;
int main() {
char input[5][5];
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
cin >> input[i][j];
}
}
int m, n;
cin >> m >> n;
if ((m >= 0 && m <= 4) && (n >= 0 && n <= 4)) {//在交换区间内
for (int i = 0; i < 5; i++) {
if (i == m&&i!=n) {
for (int j = 0; j < 5; j++) {
cout << setw(4) << input[n][j];//如果到了第m行,打印出n行的值就得了
}
cout << endl;
}
if (i == n&&i!=m)
{
for (int j = 0; j < 5; j++) {
cout << setw(4) << input[m][j];//同理,n行打印m行的值
}
cout << endl;
}
if (i != m&&i != n) {
for (int j = 0; j < 5; j++) {
cout << setw(4) << input[i][j];//正常输出该行值
}
cout << endl;
}
if (i == m&&m == n) {//如果m==n,那么交换没交换其实就没区别了
for (int j = 0; j < 5; j++) {
cout << setw(4) << input[i][j];
}
cout << endl;
}
}
}
else
cout << "error" << endl;//如果输出的m,n不合法,直接报错就行了
return 0;
}