《程序设计》编程题|051-060

练习7-2 求最大值及其下标 – 浙大版《C语言程序设计(第4版)》题目集

#include <stdio.h>
#include <limits.h>

int main(){
    // 输入
    int n;
    scanf("%d",&n);
    // 处理:求最大值 最大值的最小下标
    int max=INT_MIN;
    int minIdxOfMax=-1;
    for(int i=0;i<n;++i){
        int cur;
        scanf("%d",&cur);
        if(cur>max){
            max=cur;
            minIdxOfMax=i;
        }
    }
    // 输出
    printf("%d %d\n",max,minIdxOfMax);
    
    return 0;
}

练习7-3 将数组中的数逆序存放 – 浙大版《C语言程序设计(第4版)》题目集

#include <stdio.h>

int main(){
    // 输入
    int n;
    scanf("%d",&n);
    // 直接逆序存放
    int nums[n];
    for(int i=n-1;i>=0;--i){
        scanf("%d",&nums[i]);
    }
    // 输出:顺序输出
    for(int i=0;i<n;++i){
        printf("%d",nums[i]);
        if(i<n-1){
            printf(" ");
        }
    }
    printf("\n");
    
    return 0;
}

练习7-4 找出不是两个数组共有的元素 – 浙大版《C语言程序设计(第4版)》题目集

#include <stdio.h>
#include <stdbool.h>

// 输出:数组存在目标元素->true 否则->false
bool isExist(int *nums,int size,int target){
    for(int i=0;i<size;++i){
        if(nums[i]==target){
            return true;
        }
    }
    return false;
}

int main(){
    int size[3]={0};
    // 输入第一个数组
    scanf("%d",&size[0]);
    int nums0[size[0]];
    for(int i=0;i<size[0];++i){
        scanf("%d",&nums0[i]);
    }
    // 输入第二个数组
    scanf("%d",&size[1]);
    int nums1[size[1]];
    for(int i=0;i<size[1];++i){
        scanf("%d",&nums1[i]);
    }
    // 记录不存在另一个数组且不重复的元素
    int nums2[size[0]+size[1]];
    // 第一个数组
    for(int i=0;i<size[0];++i){
        if(!isExist(nums1,size[1],nums0[i])
          && !isExist(nums2,size[2],nums0[i])){
            nums2[size[2]++]=nums0[i];
        }
    }
    // 第二个数组
    for(int i=0;i<size[1];++i){
        if(!isExist(nums0,size[0],nums1[i])
          && !isExist(nums2,size[2],nums1[i])){
            nums2[size[2]++]=nums1[i];
        }
    }

    for(int i=0;i<size[2];++i){
        printf("%d",nums2[i]);
        if(i<size[2]-1){
            printf(" ");
        }
    }
    
    return 0;
}

练习7-7 矩阵运算 – 浙大版《C语言程序设计(第4版)》题目集

#include <stdio.h>

// 输入:矩阵
void getMatrix(int row,int col,int mat[row][col]){
    for(int i=0;i<row;++i){
        for(int j=0;j<col;++j){
            scanf("%d",&mat[i][j]);
        }
    }
    return;
}

int main(){
    // 输入
    int n;
    scanf("%d",&n);
    int matrix[n][n];
    getMatrix(n,n,matrix);
    // 处理:计算除副对角线、最后一列
    // 和最后一行以外的所有元素之和
    int sum=0;
    for(int i=0;i<n;++i){
        for(int j=0;j<n;++j){
            if(i==n-1 || j==n-1 || i+j==n-1){
                continue;
            }
            sum+=matrix[i][j];
        }
    }
    // 输出
    printf("%d",sum);
    
    return 0;
}

练习7-8 方阵循环右移 – 浙大版《C语言程序设计(第4版)》题目集

#include <stdio.h>

// 输入:矩阵
void getMatrix(int row,int col,int matrix[row][col]){
    for(int i=0;i<row;++i){
        for(int j=0;j<col;++j){
            scanf("%d",&matrix[i][j]);
        }
    }
    return;
}

// 输出:矩阵
void putMatrix(int row,int col,int matrix[row][col]){
    for(int i=0;i<row;++i){
        for(int j=0;j<col;++j){
            printf("%d ",matrix[i][j]);
        }    
        printf("\n");
    }
    return;
}

// 处理:交换
void swap(int *a,int *b){
    int temp=*a;
    *a=*b;
    *b=temp;
    return;
}

// 处理:逆置
void reverse(int *nums,int left,int right){
    while(left<right){
        swap(&nums[left++],&nums[right--]);
    }
    return;
}

// 处理:矩阵循环右移m列
void cycleShiftRightMatrix(int row,int col,int matrix[row][col],int m){
    m%=col;
    if(m==0) return;
    for(int i=0;i<row;++i){
        reverse(matrix[i],0,col-1);
        reverse(matrix[i],0,m-1);
        reverse(matrix[i],m,col-1);
    }
}

int main(){
    // 输入
    int m,n;
    scanf("%d %d",&m,&n);
    int nums[n][n];
    getMatrix(n,n,nums);
    // 处理:矩阵循环右移
    cycleShiftRightMatrix(n,n,nums,m);
    // 输出
    putMatrix(n,n,nums);
    
    return 0;
}

练习7-9 计算天数 – 浙大版《C语言程序设计(第4版)》题目集

#include <stdio.h>

int main(){
    // 输入:年/月/日
    int year,month,day;
    scanf("%d/%d/%d",&year,&month,&day);
    // 处理:
    // 维护每个月的天数数组
    int mth[13] = {12,
        31,28,31,30,31,30, 
        31,31,30,31,30,31};
    // 闰年 修正2月天数
    if((year%4==0 && year%100!=0) 
       || year%400==0){
        ++mth[2];
    }
    // 计算天数
    int sum=0;
    for(int i=1;i<month;++i){
        sum+=mth[i];
    }
    sum+=day;
    // 输出
    printf("%d",sum);
    
    return 0;
}

练习7-10 查找指定字符 – 浙大版《C语言程序设计(第4版)》题目集

#include<stdio.h>
 
int main(){
    // 输入
    char ch;
    scanf("%c\n",&ch);
    char str[80];
    int size=0;
    while(1){
        str[size] = getchar();
        if(str[size] == '\n'){
            break;
        } 
        size++;
    }
    // 处理:从后往前查找
    int index = -1;
    for(int i=size;i>=0;i--){
        if(str[i] == ch){
            index = i;
            break;
        }
    }
    // 输出
    if(index == -1) {
        printf("Not Found\n");
    }else{
        printf("index = %d\n",index);
    } 
    return 0;
}

练习7-11 字符串逆序 – 浙大版《C语言程序设计(第4版)》题目集

#include <stdio.h>
#include <string.h>

#define MAXLEN 81

// 处理:字符交换
void swap(char *a,char *b){
    char temp=*a;
    *a=*b;
    *b=temp;
    return;
}

// 处理:字符串逆置
void reverse(char *str,int left,int right){
    while(left<right){
        swap(&str[left++],&str[right--]);
    }
    return;
}

int main(){
    // 输入
    char str[MAXLEN];
    fgets(str,MAXLEN,stdin);
    int len=strlen(str);
    if(len>0 && str[len-1]=='\n'){
        str[--len]='\0';
    }
    // 处理:字符串逆序
    reverse(str,0,len-1);
    // 输出
    printf("%s",str);
    
    return 0;
}

习题7-1 选择法排序 – 浙大版《C语言程序设计(第4版)》题目集

#include <stdio.h>
#include <stdlib.h>

int main(){
    // 输入
    int n;
    scanf("%d",&n);
    int *nums=(int *)malloc(n*sizeof(int));
    for(int i=0;i<n;++i){
        scanf("%d",&nums[i]);
    }
    // 选择排序
    for(int i=0;i<n-1;++i){
        int idxOfMax=i;
        for(int j=i+1;j<n;++j){
            if(nums[j]>nums[idxOfMax]){
                idxOfMax=j;
            }
        }
        if(i!=idxOfMax){
            int tmp=nums[i];
            nums[i]=nums[idxOfMax];
            nums[idxOfMax]=tmp;
        }
    }
    // 输出
    for(int i=0;i<n;++i){
        printf("%d",nums[i]);
        if(i<n-1){
            printf(" ");
        }
    }
    printf("\n");
    
    return 0;
}

习题7-2 求一批整数中出现最多的个位数字 – 浙大版《C语言程序设计(第4版)》题目集

#include <stdio.h>
#include <math.h>
#include <limits.h>

int main(){
    // 输入
    int n;
    scanf("%d",&n);
    // 处理:计数排序
    int cnt[10]={0};
    for(int i=1;i<=n;++i){   
        int cur;
        scanf("%d",&cur);
        if(cur==0){
            ++cnt[0];
            continue;
        }
        while(cur>0){
            ++cnt[cur%10];
            cur/=10;
        }
    }
    // 寻找最大值
    int max=INT_MIN;
    for(int i=0;i<=9;++i){
        max=fmax(max,cnt[i]);
    }
    // 根据最大值找最大值对应的下标
    printf("%d:",max);
    for(int i=0;i<=9;++i){
        if(max==cnt[i]){
            printf(" %d",i);
        }
    }
    
    return 0;
}

发表评论