C#入门练习题(17-24例)

C语言练习题

17.排序名单(字典)

学习了字典序和字符串比较之后,今天让我们来给学生名单进行一下排序。我们知道计算理工学院的每个精英班有 10 名学生,老师会依次给出 10 名学生的名字(均为不含有空格的英文字符串)。你需要将这些名字按照字典序从小到大进行输出。

输入格式

测评机会反复运行你的程序。每次程序运行时,你的程序会被输入10行不含有空格的字符串,分别对应十个学生的姓名(字符串长度均大于 0且小于 20)。

输出格式

输出为10行,为排序后的 10个学生姓名,每个学生姓名单独占一行。

样例输入

Alice
Bob
Gary
Harry
Ivn
Julia
Danis
Fone
Candy
Evan

样例输出

Alice
Bob
Candy
Danis
Evan
Fone
Gary
Harry
Ivn
Julia
完整代码:
#include <stdio.h>

int main() {
    int i,j;
    char name[10][21];
    char temp[21];
    for (i = 0; i < 10 ;i++) {
        scanf("%s",&name[i]);
        //printf("%s\n",name[i]);
    }
    
    for (i = 0; i < 10 ; i++) {
        for(j = i + 1; j < 10; j++){
            if(strcmp(name[i], name[j]) > 0) {
                strcpy(temp, name[i]);
                strcpy(name[i], name[j]);
                strcpy(name[j], temp);
            }
        }
    }
    
    for (i = 0; i < 10; i++) {
        printf("%s\n",name[i]);
    }
    return 0;
}

18.矩阵翻转输出

题目描述:

在这里插入图片描述

输入格式:

在这里插入图片描述

输出格式:

输出包括 m 行,每行包含 n 个整数,按要求输出翻转后的矩阵,每行任意两个整数之间用一个空格分隔,每行最后一个整数后面没有空格。

样例输入1:

2 3
1 2 3
3 4 6
1
1234

样例输出1

3 2 1
6 4 3
12

样例输入2

3 2
1 2
3 4
5 6
0
12345

样例输出2

5 6
3 4
1 2
完整代码:
#include <stdio.h>

int main() {
    int matrix[100][100];
    int m;
    int n;
    int choice;
    int i,j;
    scanf("%d %d\n",&m,&n);
    for(int i = 0; i < m; i++){
        for(int j = 0; j < n; j++){
            scanf("%d ",&matrix[i][j]);
        }
        scanf("\n");
    }
    
    scanf("%d\n",&choice);
    
 
    
    if(choice == 0){
        for( i = 0; i< m/2; i++){
           for( j = 0; j < n; j++){
            int temp = matrix[i][j];
            matrix[i][j] = matrix[m-1-i][j];
            matrix[m-1-i][j] = temp;
            } 
           
         }    
    }
    if(choice == 1){
        for( i = 0; i < m; i++){
            for( j = 0; j <n/2; j++){
                int temp = matrix[i][j];
                matrix[i][j] = matrix [i][n-1-j];
                matrix[i][n-1-j] = temp;
               
            }
        }
         
    }
    for( i = 0; i < m; i++){
            for( j = 0; j < n; j++){
                  printf("%d",matrix[i][j]);
                if(j!=n-1) printf(" ");
            }printf("\n");
    }
    return 0;
}

19.矩阵旋转

对于一个给定的 3×3 矩阵,请将其顺时针旋转 90度后输出。

输入格式

测评机会反复运行程序。每次程序运行时,你的程序仅需要输入三行,第 ii 行输入三个整数 a_i,b_i,c_i(−10000≤a_i,b_i,c_i≤10000),任意两个整数之间用一个空格分开。

输出格式

输出为三行,每行包括三个整数,与题目要求的一致(从直观上看,输出的结果应为输入的矩阵旋转90度后的结果),每行的任意两个整数之间用一个空格分开,最后一个整数后面没有空格。

样例输入1

1 2 3
3 4 6
7 8 9

样例输出1

7 3 1
8 4 2
9 6 3

样例输入2

6 6 6
2 3 3
9 1 1

样例输出2

9 2 6
1 3 6
1 3 6

解题思路

观察角标性质可知
输出结果的矩阵和原矩阵的关系为
result[i][j] = matrix[3 - j - 1][i];

完整代码:
#include <stdio.h>

void swap(int* a, int* b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
}

int main()
{
    int matrix[3][3];
    int result[3][3];
    int i;
    int j;
    for (i = 0; i < 3; i++)
    {
        for (j = 0; j < 3; j++)
        {
            scanf("%d", &matrix[i][j]);
        }
    }
    for (i = 0; i < 3; i++)
    {
        for (j = 0; j < 3; j++)
        {
            result[i][j] = matrix[3 - j - 1][i];
        }
    }
    for (i = 0; i < 3; i++)
    {
        for (j = 0; j < 3; j++)
        {
            printf("%d", result[i][j]);
            if (j != 2)
            {
                printf(" ");
            }
        }
            printf("\n");
       
    }

    return 0;
}


20.矩阵螺旋输出

给定一个 m 行、n 列的矩阵,请按照顺时针螺旋的顺序输出矩阵中所有的元素(从[0][0]位置开始,具体请参见下图)。

img

输入格式

测评机会反复运行你写的程序。每次程序运行时,首先在第一行输入 2 个整数,分别对应题目描述中的 m和 n(1≤m,n≤100),之间用一个空格分隔。接下来输入 m行,每行包含 n 个整数(−10000≤a,b,c≤10000),每两个整数之间用一个空格分隔。

输出格式

输出为一行,包括 m×n 个整数,按照题目要求的顺序依次输出所有矩阵元素,任意两个整数之间用一个空格分隔,最后一个整数后面没有空格。

样例输入1

2 3
1 2 3
3 4 6

样例输出1

1 2 3 6 4 3

样例输入2

3 2
1 2
3 4
5 6

样例输出2

1 2 4 6 5 3
完整代码:
#include <stdio.h>

int main()
{
    int matrix[100][100];
    int m;
    int n;
    int i;
    int j;
    //规定矩阵m行n列
    scanf("%d%d", &m, &n);
    //在声明的空间填充矩阵
    for (i = 0; i < m; i++)
    {
        for (j = 0; j < n; j++)
        {
            scanf("%d", &matrix[i][j]);
        }
    }
    //定义四个变量记录矩阵的四个角落
    int i_tail = 0;
    int j_tail = 0;
    int i_head = n - 1;
    int j_head = m - 1;

    int count = 0;//记录矩阵输出的元素个数

    i = 0;
    j = 0;
    while (1)
    {
        printf("%d", matrix[j][i]);
        count++;
        if (count != m * n)
        {
            printf(" ");
        }
        else
        {
            break;
        }
        //输出最外圈
        if ((i >= i_tail) && (i < i_head) && (j == j_tail))//→
        {
            i++;
        }
        else if ((j >= j_tail) && (j < j_head) && i == i_head)//↓
        {
            j++;
        }
        else if ((i > i_tail) && (i <= i_head) && (j == j_head))//←
        {
            i--;
        }
        else if ((j > j_tail) && (j <= j_head) && (i == i_tail))//↑
        {
            j--;
        }
        //输出一圈后更新边界条件
        if ((i == i_tail) && (j == j_tail))
        {
            i++;
            j++;
            i_head--;
            j_head--;
            i_tail++;
            j_tail++;
        }
    }
    return 0;
}

21.判断闰年

题目描述:

学会利用if…else…以及逻辑组合运算对一个年份是否是闰年进行判断

对于不大于3000年的年份,闰年遵循如下规律:

  • 非整百年,能被4整除的为闰年。

  • 整百年,能被400整除的是闰年。

公历闰年计算原则(按一回归年365天5小时48分45.5秒)

1)普通年能整除4且不能整除100的为闰年。(如2004年就是闰年,1900年不是闰年)

2)世纪年能整除400的是闰年。(如2000年是闰年,1900年不是闰年)

3)对于数值很大的年份,这年如果能被3200整除,并且能被172800整除则是闰年。如172800年是闰年,86400年不是闰年(因为虽然能被3200整除,但不能被172800整除)(此按一回归年365天5h48’45.5’'计算)。

样例输入1

2016

样例输出1

YES

样例输入2

1900

样例输出2

NO
完整代码:
#include <stdio.h>
int main() {
    int year;
    // 从用户处获得一个不大于 3000 的年份
    scanf("%d", &year);
    
    // 在下面完成你的逻辑
    if((year%100 !=0 && year%4 ==0)||year % 400 == 0){
        printf("YES");
}else
    {printf("NO");}
    
    return 0;
}

另外一种方法

#include <stdio.h>
int main()
{
    int year,a;
    printf("请输人年份:\n");
    scanf("%d",&year);
    if(year%400==0)
        a=1;
    else
    {
        if(year%4==0&&year%100!=0)
            a=1;
        else
            a=0;
    }
    if(a==1)
    {
        printf("YES");
    }
    else
    {
        printf("NO");
    }
    return 0;
}

22.合法日历

这次的题目也不是很难。测试程序将随机给你一个格式为-连接了年、月、日的日期字符串(其中的数字都是没有前导零的,也就是说7不会被写成07)。你将需要判断这个日期在我们的公历体系内是否真实存在。如果存在则输出YES,否则输出NO(注意输出的字母都一定是大写字母)。

测试程序给出的测试输入数据中,年、月、日都是正整数(也就是大于零的整数),均不大于3000。

已知,一年有 1 月到 12 月,共 12个不同的月份;其中 1 月、3 月、5 月、7 月、8 月、10 月、12 月有 31个合法的日,分别为 1 日到 31 日;4 月、6 月、9 月、11 月有 30个合法的日,分别为 1 日到 30 日。对于闰年,2 月有 29个合法的日,分别为 1 日到 29 日;对于平年(不是闰年的年称为平年),2 月有 28个合法的日,分别为 1 日到 28日。

对于不大于 3000 年的年份,闰年遵循如下规律:

  • 非整百年,能被 4整除的为闰年。
  • 整百年,能被 400整除的是闰年。

要想做好这道题,你需要先回忆一下,如何使用scanf去接收一个指定了格式的字符串中的量(在这里就是-前后的正整数)。

之后呢,你需要做很多的判断,会嵌套地用到我们已经学的if...else...的结构。你将需要:

  • 判断输入日期中的月份是不是合法的月份(这里特殊情况最少,建议第一层先判断);
  • 针对每个月的日数判断输入日期中日的合法性;
  • 注意抓住特殊的 2 月,在里面讨论年的问题(看是不是闰年);
    • 对于闰年,允许 29 日的存在
    • 对于非闰年不能允许 29 日的存在。

如果你还是有点想不清楚,可以参考如下这张流程图

img

样例输入1

2016-2-29

样例输出1

YES

样例输入2

1900-2-29

样例输出2

NO

样例输入3

2016-13-32

样例输出3

NO
完整代码:
#include <stdio.h>
int main() {
  int year;
  int month;
  int day;  // 定义年月日,便于后续获取,使用
  scanf("%d-%d-%d", &year,&month,&day);//按照格式输入 的年月日
  if(month<=12&&day<=31){//判断月份和日期是否正确存在
     if(month==4||month==6||month==9||month==11){//判断月份,30天的月判断
         if(day<=30){
             printf("YES");
         }else{
             printf("NO"); 
         }
        
     }else if(month==2){//判断二月的情况
        if( ((0 == year%4)&&(0 != year%100)) ||(0 == year %400) ){//如果是闰年 
             if(day<=29){
                printf("YES");
             }else{
               printf("NO"); 
             }
         }else{//如果不是闰年 
             if(day<=28){
                printf("YES");
             }else{
                printf("NO");  
             }
         }
     }else{//由于剩下的都是31天,可以直接判定存在
          printf("YES"); 
     }         
       
  }else{//如果日期不存在
          printf("NO");
  }
}  

23.判断质数

我们一边学习循环结构,一边完成了各种与质数相关的小任务。这一次,你需要在没有引导的情况下,独立完成一个比我们之前课程中学习的内容略简单一点的小任务:

我们都知道,对于一个大于1的整数,如果除了1和它本身,它不再被其它正整数整除,那么我们说它是一个质数。

请对于给定的一个大于1的正整数 N(你可以认为测评机给出的 N均小于 1000),判定它是否是一个质数。

输入格式

测评机会反复运行你的程序。每次程序运行时,你的程序仅需输入一个符合描述的正整数。

输出格式

输出也仅为一行,如果判题机在输入中给出的数字为质数,那么请输出YES;否则,请输出NO

样例输入1

3

样例输出1

YES

样例输入2

9

样例输出2

NO
完整代码:
#include <stdio.h>
#include <math.h>
int main() {
    int digit;//除数
    int divisor;//被除数
    int flag;
    scanf("%d", &digit);
    if (digit < 2)
    {
        printf("NO\n");
        return 0;
    }
    if (digit == 2)
    {
        printf("YES\n");
        return 0;
    }
    for (divisor = 2; divisor <= sqrt(digit); divisor ++) 
        {                    
			if (digit % divisor == 0)
            {
                flag = 0;
                break;
            }
            if(divisor > sqrt(digit))
            {
                flag = 1;
            }
        }
    if(flag == 1)
        printf("YES\n");
    if(flag == 0)
        printf("NO\n");
    
    return 0;
}

24.实现水仙花数输出

题目描述:

“水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:153=13+53+33。 现在要求输出所有在m和n范围内的水仙花数。

输入描述

输入数据有多组,每组占一行,包括两个整数m和n(100 ≤ m ≤ n ≤ 999)。

输出描述
对于每个测试实例,要求输出所有在给定范围内的水仙花数,就是说,输出的水仙花数必须大于等于m,并且小于等于n,如果有多个,则要求从小到大排列在一行内输出,之间用一个空格隔开;
如果给定的范围内不存在水仙花数,则输出no;
每个测试实例的输出占一行

完整代码:
#include <stdio.h>
int main()
{
	int start, end, i = 0, a, b, c, size = 0;
	while (scanf("%d %d", &start, &end) == 2)
	{
		for (i = start; i <= end; i++)
		{
			a = i / 100;
			b = i / 10 % 10;
			c = i % 10;
			//total = pow(c, 3) + pow(a, 3) + pow(b, 3);
			if ((a*a*a + b*b*b + c*c*c) == i)  //满足水仙花条件
			{

				if (size == 0)   //size=0输出第一个水仙花数 
				{
					printf("%d", i);
				}
				else     //size++输出第二。。第n个水仙花数
				{
					printf(" %d", i);
				}
				size++;   //个数++;
			}
		}
		if (size == 0)   //范围内个数为0,则说明没有满足条件的
		{
			printf("no");
		}
		printf("\n");
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值