第七章 函数作业

This commit is contained in:
xtaodada 2021-12-06 23:40:38 +08:00
parent 30b9f309c8
commit 65eed8f70f
No known key found for this signature in database
GPG Key ID: EE4DC37B55E24736
12 changed files with 536 additions and 0 deletions

50
07-1/1/README.md Normal file
View File

@ -0,0 +1,50 @@
【问题描述】
从标准输入中输入两组整数(每行不超过20个整数每组整数中元素不重复),合并两组整数,去掉在两组整数中都出现的整数,并按从小到大顺序排序输出(即两组整数集“异或”)。
【输入形式】
首先输入第一组整数的个数,再输入第一组整数,以空格分隔;然后输入第二组整数的个数,再输入第二组整数,以空格分隔。
【输出形式】
按从小到大顺序排序输出合并后的整数(去掉在两组整数中都出现的整数),输出整数间以一个空格分隔,最后不含回车符。
【样例输入】
```
8
5 1 4 3 8 7 9 6
4
5 2 8 10
```
【样例输出】
```
1 2 3 4 6 7 9 10
```
【样例说明】
第一组整数个数为8分别为5 1 4 3 8 7 9 6第二组整数个数为4分别为5 2 8 10。将第一组和第二组整数合并去掉在两组整数中都出现的整数并从小到大顺序排序后结果为1 2 3 4 6 7 9 10。
【评分标准】
结果完全正确得25分每个测试点5分提交程序文件名为 `exam2.c`
# 运行结果
成功通过编译, 且无编译警告
共有测试数据:5
平均占用内存:1.943K
平均CPU时间:0.00562S
平均墙钟时间:0.00564S
测试数据 评判结果
测试数据1 完全正确
测试数据2 完全正确
测试数据3 完全正确
测试数据4 完全正确
测试数据5 完全正确

49
07-1/1/exam2.c Normal file
View File

@ -0,0 +1,49 @@
#include <stdio.h>
int test_if_have_value(int a[20],int c[40], int n, int n_, int value){
int temp=1;
for (int i = 0; i < n; i++) {
if (a[i] == value){
temp=0;
}
}
if(temp){
c[n_]=value;
n_++;
}
return n_;
}
int main()
{
int a[20],b[20],c[40],n_=0,n1,n2,temp;
scanf("%d",&n1);
for(int i=0;i<n1;i++){
scanf("%d",&a[i]);
}
scanf("%d",&n2);
for(int i=0;i<n2;i++){
scanf("%d",&b[i]);
}
for(int i=0;i<n1;i++){
n_=test_if_have_value(b,c,n2,n_,a[i]);
}
for(int i=0;i<n2;i++){
n_=test_if_have_value(a,c,n1,n_,b[i]);
}
for(int i=0;i<n_;i++){
for(int j=i+1;j<n_;j++){
if(c[i]>c[j]){
temp=c[i];
c[i]=c[j];
c[j]=temp;
}
}
}
for(int i=0;i<n_;i++){
printf("%d ",c[i]);
}
return 0;
}

46
07-1/2/README.md Normal file
View File

@ -0,0 +1,46 @@
【问题描述】
从标准输入中输入两组整数(每组不超过20个整数每组整数中元素不重复并且整数大于等于0),合并两组整数,重复的整数只出现一次,并按从小到大顺序排序输出(即两组整数集的“并集”)。
【输入形式】
在两行上分别输入两组整数,以一个空格分隔各个整数,以-1作为输入结束。
【输出形式】
按从小到大顺序排序输出合并后的整数集(以一个空格分隔各个整数,最后一个整数后的空格可有可无)。
【样例输入】
```
5 105 4 32 8 7 9 60 -1
5 2 87 10 105 0 -1
```
【样例输出】
```
0 2 4 5 7 8 9 10 32 60 87 105
```
【样例说明】
第一组整数有8个分别为5 105 4 32 8 7 9 60第二组整数有6个分别为5 2 87 10 105 0。将第一组和第二组整数合并在两组整数中都出现的整数5和105只出现一次并按从小到大顺序排序后结果为0 2 4 5 7 8 9 10 32 60 87 105。
【评分标准】该题要求输出两组整数的并集共有5个测试点提交程序文件名为 `or.c`
# 运行结果
成功通过编译, 且无编译警告
共有测试数据:5
平均占用内存:1.945K
平均CPU时间:0.00461S
平均墙钟时间:0.00463S
测试数据 评判结果
测试数据1 完全正确
测试数据2 完全正确
测试数据3 完全正确
测试数据4 完全正确
测试数据5 完全正确

51
07-1/2/or.c Normal file
View File

@ -0,0 +1,51 @@
#include <stdio.h>
int test_if_have_value(int c[40], int n, int value){
int temp=1;
for (int i = 0; i < n; i++) {
if(c[i]==value) temp=0;
}
if(temp){
c[n]=value;
n++;
}
return n;
}
int main()
{
int a[20],b[20],c[40],n_=0,n1=0,n2=0,temp;
for(int i=0,j;i<21;i++){
scanf("%d",&j);
if(j==-1) break;
a[i]=j;
n1++;
}
for(int i=0,j;i<21;i++){
scanf("%d",&j);
if(j==-1) break;
b[i]=j;
n2++;
}
for(int i=0;i<n1;i++){
n_=test_if_have_value(c,n_,a[i]);
}
for(int i=0;i<n2;i++){
n_=test_if_have_value(c,n_,b[i]);
}
for(int i=0;i<n_;i++){
for(int j=i+1;j<n_;j++){
if(c[i]>c[j]){
temp=c[i];
c[i]=c[j];
c[j]=temp;
}
}
}
for(int i=0;i<n_;i++){
printf("%d ",c[i]);
}
return 0;
}

46
07-1/3/README.md Normal file
View File

@ -0,0 +1,46 @@
【问题描述】
从标准输入中输入两组整数(每组不超过20个整数每组整数中的元素不重复并且整数大于等于0),编程求两组整数的交集,即在两组整数中都出现的整数,并按从小到大顺序排序输出。若交集为空,则什么都不输出。
【输入形式】
在两行上分别输入两组整数,以一个空格分隔各个整数,以-1作为输入结束。
【输出形式】
按从小到大顺序排序输出两组整数的交集(以一个空格分隔各个整数,最后一个整数后的空格可有可无)。
【样例输入】
```
5 105 0 4 32 8 7 9 60 -1
5 2 87 10 105 0 32 -1
```
【样例输出】
```
0 5 32 105
```
【样例说明】
第一组整数有9个分别为5 105 0 4 32 8 7 9 60第二组整数有7个分别为5 2 87 10 105 0 32。在这两组整数中都出现的整数有四个按从小到大顺序排序后输出的结果为0 5 32 105。
【评分标准】该题要求输出两组整数的交集共有5个测试点提交程序文件名为 `and.c`
# 运行结果
成功通过编译, 且无编译警告
共有测试数据:5
平均占用内存:1.942K
平均CPU时间:0.00484S
平均墙钟时间:0.00483S
测试数据 评判结果
测试数据1 完全正确
测试数据2 完全正确
测试数据3 完全正确
测试数据4 完全正确
测试数据5 完全正确

48
07-1/3/and.c Normal file
View File

@ -0,0 +1,48 @@
#include <stdio.h>
int test_if_have_value(int b[20], int c[40], int n, int n_, int value){
int temp=0;
for (int i = 0; i < n; i++) {
if(b[i]==value) temp=1;
}
if(temp){
c[n_]=value;
n_++;
}
return n_;
}
int main()
{
int a[20],b[20],c[40],n_=0,n1=0,n2=0,temp;
for(int i=0,j;i<21;i++){
scanf("%d",&j);
if(j==-1) break;
a[i]=j;
n1++;
}
for(int i=0,j;i<21;i++){
scanf("%d",&j);
if(j==-1) break;
b[i]=j;
n2++;
}
for(int i=0;i<n1;i++){
n_=test_if_have_value(b,c,n2,n_,a[i]);
}
for(int i=0;i<n_;i++){
for(int j=i+1;j<n_;j++){
if(c[i]>c[j]){
temp=c[i];
c[i]=c[j];
c[j]=temp;
}
}
}
for(int i=0;i<n_;i++){
printf("%d ",c[i]);
}
return 0;
}

58
07-1/4/README.md Normal file
View File

@ -0,0 +1,58 @@
【问题描述】
编写程序实现两个超长正整数每个最长80位数字的加法运算。
【输入形式】
从键盘读入两个整数要考虑输入高位可能为0的情况如00083
1. 第一行是超长正整数A
2. 第二行是超长正整数B
【输出形式】
输出只有一行,是两个长整数的运算结果,从高到低依次输出各位数字。各位数字紧密输出。
算法提示:
1. 用字符串输入两个超长整数,分别存放在两个字符串中,每一位对应一个字符串中的字符。
2. 以较短的超长整数为基准从低位到高位对应位转换成数字后相加再加上前一位相加的进位得到的和模上10再转换为字符即为当前位得到的和整除10即为当前位的进位。将计算得到的每一位保存到结果字符数组。
3. 将较长字符串的剩余位加上最后一个进位移到结构数组后面。
4. 将结果数组反序输出去掉高位多余的0
【输入样例】
```
134098703578230056
234098
```
【输出样例】
```
134098703578464154
```
【样例说明】
```
进行两个正整数加法运算134098703578230056 + 234098 = 134098703578464154。
```
【评分标准】
完全正确得20分每个测试点4分提交程序文件名为 `add.c`
# 运行结果
成功通过编译, 且无编译警告
共有测试数据:5
平均占用内存:1.924K 平均CPU时间:0.00571S 平均墙钟时间:0.00573S
测试数据 评判结果
测试数据1 完全正确
测试数据2 完全正确
测试数据3 完全正确
测试数据4 完全正确
测试数据5 完全正确

79
07-1/4/add.c Normal file
View File

@ -0,0 +1,79 @@
#include<stdio.h>
#include<string.h>
int add(char a, char b,int jinwei){
return a-48+b-48+jinwei;
}
int str_move(char a[80],int n){
for(int i=0;i<n-1;i++){
a[i] = a[i+1];
}
return n-1;
}
void str_extend(char a[80],int n){
for(int i=n-1;i>=0;i--){
a[i+1] = a[i];
}
a[n+1] = '\0';
a[0] = '0';
}
int main(){
char a[90],b[90],c[90];
int n,n_,max,max_,temp,jinwei=0;
scanf("%s %s", a, b);
n=strlen(a);
n_=strlen(b);
for(int i=0;i<n;i++){
if(a[0]!='0') break;
if(a[0]=='0'){
n=str_move(a,n);
continue;
}
}
for(int i=0;i<n_;i++){
if(b[0]!='0') break;
if(b[0]=='0'){
n=str_move(b,n);
continue;
}
break;
}
max_ = max = n;
if(n_>n) {
max_ = max = n_;
while(1){
str_extend(a,n);
n=strlen(a);
if(n==n_) break;
}
}
if(n>n_) {
while(1){
str_extend(b,n_);
n_=strlen(b);
if(n==n_) break;
}
}
if(add(a[0],b[0],0)>9) {
max_++;
c[max] = '\0';
c[0] = '1';
}
for(int i=0;i<max;i++){
temp=add(a[max-1-i],b[max-1-i],jinwei);
if(temp>9) jinwei = 1;
else jinwei = 0;
c[max_-1-i] = temp%10 + 48;
}
for(int i=0;i<max_;i++){
printf("%c",c[i]);
}
return 0;
}

58
07-1/5/README.md Normal file
View File

@ -0,0 +1,58 @@
【问题描述】
求二维整型数组的“最小点”。二维数组的“最小点”定义为:某个数是所在行的最小值,并且是所在列的最小值。注意:某行或某列上可能有多个“最小点”。
【输入形式】
从控制台读入二维数组。
第一行只有以空格分隔的两个正整数n和mn,m<=10n代表二维数组的行数m代表二维数组的列数。
然后在后续n行上输入二维数组的元素每行有m个以若干空格分隔的整数代表二维数组在该行上的所有元素。
【输出形式】
向控制台输出二维数组的“最小点”按行下标、列下标从小到大的顺序输出每行一个先输出“最小点”数值再输出对应的行数、列数行列都从1开始计数以一个空格分隔。
【样例输入】
```
3 4
8 60 1 100
10 498 12 49
-71 132 4 85
```
【样例输出】
```
1 1 3
-71 3 1
```
【样例说明】
输入了一个三行四列的二维数组第一行第三列的元素1是第一行的最小元素同时也是第三列的最小元素所以该元素是“最小点”输出1 1 3。同样第三行第一列的元素-71也是第三行的最小元素同时是第一列的最小元素故该元素也是“最小点”输出-71 3 1。
【评分标准】
该题要求输出二维数组的所有“最小点”共有5个测试点。上传C语言文件名为 `exam2.c`
# 运行结果
成功通过编译, 且无编译警告
共有测试数据:5
平均占用内存:1.945K
平均CPU时间:0.00531S
平均墙钟时间:0.00530S
测试数据 评判结果
测试数据1 完全正确
测试数据2 完全正确
测试数据3 完全正确
测试数据4 完全正确
测试数据5 完全正确

42
07-1/5/exam2.c Normal file
View File

@ -0,0 +1,42 @@
#include<stdio.h>
int get_h_min(int a[10][10], int h, int l){
int temp=a[h][0];
for(int i=1;i<l;i++){
if(a[h][i]<temp){
temp = a[h][i];
}
}
return temp;
}
int get_l_min(int a[10][10], int l, int h){
int temp=a[0][l];
for(int i=1;i<h;i++){
if(a[i][l]<temp){
temp = a[i][l];
}
}
return temp;
}
int main(){
int a[10][10],h,l,temp;
scanf("%d %d",&h,&l);
for(int i=0;i<h;i++){
for (int j=0;j<l;j++){
scanf("%d",&a[i][j]);
}
}
for(int i=0;i<h;i++){
temp=get_h_min(a,i,l);
for(int j=0;j<l;j++){
if(temp==a[i][j]){
if(temp==get_l_min(a,j,h)){
printf("%d %d %d\n",temp,i+1,j+1);
}
}
}
}
return 0;
}

3
07-1/README.md Normal file
View File

@ -0,0 +1,3 @@
# 第六章 函数作业
> 作业时间: 2021-11-21 10:01:00 至 2021-12-18 10:00:00

View File

@ -69,3 +69,9 @@ A repo to record my study life.
- [实验七 指针(2学时)](https://github.com/xtaodada/C-study/tree/master/07) - [实验七 指针(2学时)](https://github.com/xtaodada/C-study/tree/master/07)
- [1. 利用指针,设计子函数实现求两个数的和差积商](https://github.com/xtaodada/C-study/tree/master/07/1) - [1. 利用指针,设计子函数实现求两个数的和差积商](https://github.com/xtaodada/C-study/tree/master/07/1)
- [2. 对一组数据置逆,查找操作](https://github.com/xtaodada/C-study/tree/master/07/2) - [2. 对一组数据置逆,查找操作](https://github.com/xtaodada/C-study/tree/master/07/2)
- [第六章 指针作业](https://github.com/xtaodada/C-study/tree/master/07-1)
- [1. 数组异或](https://github.com/xtaodada/C-study/tree/master/07-1/1)
- [2. 求两组整数的并集2](https://github.com/xtaodada/C-study/tree/master/07-1/2)
- [3. 求两组整数的交集a](https://github.com/xtaodada/C-study/tree/master/07-1/3)
- [4. 超长正整数的加法](https://github.com/xtaodada/C-study/tree/master/07-1/4)
- [5. 二维整型数组的“最小点”](https://github.com/xtaodada/C-study/tree/master/07-1/5)