从坐牢到入门的程序设计(13)
开始时间2023-07-08 13:47:06
结束时间2023-07-08 22:47:39
前言:麻了,家里漏水了....
L1-064 估值一亿的AI核心代码
一、题目编号及题目说明
二、程序功能测试及说明
一个简单的聊天机器人程序,它可以根据用户输入的问题或者句子进行回复。
三、程序设计思路及结构说明
程序首先接受一个整数 n
,表示有 n
个测试用例需要处理。然后在每个测试用例中,程序读取一行用户输入的字符串 str
。
接下来,程序对输入的字符串进行一系列的处理:
- 移除多余的空格:程序通过循环遍历字符串,当遇到连续的空格时,只保留一个空格,将其他连续的空格移除。
- 移除字符串两端的空格:如果字符串的第一个字符或者最后一个字符是空格,则将其移除。
- 其他处理操作:程序调用
replace()
函数将特定的词语替换为其他词语,比如 "can you" 替换为 "A can","could you" 替换为 "A could","I" 替换为 "you","me" 替换为 "you"。然后,将字符串中的问号 "?" 替换为感叹号 "!",将字母 "A" 替换为 "I"。
最后,程序输出处理后的字符串作为机器人的回答。
四、程序源代码
#include <bits/stdc++.h> using namespace std; bool If(char op) //判断op是否为符号 { if (op == '0') return false; if (op >= 'a' && op <= 'z') return false; if (op >= 'A' && op <= 'Z') return false; if (op >= '0' && op <= '9') return false; return true; } string replace(string str, string ch, string op) { for (int i = 0;; i++) { int l = str.find(ch, i), r = l + ch.size() - 1; if (l == -1) break; if (l == 0 && (str[r + 1] == ' ' || If(str[r + 1]))) //位于最前面 { str.replace(l, r - l + 1, op); } else if (r == str.size() - 1 && (str[l - 1] == ' ' || If(str[l - 1]))) //位于最后 { str.replace(l, r - l + 1, op); } else if ((str[r + 1] == ' ' || If(str[r + 1])) && (str[l - 1] == ' ' || If(str[l - 1]))) //位于中间 { str.replace(l, r - l + 1, op); } } return str; } int main() { int n; cin >> n; getchar(); while (n--) { string str; getline(cin, str); cout << str << endl; for (int i = 0; i < str.size(); i++) { if (str[i] == ' ') { int j = i; while (j + 1 < str.size() && str[j + 1] == ' ') j++; str.erase(i, j - i); i = j; } } if (str.size() != 0 && str[0] == ' ') str.erase(0, 1); if (str.size() != 0 && str[str.size() - 1] == ' ') str.erase(str.size() - 1, 1); for (int i = 1; i < str.size(); i++) { if (If(str[i]) && str[i - 1] == ' ') { str.erase(i - 1, 1); i--; } } for (int i = 0; i < str.size(); i++) { if (str[i] >= 'A' && str[i] <= 'Z' && str[i] != 'I') str[i] += 'a' - 'A'; } str = replace(str, "can you", "A can"); str = replace(str, "could you", "A could"); str = replace(str, "I", "you"); str = replace(str, "me", "you"); for (int i = 0; i < str.size(); i++) { if (str[i] == '?') str[i] = '!'; if (str[i] == 'A') str[i] = 'I'; } cout << "AI: " << str << endl; } return 0; }
五、题目评分
L1-065 嫑废话上代码
一、题目编号及题目说明
二、程序功能测试及说明
它打印出一句名言:“Talk is cheap. Show me the code.” 然后程序结束执行。
三、程序设计思路及结构说明
main()
函数被定义为程序的入口点。在函数体内部,printf()
函数用于输出字符串,并且带有一个转义字符 \n
表示换行。
最后,return 0
表示程序正常结束并返回退出状态码0,表示程序成功执行。
四、程序源代码
#include<bits/stdc++.h> using namespace std; int main() { printf("Talk is cheap. Show me the code.\n"); return 0; }
五、题目评分
L1-066 猫是液体
一、题目编号及题目说明
二、程序功能测试及说明
它接受用户输入的三个整数 a
、b
和 c
,然后计算它们的乘积,并将结果输出。
三、程序设计思路及结构说明
在 main()
函数中,首先声明了三个整数变量 a
、b
和 c
。
然后使用 cin
语句从标准输入中获取用户输入的三个整数,并将它们分别赋值给 a
、b
和 c
。
接下来,计算变量 a
、b
和 c
的乘积,并将结果保存到变量 v
中。
最后,使用 printf()
函数将变量 v
的值输出,并带有一个转义字符 \n
表示换行。
最后,return 0
表示程序正常结束并返回退出状态码 0,表示程序成功执行。
四、程序源代码
#include<bits/stdc++.h> using namespace std; int main() { int a,b,c; cin>>a>>b>>c; int v=a*b*c; printf("%d\n",v); return 0; }
五、题目评分
L1-067 洛希极限
一、题目编号及题目说明
二、程序功能测试及说明
它接受用户输入的三个浮点数 a
、b
和 c
,根据条件进行计算,并输出结果。
三、程序设计思路及结构说明
在 main()
函数中,首先声明了三个浮点数变量 a
、b
和 c
,以及一个浮点数变量 l
。
使用 cin
语句从标准输入中获取用户输入的三个浮点数,并将它们分别赋值给 a
、b
和 c
。
接下来,使用条件判断语句 if
判断变量 b
的值是否等于0。如果满足条件,则将 l
的值设为 a
乘以2.455;否则,将 l
的值设为 a
乘以1.26。
然后,使用 printf()
函数按照格式 "%.2f " 将变量 l
输出,并保留两位小数。
接着,使用条件判断语句判断 l
是否大于变量 c
。如果满足条件,则输出 "T_T\n";否则,输出 "^_^\n"。
最后,return 0
表示程序正常结束并返回退出状态码0,表示程序成功执行。
四、程序源代码
#include<bits/stdc++.h> using namespace std; int main() { float a,b,c; float l; cin>>a>>b>>c; if(b==0) { l=a*2.455; printf("%.2f ",l); } else{ l=a*1.26; printf("%.2f ",l); } if(l>c) { printf("T_T\n"); } else{ printf("^_^\n"); } return 0; }
五、题目评分
L1-068 调和平均
一、题目编号及题目说明
二、程序功能测试及说明
它接受用户输入的一个整数 n
,然后根据用户输入的 n
个浮点数进行计算,并输出结果。
三、程序设计思路及结构说明
在 main()
函数中,首先声明了一个整数变量 n
,一个浮点数变量 sum
,以及一个整数变量 i
。
使用 cin
语句从标准输入中获取用户输入的整数,并将其赋值给变量 n
。
接下来,使用 for
循环遍历 n
次,每次循环中:
- 声明一个浮点数变量
a
。 - 使用
cin
语句从标准输入中获取用户输入的浮点数,并将其赋值给变量a
。 - 将
1/a
的值加到变量sum
上。
循环结束后,将变量 sum
除以 n
,并将结果赋值给变量 sum
。
然后,将 1/sum
的值赋值给变量 sum
。
最后,使用 printf()
函数按照格式 "%.2f\n" 将变量 sum
输出,并保留两位小数。
最后,return 0
表示程序正常结束并返回退出状态码 0,表示程序成功执行。
四、程序源代码
#include<bits/stdc++.h> using namespace std; int main() { int n; float sum=0; int i=0; cin>>n; for(i=0;i<n;i++) { float a; cin>>a; sum+=1/a; } sum/=n; sum=1/sum; printf("%.2f\n",sum); return 0; }
五、题目评分
L1-069 胎压监测
一、题目编号及题目说明
二、程序功能测试及说明
它接受用户输入的一些整数,并进行一系列判断,输出对应的结果。
三、程序设计思路及结构说明
一开始,在程序中定义了一个函数 find_max
,该函数接收四个整数作为参数,然后通过比较找到其中的最大值,并将其返回。
接下来,在 main()
函数中,声明了一些变量,包括一个整型数组 a[4]
、两个整数变量 zd
和 yz
,以及一些计数器。使用循环语句 for
从标准输入中获取用户输入的一些整数,并将它们存储在数组 a
中。
然后,获取额外的两个整数 zd
和 yz
,它们代表一个阈值和一个允许的最大差值。
接着,调用之前定义的 find_max
函数,传入数组 a
中的四个元素,得到最大值并赋给变量 max
。
然后,使用 for
循环遍历数组 a
,分别判断最大值与每个元素的差值是否超过了允许的最大差值 yz
,以及每个元素是否小于阈值 zd
。根据条件判断的结果,相应地增加计数器 flag
和 nb
的值。
接下来,根据计数器的值进行条件判断:如果 flag
和 nb
都为0,说明所有条件都满足,输出 "Normal";如果 flag
大于等于2或者 nb
大于等于2,输出 "Warning: please check all the tires!";否则,进一步遍历数组 a
,找到满足条件的元素,并输出对应的警告信息。
最后,return 0
表示程序正常结束并返回退出状态码 0,表示程序成功执行。
四、程序源代码
#include<bits/stdc++.h> using namespace std; int find_max(int a, int b, int c, int d) { int max = a; if (b > max) max = b; if (c > max) max = c; if (d > max) max = d; return max; } int main() { int a[4],zd,yz; int i=0,flag=0,nb=0; for(i=0;i<4;i++) { cin>>a[i]; } cin>>zd>>yz; int max=find_max(a[0],a[1],a[2],a[3]); for(i=0;i<4;i++) { if(max-a[i]>yz) { flag++; } if(a[i]<zd) { nb++; } } if(flag==0&&nb==0) { printf("Normal\n"); } else if(flag>=2||nb>=2) { printf("Warning: please check all the tires!\n"); } else{ for(i=0;i<4;i++) { if(max-a[i]>yz) { printf("Warning: please check #%d!\n",i+1); break; } if(a[i]<zd) { printf("Warning: please check #%d!\n",i+1); break; } } } return 0; }
五、题目评分
L1-070 吃火锅
一、题目编号及题目说明
二、程序功能测试及说明
它接受用户输入的一些字符串,并进行一系列处理和判断,最后输出结果。
三、程序设计思路及结构说明
首先,在程序中定义了一些变量,包括一个字符数组 s[85]
用于存储用户输入的字符串,几个整数变量 i
、count
和 fist
,以及另外两个字符数组 a[]
和 c[]
,分别用于比较和匹配字符串。
接下来,使用 gets
函数从标准输入中获取用户输入的字符串,并将其存储在数组 s
中。然后,进入一个 while
循环,判断用户输入的字符串是否等于字符数组 a[]
,如果不相等,则表示还有待处理的字符串。
在 while
循环中,首先递增计数器 i
,用于统计信息条数。然后,使用 strlen
函数获取字符串 s
的长度,并使用 for
循环遍历字符串的每个字符。
在 for
循环中,通过判断当前字符是否为字母 'c',来确定是否需要进行进一步匹配。如果当前字符为 'c',则使用 strncpy
函数从当前位置开始提取长度为 14 的子字符串,并将其存储在字符数组 tmp
中。然后,将字符数组 tmp
的末尾添加一个结束符 '\0',形成一个完整的字符串。
接着,使用 strcmp
函数比较字符串 tmp
和字符数组 c[]
是否相等,如果相等,则表示匹配成功,计数器 count
递增,并记录第一次火锅消息的位置。
最后,在循环的最后,再次使用 gets
函数获取下一个用户输入的字符串,以便进行下一次的判断和处理。
当用户输入的字符串等于字符数组 a[]
,即结束输入时,退出 while
循环。然后,根据计数器 count
的值进行条件判断:如果 count
等于0,表示没有火锅消息,输出信息条数 i
和提示信息 "-_-#";否则,输出信息条数 i
、第一次火锅消息的位置 fist
和火锅次数 count
。
最后,return 0
表示程序正常结束并返回退出状态码 0,表示程序成功执行。
四、程序源代码
#include <stdio.h> #include <string.h> int main() { char s[85]; int i=0;//统计信息条数 int count =0;//统计火锅次数 int fist=0;//记录第一次火锅消息的位置 char a[]="."; char c[]="chi1 huo3 guo1"; char tmp[15]; gets(s); while(strcmp(s,a)!=0) { i++; for(int j=0;j<strlen(s);j++) { if(s[j]=='c') { strncpy(tmp,s+j,14); tmp[14]='\0'; if(strcmp(tmp,c)==0) { count++; if(count==1) { fist=i; } break; } } } gets(s); } if(count==0) { printf("%d\n-_-#\n",i); } else { printf("%d\n",i); printf("%d %d\n",fist,count); } return 0; }