XJTU_ 西安交通大学2020大学计算机作业-第十一周
XJTU_ 西安交通大学2020大学计算机作业-第十一周
注:所有题所有用例均已通过。
俺又更新了,还是求点星星👇
文章没上传到github,反正没人点星星:https://github.com/nobodyXX/XJTU_C_homework/blob/main/week7,如果这篇文章带给你了帮助或者灵感,欢迎给我点个星星,谢谢!!!
第一题
编写函数,去掉一个字符串中除头部和尾部空格外的所有空格,并编写主函数进行调用测试。
输入:
占一行(注:输入的字符串长度不会超过80)
输出:
占一行
样例输入:
a,b,c
样例输出:
a,b,c
#include<string.h>
void week11_q1_def1(char *a,int *b) {
int l = strlen(a);
for (int i = 0; a[i] == ' '; b[0]++, i++);
for (int i = l - 1; a[i] == ' '; b[1]++, i--);
}
int main() {
char a[100];
gets(a);
int b[2] = {0};
week11_q1_def1(a, b);
for (int i = 0; i < b[0]; i++) printf(" ");
for (int i = b[0]; i < strlen(a) - b[1]; i++)(a[i] == ' ')? 0 : printf("%c", a[i]);
for (int i = 0; i < b[1]; i++) printf(" ");
return 0;
}
第二题
编写程序,将s所指字符串中除了下标(从0开始)为奇数、同时ascii值也为奇数的字符之外,其余的所有字符都删除,串中剩余字符所形成的一个新串放在t所指的一个数组中并显示。若没有满足条件的字符,显示“#”。字符串长度不超过200.
输入:长度不超过200的字符串(无空格)。
输出:处理后的字符串。
样例输入:
attend
样例输出:
e
#include<string.h>
int main() {
char a[202], b[202]="#";
gets(a);
for (int i = 1, j = 0; i < strlen(a); i = i + 2, b[j + 1] = '\0') (a[i] % 2 == 0) ? 0 : (b[j] = a[i],j++);
puts(b);
return 0;
}
第三题
"写出正整数的三位分节格式。如,当用户输入82668634时,程序应该输出82,668,634。
输入:正整数
输出:三位分解格式。
样例:
82668634
82,668,634
样例输入:
1
样例输出:
1
#include<string.h>
int main() {
char a[100];
gets(a);
int b = strlen(a) % 3;
for (int i = 0; i < b; i++)
printf("%c", a[i]);
for (int i = b; i < strlen(a); i++)
((i - b) % 3 == 0&&i!=0) ? printf(",%c", a[i]) : printf("%c", a[i]);
return 0;
}
第四题
将字符串中奇数下标(从0开始)的字符顺序颠倒。如字符12345678,结果为18365472
输入:字符串,不含空格。
输出:结果字符串。
样例输入:
1234567890
样例输出:
1038567492
#include<string.h>
int main() {
char a[100];
gets(a);
int b = (strlen(a) % 2 == 0) ? (strlen(a) - 1) : (strlen(a)-2);
for (int i=0;i< strlen(a); i=i+2, b=b-2){
printf("%c", a[i]);
(b > 0) ? printf("%c", a[b]) : 0;
}
return 0;
}
第五题
编写程序,输入字符串到字符数组s中,再输入一个字符给变量c,判断s中是否有c,若有则将该字符从s中删除后输出。若没有,则输出字符串“NotFound”。
输入2行,1个字符串和1个字符:
输出:删除后的字符串
样例1:
输入:
smiles
s
输出:
mile
样例2:
输入:
smiles
a
输出:
NotFound
样例输入:
aab
b
样例输出:
aa
#include<string.h>
int main() {
char a[100], b;
gets(a);
b = getchar();
int s = -1;
for (int i = 0; i < strlen(a); i++)
(a[i] == b) ? s = 1 : 0;
if (s == -1) {
printf("NotFound");
return 0;
}
else
for (int i = 0; i < strlen(a); i++) (a[i] == b) ? 0 : printf("%c", a[i]);
return 0;
}
第六题
"编写程序,要求在一个字符串中查找连续出现次数最多的一个字符,并显示其所在的开始下标和次数。(如果出现最多的字符不止一个,输出最靠前的字符)
输入:一个字符串
输出:出现最多的字符,次数,开始下标
样例输入:
xyxyzzzqqq1122334
样例输出:
z 3 4
#include<string.h>
int main() {
char a[100];
gets(a);
int b[6] = { 0, 1, 0, 0, 1, 0 };//0:字符,1:重复次数,2:下标
for (int i = 1; i < strlen(a); i++) {
if (a[i] == a[i - 1]) b[0] = a[i], b[1]++, b[2] = i - b[1] + 1;
else b[1] = 1;
if (b[1] > b[4]) b[3] = b[0], b[4] = b[1], b[5] = b[2];
}
printf("%c %d %d", b[3], b[4], b[5]);
return 0;
}
第七题
"编程函数,将字符串(长度小于20个字符)用替换加密法译成密码。
替换加密的加密规则是:将原来的字母用字母表中其后面的第3个字母来替换,对于字母表中最后的三个字母,可将字母表看成是首尾衔接的。如字母c就用f来替换,字母y用b来替换。例如输入字符串为“Study”,则加密后的字符串为“Vwxgb”。
样例:
Study
Vwxgb
样例输入:
Student
样例输出:
Vwxghqw
int main() {
char a[100];
gets(a);
for (int i = 0; a[i] != '\0'; i++) {
(a[i] >= 65&& a[i] <= 'Z') ? ((a[i] > 87) ? printf("%c", a[i] % 88 + 65) : printf("%c", a[i] + 3)) : 0;
(a[i] >= 97) ? ((a[i] > 'w') ? printf("%c", a[i] % 'x' + 'a') : printf("%c", a[i] + 3)) : 0;
}
return 0;
}
第八题
"编写字符串反转函数,该函数将指定字符串中的字符左右顺序颠倒排列。该函数的原型为:
char * mystrrev(char string[]);
其中参数string是待反转的字符串,该函数的返回值为左右顺序颠倒后的字符串指针。
编写主函数,对上述函数进行测试。
样例:
abcdefghijklmn
nmlkjihgfedcba
样例输入:
information
样例输出:
noitamrofni
char * mystrrev(char string[]) {
static char b[100];//要加static,否则字符串b会被释放
int l = strlen(string);
for (int i = 0; i < l; i++)b[l - i - 1] = string[i];
b[l] = '\0';
return b;
}
int main() {
char a[100], *bip;
gets(a);
bip = mystrrev(a);
puts(bip);
return 0;
}
注:C 不支持在调用函数时返回局部变量的地址,除非定义局部变量为 static 变量。
因为局部变量是存储在内存的栈区内,当函数调用结束后,局部变量所占的内存地址便被释放了,因此当其函数执行完毕后,函数内的变量便不再拥有那个内存地址,所以不能返回其指针。
除非将其变量定义为 static 变量,static 变量的值存放在内存中的静态数据区,不会随着函数执行的结束而被清除,故能返回其地址。
第九题
编写程序,输入字符串到字符数组s中,将字符串中的空格均改为逗号(每1个空格对应1个英文逗号)。 输入一行:字符串。 输出一行:改变后的字符串; 若没有空格,则输出字符串“NotFound”。
样例输入:
zzz yyy xxx aa
样例输出:
zzz,yyy,xxx,aa
#include<string.h>
int main() {
char a[100];
gets(a);
for (int i = 0; a[i] != '\0'; i++) {
if (a[i] == ' ')break;
if (i == strlen(a) - 1) {
printf("NotFound");
return 0;
}
}
for (int i = 0; a[i] != '\0'; i++) (a[i] == ' ') ? printf(",") : printf("%c", a[i]);
return 0;
}
第十题
编写函数,寻找具有n个元素的一维数组中的最大值和最小值,并返回数组元素的平均值,函数原形如下:
double fun(int a[],int n,int *max,int *min);
输入输出格式:
输入:用户输入的n+1个数,用空格分隔。第一个数为数组元素个数n。
输出:3个数字:第一个数字为数组中的最大元素值,第二个数字为数组中的最小元素值,第三个数字为数组元素的平均值(保留小数点后6位有效数字)。3个数用空格分开。
样例输入:
3 10 15 -10
样例输出:
15 -10 5.000000
double fun(int a[],int n,int *max,int *min){
double sum=0;
for(int i=1;i<=n;i++){
sum=sum+a[i];
if(a[i]>*max)*max=a[i];
if(a[i]<*min)*min=a[i];
}
return sum/n;
}
int main(){
int a[100],i=0;
for(char c='a';c!='\n';i++) scanf("%d%c",&a[i],&c);
int max=a[1],min=a[1];
double arg=fun(a,a[0],&max,&min);
printf("%d %d %.6f",max, min, arg);
return 0;
}
第十一题
“设5个单词的单词表,”“reserve”", ““replace””, ““core””, ““nature,”” ““literature””,编写程序在单词表中查找单词,若找到,则显示YES,若找不到则显示NO。查找不区分大小写。
输入:一个表示单词的字符串。
输出:YES或NO。
样例1:
RESERVE
YES
样例2:
change
NO
样例输入:
NATURE
样例输出:
YES
int main() {
char a[5][20] = { {"reserve"},{"replace"},{"core"},{"nature"},{"literature"} }, b[20], d=0;//d用来判断
gets(b);
for (int i = 0; b[i] != '\0'; i++) b[i] = (b[i] >= 'a') ? b[i] : (b[i] % 'A' + 'a');//大写转小写
for (int i = 0; i < 5; i++) {
for (int j = 0; a[i][j] != '\0'&&b[j] != '\0'; j++) {
if (b[j] != a[i][j]) break;
if (b[j+1]=='\0'&& a[i][j+1]=='\0') d=1;
}
}
(d == 0) ? printf("NO") : printf("YES");
return 0;
}
第十二题
"编写程序,按下列规则倒序输出子字符串。先输出最后的一个字符,再输出最后两个字符串,在再出后面三个字符…, 最后输出整个字符串。输入的字符串长度不超过100。
输入:一个字符串
输出:空格隔开的子字符串,用一个空格间隔。
输入输出样例:
student
t nt ent dent udent tudent student
#include<string.h>
int main() {
char a[100];
gets(a);
int l = strlen(a);
for (int i = 1; i <= l; i++)
for (int j = l - i; j <= l - 1; j++)
(j == l - 1 && i != l) ? printf("%c ", a[j]) : printf("%c", a[j]);
return 0;
}
第十三题
"一个字符串,如果第1个字符和最后一个字符相同,第2个字符和倒数第2个相同,…,则称为回文字符串,简称回文串。如deed。
输入一个字符串,判断是否回文字符串。若是则显示YES,否则显示NO。输入的字符串长度不超过200.
样例1:
deed
YES
样例2:
good
NO
样例输入:
d
样例输出:
YES
#include<string.h>
int main() {
char a[100];
gets(a);
int l = strlen(a), b=-1;
for (int i = 0; i <= l / 2; i++) {
if (a[i] != a[l - i - 1])break;
if (i == l / 2)b = 1;
}
(b == 1) ? printf("YES") : printf("NO");
return 0;
}
第十四题
"输入两个字符串,交叉输出(第1个字符串的字符先输出),长度不同时,最后只输出长的字符串中的字符。例如team和good,输出为tgeoaomd ;若两个字符串是challenge和put,则输出为cphuatllenge。字符的长度不超过100。输入字符串间以空格分隔。
样例:
challenge put
cphuatllenge
样例输入:
territorial put
样例输出:
tpeurtritorial
int main() {
char a[100], b[100];
scanf("%s", a);
scanf("%s", b);
for (int i = 0; a[i] > 0 || b[i] > 0; i++) {//'\0'为0,初始化空字符串为-52
(a[i] > 0) ? printf("%c", a[i]) : 0;
(b[i] > 0) ? printf("%c", b[i]) : 0;
}
return 0;
}
第十五题
"输入两个字符串,统计第2个字符串(至少含2字符)在第1个字符串中出现的次数。没有出现,次数为0.
输入:两个字符串,以空格分隔。
输出:出现次数,整数。
样例1:
banana an
2
样例2:
bnnnn nn
3
样例输入:
nanfinancebananafnainancebanannan nan
样例输出:
6
int main() {
char a[200], b[100];
scanf("%s", a);
scanf("%s", b);
int count = 0;
for (int i = 0; a[i] !='\0'; i++) {
if (a[i] == b[0]) {
for (int j = 0; b[j] != '\0'; j++, i++) {
if (a[i] != b[j])break;
if (b[j + 1] == '\0')count++,i--;//和第一个循环i++抵消
}
}
}
printf("%d", count);
return 0;
}
都看到这儿了,点个星星呗https://github.com/nobodyXX/XJTU_C_homework/blob/main/week7