《C语言程序设计(第3版)》教材配套习题 第八章

日期的计算

输入年份和天数,输出对应的年、月、日

要求:定义和调用函数month_day ( year, yeardy, *pmonth, *pday),通过参数pmonth和pday返回计算得出的月和日。例如,输入2000和61,分别返回3和1,即2000年的第61天是3月1日。
裁判测试程序样例

# include <stdio.h>
void month_day ( int year, int yearday, int * pmonth, int * pday);

int main (void)
{
   int day, month, year, yearday; /*  定义代表日、月、年和天数的变量*/
   scanf ("%d%d", &year, &yearday );		
   month_day (year, yearday, &month, &day );/* 调用计算月、日函数  */ 
   printf ("%d %d %d\n", year, month, day );	
   return 0;	
}

/* 请在这里填写答案 */

思路:总天数减去前几个月天数,剩下的就是当月天数了
解答

void month_day ( int year, int yearday, int * pmonth, int * pday)
{
	int month;
	int is_leap = 0; //默认为平年
	int days[2][12] = { //把每月天数装在数组里
		{ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, //平年0
		{ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}  //闰年1
	}
	//判断是否闰年
	//if ( year%4==0 && year%100 || year&400==0 ) is_leap = 1; 
	is_leap = year%4==0 && year%100 || year&400==0; //这样判断闰年也可以,直接赋值
	//yearday作为剩下的天数
	for ( month=1; yearday>days[is_leap][month]; month++ ){
		yearday -= days[is_leap][month];
	}
	
	*pmonth = month;
	*pday = yearday;
}

字符串

找最小的字符串

输入:第一行给出正整数N;随后N行,每行给出一个长度小于80的非空字符串,其中不会出现换行符,空格,制表符。
输出:Min is: 最小字符串。
关键n行的字符串如何获取

  1. 用二维数组来装,每行装一串
  2. ①在Dev C++中,gets(a)可以获取字符串,但如果前面有用scanf的话,需要用getchar()把scanf时遗留在缓冲区中的回车符收走
    ②在PAT中,gets(a)不能用,只能用循环+scanf(%s)
#include <stdio.h>
#include <string.h>
#define N 80
#define M 1000

int main()
{
    int n;
    char a[M][N];
    char *min;
    
    scanf("%d", &n);
    //getchar();
    for ( int i=0; i<n; i++ ){
//         gets(a[i]);
        scanf("%s", a[i]);
    }
    
    min = a[0];
    for ( int i=1; i<n; i++ ){
        if ( strcmp(a[i],min) < 0 ) min = a[i];
    }
    
    printf("Min is: %s", min);
    
    return 0;
}
找出最大字符

要求:在字符串str中找出最大的字符并放在第一个位置上,并将将字符前的原字符往后顺序移动。

char str[80], *p, max, *q;
p=str; 
gets(p); 
max=*(p++);
while(*p != '\0'){
   if(max<*p){
		 max=*p; //max装最大值其值
		 q=p; //用q来标记最大值的位置
	}
    p++;
}
p=q; //让p指向最大值的位置
while( p>str ) { 
	*p=*(p-1); //把最大值那个位置覆盖掉,前面的都往后移一位
	p--; 
}
*p=max; //第一位放最大值
puts(p);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值