XDOJ第五弹:数组(下)& 结构体

​ ​直接上题。

P-0193 歌唱比赛

在这里插入图片描述

#include<stdio.h>
int main(){
    int n,a,min=100,max=0,sum=0;
    scanf("%d",&n);
    if(n>=3&&n<=10){
        for(int i=0;i<n;i++){
            scanf("%d",&a);
            if(a<min){
                min=a;
            }
            if(a>max){
                max=a;
            }
            sum+=a;
        }
        sum=sum-max-min;
        double avg=(double)sum/(n-2);
        printf("%.2lf",avg);
    }
    return 0;
}

P-0200 数组元素平移

在这里插入图片描述

//xdoj0200.c
#include<stdio.h>
int main(){
    int array[10]={1,2,3,4,5,6,7,8,9,10};
    int p;
    scanf("%d",&p);
    if(p>=0&&p<10){
        for(int i=p+1;i<10;i++){
        printf("%d ",array[i]);
        }
        for(int i=0;i<=p;i++){
        printf("%d ",array[i]);
        }
    }
    return 0;
}

P-0201 后项除以前项

在这里插入图片描述

//xdoj0201.c
#include<stdio.h>
int main(){
    int a[10];
    for(int i=0;i<10;i++){
        scanf("%d",&a[i]);
        if(i>=1){
            printf("%d ",a[i]/a[i-1]);
        }
    }
    return 0;
}

P-0204 单词统计

在这里插入图片描述

//xdoj0204.c
//oj似乎有某种问题
#include<stdio.h>
#include<string.h>
const int N=101;
const int M=9;
int main(){
    char str[N]={'\0'},word[M]={'\0'},words[N][N];
    int count=0;
    gets(str);
    gets(word);
    int len=strlen(str),len1=strlen(word);
    if(len1>8){
        return 0;
    }
    int r=0,c=0;
    for(int i=0;i<len;i++){
        if(str[i]==' '){
            words[r][c]='\0';
            r++;
            c=0;
        }else{
            words[r][c++]=str[i];
        }
    }
    for(int i=0;i<=r;i++){
        if(strcmp(word,words[i])==0){
            count++;
        }
    }
    printf("%s %d",word,count);
    return 0;
}

P-0206 字符删除

在这里插入图片描述

//xdoj0206.c
#include<stdio.h>
#include<string.h>
const int N=51;
int main(){
    char str[N];
    gets(str);
    char c;
    c=getchar();
    int len=strlen(str);
    for(int i=0;i<len;i++){
        if(str[i]!=c){
            printf("%c",str[i]);
        }
    }
    return 0;
}

P-0207 单词排序 (P-0244一模一样)

在这里插入图片描述

//xdoj0207.c  0244
//xdoj0244.c
#include<stdio.h>
#include<string.h>
//选择排序 和 冒泡排序分别过不了编号为 795和 797的例子
//也不知道是不是不稳定排序的问题
//题目貌似也没说明首字母一样的情况怎么排序
void wd_sort(char str[][20],int N){
    int i,j,flag,temp;
    char t[20];
    for(i=0;i<N;i++){
    for(j=0;j<N-1;j++){
      if(str[j][0]>str[j+1][0]){
                //利用strcpy进行 整行换行
        strcpy(t,str[j]);
                strcpy(str[j],str[j+1]);
                strcpy(str[j+1],t);
      }
    }
  }
}
//也可以if strcmp(str[min][0],str[j][0])==1
int main(){
    char str[10][20]={'\0'};
    int N;
    scanf("%d",&N);
    if(N>0&&N<=10){
        printf("\n");
        for(int i=0;i<N;i++){
            scanf("%s",&str[i]);
        }
        wd_sort(str,N);
        for(int i=0;i<N;i++){
        puts(str[i]);
        printf("\n");
      }
    }
    return 0;
}

P-0208 奇偶排序

在这里插入图片描述

//xdoj0208.c
#include<stdio.h>
void swap(int *a,int *b){
    int t=*a;
    *a=*b;
    *b=t;
}
void sort(int *num,int length){
    int i,j,min;
    for(i=0;i<length-1;i++){
        for(j=i,min=i;j<length;j++){
            if(num[min]>num[j]){
                min=j;
            }
        }
        if(min!=i){
            swap(&num[i],&num[min]);
        }
    }
}
int main(){
    int n,t,evennum[20],oddnum[20],j=0,k=0;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&t);
        if(t%2==0){
            evennum[j++]=t;
        }else{
            oddnum[k++]=t;
        }
    }
    sort(evennum,j);
    sort(oddnum,k); 
    for(int i=0;i<k;i++){
        printf("%d ",oddnum[i]);
    }
    printf(" ");
    for(int i=0;i<j;i++){
        printf(" %d",evennum[i]);
    }
    return 0;
}

P-0209 字符拷贝

在这里插入图片描述

//xdoj0209.c
#include<stdio.h>
#include<string.h>
int main(){
    char str[50];
    gets(str);
    int m;
    scanf("%d",&m);
    int len=strlen(str);
    for(int i=m+1;i<len;i++){
        printf("%c",str[i]);
    }
    return 0;
}

P-0210 最值交换

在这里插入图片描述

//xdoj0210.c 题目输出样例有错
#include<stdio.h>
void swap(int *a,int *b){
    int t=*a;
    *a=*b;
    *b=t;
}
void change(int *num,int length){
    int max=0,min=0;
    for(int i=1;i<length;i++){
        if(num[i]>num[max]){
            max=i;
        }
        if(num[i]<num[min]){
            min=i;
        }
    }
    swap(&num[min],&num[max]);
}
int main(){
    int num[20];
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&num[i]);
    }
    change(num,n);
    for(int i=0;i<n;i++){
        printf("%d ",num[i]);
    }
    return 0;
}

P-0224 矩阵相乘

在这里插入图片描述

//xdoj0224.c xdoj0162一样
#include<stdio.h>
int main(){
    int a[2][3];
    int b[3][2];
    for(int i=0;i<2;i++){
        for(int j=0;j<3;j++){
            scanf("%d",&a[i][j]);
        }
    }
    for(int i=0;i<3;i++){
        for(int j=0;j<2;j++){
            scanf("%d",&b[i][j]);
        }
    }
    int c1=a[0][0]*b[0][0]+a[0][1]*b[1][0]+a[0][2]*b[2][0];
    int c2=a[0][0]*b[0][1]+a[0][1]*b[1][1]+a[0][2]*b[2][1];
    int c3=a[1][0]*b[0][0]+a[1][1]*b[1][0]+a[1][2]*b[2][0];
    int c4=a[1][0]*b[0][1]+a[1][1]*b[1][1]+a[1][2]*b[2][1];
    printf("%d %d\n%d %d",c1,c2,c3,c4);
    return 0;
}

P-0225 矩阵计算

在这里插入图片描述

//xdoj0225.c
#include<stdio.h>
int main(){
    int mat[3][3],matt[3][3];
    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++){
            scanf("%d",&mat[i][j]);
            matt[i][j]=mat[i][j];
        }
    }
    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++){
            matt[i][j]=mat[i][j]+mat[j][i];
            printf("%d ",matt[i][j]);
        }
        printf("\n");
    }
    return 0;
}

P-0226 字符数组元素排序

在这里插入图片描述

//xdoj0226.c
#include<stdio.h>
#include<string.h>
int main(){
    char str[100];
    gets(str);
    int len=strlen(str);
    int i,j,min,t;
    for(i=0;i<len-1;i++){
        for(j=i,min=i;j<len;j++){
            if(str[min]>str[j]){
                min=j;
            }
        }
        if(min!=i){
            int t=str[min];
            str[min]=str[i];
            str[i]=t;
        }
    }
    for(int i=0;i<len;i++){
        printf("%c",str[i]);
    }
    return 0;
}

P-0238 数组鞍点 (GBK编码)

在这里插入图片描述

#include<stdio.h>
int main(){
    int num[4][5];
    int rmax[4],cmin[5];
    int t=0,i,j;
    for(i=0;i<4;i++){
        t=-2147483648;
        for(j=0;j<5;j++){
            scanf("%d",&num[i][j]);
            if(t<num[i][j]){
                t=num[i][j];
                rmax[i]=j;
            }
        }
    }
    //2^31-1
    for(i=0;i<5;i++){
        t=2147483647;
        for(j=0;j<4;j++){
            if(num[j][i]<t){
                t=num[j][i];
                cmin[i]=j;
            }
        }
        if(i==rmax[cmin[i]]){
            printf("%d %d %d",num[cmin[i]][rmax[cmin[i]]],cmin[i]+1,rmax[cmin[i]]+1);
            return 0;
        }}
    printf("鞍点不存在");
    return 0;
}

P-0239 杨辉三角

在这里插入图片描述

//xdoj0239.c
#include<stdio.h>
int Cnm(int n,int m){//组合数
    if(m==0||m==n){
        return 1;
    }
    int n1=n;
    int m1=m;
    for(int i=n-m+1;i<n;i++){
        n1*=i;
    }
    for(int i=1;i<m;i++){
        m1*=i;
    }
    return n1/m1;
}
int main(){
    int n;
    scanf("%d",&n);
    if(n>=2&&n<=10){
        printf("1\n");//第一行
        for(int i=1;i<n;i++){
            for(int j=0;j<=i;j++){
                printf("%d ",Cnm(i,j));
            }
            printf("\n");
        }
    }
    return 0;
}

P-0250 螺旋填数

在这里插入图片描述

//xdoj0250.c
#include<stdio.h>
int main(){
    int nums[100][100]={0},n,m,count=1,r=0,c=0;
    scanf("%d%d",&n,&m);
    int total=n*m;
    //四个边界 Right Left Up Down
    int Rlimit=m,Llimit=0,Ulimit=0,Dlimit=n;//理解为n次螺旋填数,每次填完,边界缩小
    while(count<=total){
        while(c<Rlimit){
            nums[r][c++]=count++;
        }c--;r++;while(r<Dlimit){
            nums[r++][c]=count++;
        }r--;c--;while(c>=Llimit){
            nums[r][c--]=count++;
        }c++;r--;while(r>Ulimit){
            nums[r--][c]=count++;
        }r++;c++;//每次螺旋之后,边界缩小
        Rlimit--;Llimit++;Ulimit++;Dlimit--;
    }//输出
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            printf("%d ",nums[i][j]);
        }
        printf("\n");
    }return 0;
}

结构体部分

P-0242 成绩统计

在这里插入图片描述

//xdoj0242.c
#include<stdio.h>
int main(){
    struct student{
        int idnum;
        char name[20];
        double s1;
        double s2;
        double s3;
        double avg;
    };
    int n;
    scanf("%d",&n);
    struct student stu[100];
    for(int i=0;i<n;i++){
        scanf("%d %s %lf %lf %lf",&stu[i].idnum,&stu[i].name,&stu[i].s1,&stu[i].s2,&stu[i].s3);
        stu[i].avg=(stu[i].s1+stu[i].s2+stu[i].s3)/3;
    }
    int i,j,max;
    struct student t;
    for(i=0;i<n-1;i++){
        for(j=i,max=i;j<n;j++){
            if(stu[max].avg<stu[j].avg){
                max=j;
            }
        }
        if(max!=i){
            t=stu[i];
            stu[i]=stu[max];
            stu[max]=t;
        }
    }
    for(int i=0;i<n;i++){
        printf("%d %s %.1lf\n",stu[i].idnum,stu[i].name,stu[i].avg);
    }
    return 0;
}

P-0243 考试排名

在这里插入图片描述

//xdoj0243.c
#include<stdio.h>
int main(){
    typedef struct stu{
        char name[20];
        int s[5];
        int plus;
        int sum; 
    }STU;
    int n;
    scanf("%d",&n);
    STU info[100];
    for(int i=0;i<n;i++){
        scanf("%s %d %d %d %d %d %d",&info[i].name,&info[i].s[0],&info[i].s[1],&info[i].s[2],&info[i].s[3],&info[i].s[4],&info[i].plus);
        info[i].sum=info[i].s[0]+info[i].s[1]+info[i].s[2]+info[i].s[3]+info[i].s[4]+info[i].plus;
    }
    int i,j,max;
    STU t;
    for(i=0;i<n-1;i++){
        for(j=i,max=i;j<n;j++){
            if(info[max].sum<info[j].sum){
                max=j;
            }else if(info[max].sum==info[j].sum){
                max=info[max].plus>info[j].plus?max:j;
            }
        }
        if(max!=i){
            t=info[max];
            info[max]=info[i];
            info[i]=t;
        }
    }
    for(int i=0;i<n;i++){
        printf("%s %d %d\n",info[i].name,info[i].sum,info[i].plus);
    }
}

P-0251 年月日统计

在这里插入图片描述

//xdoj0251.c
#include<stdio.h>
int main(){
    typedef struct date{
        int year;
        int month;
        int day;
    }DATE;
    DATE input;
    scanf("%d,%d,%d",&input.year,&input.month,&input.day);
    int sum;
    switch (input.month) // 先计算某月以前月份的总天数
    {
        case 1:sum = 0;
            break;
        case 2:sum = 31;
            break;
        case 3:sum = 59;
            break;
        case 4:sum = 90;
            break;
        case 5:sum = 120;
            break;
        case 6:sum = 151;
            break;
        case 7:sum = 181;
            break;
        case 8:sum = 212;
            break;
        case 9:sum = 243;
            break;
        case 10:sum = 273;
            break;
        case 11:sum = 304;
            break;
        case 12:sum = 334;
            break;
    }
    sum = sum + input.day;
    int leap;
    if (input.year % 400 == 0 || (input.year % 4 == 0 && input.year % 100 != 0)) {
        leap = 1;
    } else {
        leap = 0;
    }
    if (leap == 1 && input.month > 2) { // 如果是闰年且月份大于2,总天数应该加一天
        sum++;
    }
    printf("%d",sum);
    return 0;
}

最后

感兴趣的可以关注我的微信公众号,第一时间收到动态

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值