xjtu程序设计基础作业题第十次

  •  11-6连续的合数

求出不小于n的最小的m个连续的和数。
【输入输出要求】
输入:
正整数n,m
输出:
m个连续自然数,数之间有空格,行末无空格。

【输入输出样例】
输入:
100 10
输出:
114 115 116 117 118 119 120 121 122 123

#include <stdio.h>
 
int is_prime(int n) // 判断是否为质数
{
    if (n <= 1) {
        return 0;
    }
    int i;
    for (i = 2; i <= n / 2; i++) {
        if (n % i == 0) {
            return 0;
        }
    }
    return 1;
}
 
int main()
{
    int n, m;
    scanf("%d %d", &n, &m); // 输入n和m
    int i, j, count;
    for (i = n; ; i++) { // 从n开始遍历自然数,找到m个合数
        count = 0;
        for (j = i; j < i + m; j++) { // 判断这m个数是否为合数
            if (!is_prime(j)) {
                count++;
            } else {
                break;
            }
        }
        if (count == m) { // 如果这m个数全部为合数,输出并退出循环
            for (j = i; j < i + m; j++) {
                printf("%d ", j);
            }
            break;
        }
    }
    return 0;
}
  • 11-8密文转明文(字符串)

现有一种加密方式,将明文的第一位, 最后一位, 第二位, 倒数第二位, …按顺序连接。先输入密文,求明文。
【输入输出要求】
输入:
一串字符串
输出:
一串字符串

【输入输出样例】
输入:
H.edlllroo w
输出:
Hello world.

#include <stdio.h>
#include <string.h>
 
 
int main() {
    char mingwen[100];
    char miwen[100];
 
    gets(miwen);
     
    int len = strlen(miwen)-1; 
    int mid =len/ 2; 
    int i = 0, j = len ;
    while (i <= mid && j > mid) { 
        mingwen[i]=miwen[i * 2];
        mingwen[j]=miwen[(len-j)*2+1] ;
        i++;
        j--;
    }
    if (i == j)  mingwen[i]=miwen[i * 2]; 
    mingwen[len+1]='\0'; 
    puts(mingwen);   
 
    return 0;
}
  • 8.10矩阵的最大和四个最小
  • /*代码有些问题*/

编写函数,将一个5*5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素(顺序为从左到右,从上到下依次从小到大存放)。

元素的交换只交换最大和中心元素,四个最小和四角元素,其他元素位置不变。假设元素互不相同。
对4个最小元素,先找最小,与a[0][0]交换;然后从a[0][1]开始找次小元素,和a[0][4]交换,再从a[0][1]开始找,过程中跳过a[0][4];第3小也是如此, ......

编写主函数,输入5*5的矩阵,调用函数进行上述变换,在主函数中输出结果。
输入:5行整数,表示5*5矩阵
输出:5行整数,每行中的元素用一个英文空格隔开,末尾无空格。
【输入输出样例】
输入:
31 34 33 32 25
30 29 28 27 26
35 24 23 22 21
20 19 18 17 16
15 14 13 12 11

输出: 【为简化输出,每个数后加一个空格,行尾也是如此】
11 34 33 32 12
30 29 28 27 26
23 24 35 22 21
20 19 18 17 16
13 31 15 25 14

#include <stdio.h>
#define MAX_SIZE 5
 
// 找到矩阵中最大元素的位置,保存在 row, col 中
int find_max(int a[MAX_SIZE][MAX_SIZE], int *row, int *col) {
    int max = a[0][0],i,j;
    *row = *col = 0;
    for (i = 0; i < MAX_SIZE; i++) {
        for (j = 0; j < MAX_SIZE; j++) {
            if (a[i][j] > max) {
                max = a[i][j];
                *row = i;
                *col = j;
            }
        }
    }
    return max;
}
 
// 将 a[row1][col1] 和 a[row2][col2] 两个元素交换
void swap(int a[MAX_SIZE][MAX_SIZE], int row1, int col1, int row2, int col2) {
    int temp = a[row1][col1];
    a[row1][col1] = a[row2][col2];
    a[row2][col2] = temp;
}
 
int main() {
    int a[MAX_SIZE][MAX_SIZE];
    int i,j,k;
    // 输入矩阵
    for (i = 0; i < MAX_SIZE; i++) {
        for (j = 0; j < MAX_SIZE; j++) {
            scanf("%d", &a[i][j]);
        }
    }
 
    // 找出最大元素并移动到中心
    int max_row, max_col;
    int max = find_max(a, &max_row, &max_col);
    swap(a, max_row, max_col, MAX_SIZE / 2, MAX_SIZE / 2);
 
    // 将四个最小元素移动到四个角上,每次从剩余元素中找出最小的
    int min_row, min_col;
    for (i = 0; i < 4; i++) {
        int min = a[0][0];
        min_row = min_col = 0;
        for (j = 0; j < MAX_SIZE; j++) {
            for (k = 0; k < MAX_SIZE; k++) {
                if (a[j][k] < min) {
                    min = a[j][k];
                    min_row = j;
                    min_col = k;
                }
            }
        }
        swap(a, min_row, min_col, (i / 2) * (MAX_SIZE - 1), (i % 2) * (MAX_SIZE - 1));
        // 上面一行代码等价于下面两行代码:
        // if (i == 0) swap(a, min_row, min_col, 0, 0);
        // else if (i == 1) swap(a, min_row, min_col, 0, MAX_SIZE - 1);
        // else if (i == 2) swap(a, min_row, min_col, MAX_SIZE - 1, 0);
        // else swap(a, min_row, min_col, MAX_SIZE - 1, MAX_SIZE - 1);
    }
 
    // 输出矩阵
    for (i = 0; i < MAX_SIZE; i++) {
        for (j = 0; j < MAX_SIZE; j++) {
            printf("%d ", a[i][j]);
        }
        printf("\n");
    }
 
    return 0;
}
  • 8.7单词排序

编写函数,实现字符串的排序(从小到大),不区分大小写。函数原型为:
void sortstring(char r[][30],int n);
其中r表示字符串二维数组,n表示字符串个数。
// 注意:字符比较 strcmp函数, 交换 strcpy函数

编写主函数,输入n和n个单词,调用函数排序,在主函数中输出排序的单词,每个一行。
提示:定义指针数组,例如(以下仅为示意代码)
char q[100][30];
................
scanf("%s",q[i]); // 读入的字符串
......
sortstring(q,n); // 调用函数

【输入输出样例】
输入:
5
study
student
sting
STRING
STRAY

输出:
sting
STRAY
STRING
student
study

#include <stdio.h>
#include <string.h>
 
void sortstring(char r[][30], int n);
 
int main() {
    int n,i;
    scanf("%d", &n);
    char q[100][30];
    for (i = 0; i < n; i++) {
        scanf("%s", q[i]);
    }
    sortstring(q, n);
    for (i = 0; i < n; i++) {
        printf("%s\n", q[i]);
    }
    return 0;
}
 
void sortstring(char r[][30], int n) {
    char p[100][30];
    int i,j;
    char temp[30];
    for (i = 0; i < n; i++) {
        strcpy(p[i],r[i]);
    }
     
    for (i = 1; i < n; i++) {
        for (j = 0; j < n - i; j++) {
            if (strcasecmp(p[j], p[j + 1]) > 0) { // 不区分大小写比较字符串大小
                strcpy(temp , p[j]);
                strcpy(p[j] , p[j + 1]);
                strcpy(p[j + 1] , temp);
            }
        }
    }
     
    for (i = 0; i < n; i++) {
        strcpy(r[i], p[i]); // 将排好序的字符复制回原来的数组,完成排序
    }
}

  •  7.1实现学生信息的录入和输出,要求使用结构体实现。

定义一个描述学生信息的结构体,包含学生学号、姓名、班级、三门课程成绩和总成绩(学号等数据类型的要求同前),用函数实现三个学生信息的录入和按照学生三门课程总成绩排序。在主函数中调用这两个函数,按照学生总成绩从小到大输出各项信息。

程序运行结果如下(输入3个人的信息):
1001
11
zhang
99.5
88.5
89.5
277.5

1002
22
li
77.9
56.5
87.5
221.9

1003
11
wang
92.5
99.0
60.5
252.0

(回车后确认后输出以下结果)
1002,22,li,77.9,56.5,87.5,221.9
1003,11,wang,92.5,99.0,60.5,252.0
1001,11,zhang,99.5,88.5,89.5,277.5

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
struct Student{
    int id;
    int class;
    char name[20];
    double score1, score2, score3;
    double total;
};
 
 
// 按照总成绩从小到大排序学生信息
void sort(struct Student stu[]) {
    int i,j;
    struct Student temp;
    for (i = 0; i < 2; i++) {
        for (j = i + 1; j < 3; j++) {
            if (stu[i].total > stu[j].total) {
                temp = stu[i];
                stu[i] = stu[j];
                stu[j] = temp;
            }
        }
    }
}
 
int main() {
    int i;
    struct Student stu[100];
    for(i=0;i<3;i++)
    {
        scanf("%d",&stu[i].id);
        scanf("%d",&stu[i].class);
        scanf("%s",&stu[i].name);
        scanf("%lf",&stu[i].score1);
        scanf("%lf",&stu[i].score2);
        scanf("%lf",&stu[i].score3);
        scanf("%lf",&stu[i].total);
         
    } 
    sort(stu);
    for ( i = 0; i < 3; i++) {
        printf("%d,%d,%s,%.1lf,%.1lf,%.1lf,%.1lf\n", stu[i].id, stu[i].class, stu[i].name,
               stu[i].score1, stu[i].score2, stu[i].score3, stu[i].total);
    }
 
    return 0;
}
  • 11-7找勾股数

找出在大于等于m小于等于n的所有没有倍数关系的勾股数组。例如:10,8,6 是 5,4,3的倍数则不显示。
【输入输出要求】
输入:
整数a,b。
输出:
每一行三个数由大到小输出,数之间有空格,末尾无空格。(提示:printf("%d %d %d\n",....))

【输入输出样例】
输入:
3 39
输出:
5 4 3
13 12 5
17 15 8
25 24 7
29 21 20
37 35 12

#include <stdio.h>
 
int main() {
    int m, n,a,b,c;
    int flag,k;
    scanf("%d %d", &m, &n);
 
    // 枚举 a, b, c,注意 a <= b < c
    for ( c = m; c <= n; c++) {
        for ( b = m; b < c; b++) { // b 从 m 开始枚举,保证 a < b < c
            for ( a = m; a < b; a++) { // a 从 m 开始枚举,保证 a < b < c
                if (a * a + b * b == c * c) { // 判断是否为勾股数
                     flag = 1;
                    for ( k = 2; k <= a / 2; k++) {
                        if (a % k == 0 && b % k == 0 && c % k == 0) {
                            flag = 0; // 如果找到了一个公因数,说明不符合条件
                            break;
                        }
                    }
                    if (flag) printf("%d %d %d\n", c, b, a); // 如果没找到公因数,则输出勾股数(注意反向输出)
                }
            }
        }
    }
 
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值