C语言习题:进制转化,打印日期,打印柱状图

1、从键盘上输入字符,将小写字母转换成大写字母。输入“ctl + z” 结束

#include <stdio.h>
int main() {
	char c;
	int ret;
	while (scanf("%c", &c) != EOF) {
		if (c != '\n') {
			printf("%c", c - 32);
		}
		else {
			printf("\n");
		}
	}
	return 0;
}

2、从键盘上输入字符,(1)分别统计一下其中字母,数字,其他字符的个数, (2)将统计的字母,数字,其他字符的个数以柱状图的形式打印(柱子从高到低)。例如

  5
***** 
*****     3
*****   *****     2
*****   *****   *****
*****   *****   *****
 alp     num     oth
#include <stdio.h>
#include <ctype.h>
#include <math.h>
int main() {
	char c;
	int i = 0, j = 0, k = 0,v = 0, max;     //i,j,k分别表示字母、数字、和其他字符的数量
	int h1, h2, h3;
	int flag1 = 0, flag2 = 0, flag3 = 0;    //指示标志,0表示没有打印最上面的数字,1表示已经打印了数字
	while (scanf("%c", &c) != EOF) {
		if (isalpha(c)) {
			i++;
		}
		else if (isdigit(c)) {
			j++;
		}
		else {
			k++;
		}
	}
	k--;
	printf("字符 = %d,数字 = %d,其他字符 = %d\n", i, j, k);
	max = (i > j) ? ((i > k) ? i : k) : ((j > k) ? j : k);    //判断三个数中的最大值
	h1 = abs(i - max);     //距离差值
	h2 = abs(j - max);
	h3 = abs(k - max);
	//开始打印
	//打印最上面的数字
	if (h1 == 0){
		printf("  %d  ", i);
		flag1 = 1;
	}
	else{
		 printf("      ");
	}
	printf("\t");
	if (h2 == 0){
		printf("  %d  ", j);
		flag2 = 1;
	}
	else{
		 printf("      ");
	}
	printf("\t");
	if (h3 == 0){
		printf("  %d  ", k);
		flag3 = 1;
	}
	else{
		printf("      ");
	}
	printf("\n");
	//开始循环,总共有 max 遍
	for (v = 1; v <= max; v++){
	//针对alp的打印
		if (flag1){
			 printf("*****");
		}
		else{
			 h1--;
			 if (h1 == 0){  //表示要打印数字了
				  printf("  %d  ", i);
				  flag1 = 1;
			 }
			 else{
				  printf("     ");
			 }
		}
		printf("\t");
	//针对num的打印
		if (flag2) {
			printf("*****");
		}
		else {
			h2--;
			if (h2 == 0) {  //表示要打印数字了
				printf("  %d  ", j);
				flag2 = 1;
			}
			else {
				printf("     ");
			}
		}
		printf("\t");
	//针对oth的打印
		if (flag3) {
			printf("*****");
		}
		else {
			h3--;
			if (h3 == 0) {  //表示要打印数字了
				printf("  %d  ", k);
				flag3 = 1;
			}
			else {
				printf("     ");
			}
		}
		//打印完一行就换行
		printf("\n");
	}
	printf(" alp  \t");
	printf(" num  \t");
	printf(" oth  \t");
	printf("\n");
	return 0;
}

3、 进制转换
(1)将十进制数转换成二进制数。输入十进制数输出对应的二进制数
(2)将二进制转换成十进制数。输入二进制数输出对应的十进制数
(3)将十进制数转换成十六进制数。输入十进制数输出对应的十六进制数
(4)将十六进制数转换成十进制数。输入十六进制数输出对应的十进制数


#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define N 32
#define M 33
void change_ten_two(int num){
	int arr[N] = {0};
	int i;
	for(i = 0; i < N; i++){
		arr[i] = num % 2;
		num = num >> 2;
		if (num == 0) {
			break;
		}
	}
	for (; i >= 0; i--) {
		printf("%d", arr[i]);
		if (i % 4 == 0) {
			printf(" ");
		}
	}
	printf("\n");
}


void change_two_ten(int n) {
	int num = 0, i = 0, remainder;
	while (n != 0) {
		remainder = n % 10;
		n = n / 10;
		num = num + remainder * pow(2, i);
		i++;
	}
	printf("%d\n", num);
}


void change_two_ten_A(char *str) {
	char c;
	int num = 0, j = 0;
	for (int i = 31; i >= 0; i--) {
		printf("%c", c);
		if (i % 4 == 0) {
			printf(" ");
		}
	}
	printf("\n");
	for (int i = 0; i < 32; i++) {
		j = str[i] - '0';
		num = num + j * pow(2, i);
	}
	printf("%d\n", num);
}


void change_ten_sixteen(int num) {
	int arr[N];
	int i;
	for (i = 0; i < N; i++) {
		arr[i] = num % 16;
		num = num / 16;
		if (num == 0) {
			break;
		}
	}
	for (; i >= 0; i--) {
		switch (arr[i]) {
		case 10: printf("A"); break;
		case 11: printf("B"); break;
		case 12: printf("C"); break;
		case 13: printf("D"); break;
		case 14: printf("E"); break;
		case 15: printf("F"); break;
		default: printf("%d", arr[i]);
		}
	}
	printf("\n");
}

int main(){
	int num;
	char str[M] = {0};
	//while (rewind(stdin), scanf("%d", &num) != EOF){
	//	change_ten_two(num);
	//	change_two_ten(num);
	//	change_ten_sixteen(num);
	//}
	while (rewind(stdin), gets(str) != NULL) {
		change_two_ten_A(num);
	}
	printf("\n");
	return 0;
}

#include<stdio.h>                     //十六进制转十进制,用字符数组存储十六进制字符
int main(){
	char* p, s[10]; 
	int n = 0, m = 0;
	p = s;
	gets(p);
	while (*p != '\0'){
		if (*p <= 9) {
			m = *p - '0';
		}
		else {
			switch (*p) {
			case 'A':m = 10; break;
			case 'B':m = 11; break;
			case 'C':m = 12; break;
			case 'D':m = 13; break;
			case 'E':m = 14; break;
			case 'F':m = 15; break;
			default:break;
			}
		}
		n = n * 16 + m;
		p++;
	}
	printf("%d", n);
	return 0;
}

4、统计一个整数对应的二进制数的1的个数。输入一个整数(可正可负), 输出该整数的二进制包含1的个数, “ctl+ z” 结束。

void count_one(int num)
{
	int count = 0;
	int i = 0;
	for (i = 0; i < 32; i++)
	{
		if (((num >> i) & 1) == 1)
		{
			count++;
		}
	}
	printf("%d\n", count);
}
int main() {
	int num;
	while (rewind(stdin), scanf("%d", &num) != EOF) {
		count_one(num);
	}
	printf("\n");
	return 0;
}

第五题:
(1)输入年月日,输出该日期是当年的第几天。

#include <stdio.h>
#include <stdlib.h>
int main()
{
	int year, mon, day, total, i;
	int date[] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
	while (scanf("%d%d%d", &year, &mon, &day) != EOF)
	{
		total = 0;
		for (i = 0; i < mon - 1; i++)
		{
			total += date[i];
		}
		total += day;
		if (mon > 2)
		{
			total += (year % 4 == 0 && year % 100 != 0 || year % 400 == 0);
		}
		printf("%4d-%02d-%02d is %dth days\n", year, mon, day, total);
	}
	return 0;
}

(2)输入两个日期(年 月 日 年 月 日), 输出这两个日期之间差多少天。
公式:sum = delt(year1 year2) - dayofyear(date1) + dayofyear(date2)

#include <stdio.h>
int main() {
	int i = 0, total = 0, j =0;
	int year1, mon1, day1, total1 = 0;
	int year2, mon2, day2, total2 = 0;
	int date[] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
	scanf("%d%d%d", &year1, &mon1, &day1);
	for (i = 0; i < mon1 - 1; i++)
	{
		total1 += date[i];
	}
	total1 += day1;
	if (mon1 > 2)
	{
		total1 += (year1 % 4 == 0 && year1 % 100 != 0 || year1 % 400 == 0);
	}
	printf("%4d-%02d-%02d is %dth days\n", year1, mon1, day1, total1);
	scanf("%d%d%d", &year2, &mon2, &day2);
	for (i = 0; i < mon2 - 1; i++)
	{
		total2 += date[i];
	}
	total2 += day2;
	if (mon2 > 2)
	{
		total2 += (year2 % 4 == 0 && year2 % 100 != 0 || year2 % 400 == 0);
	}
	printf("%4d-%02d-%02d is %dth days\n", year2, mon2, day2, total2);
	if (year1 > year2) {
		for (j = year2; j < year1; j++) {
			if (j % 4 == 0 && j % 100 != 0 || j % 400 == 0) {
				total += 366;
			}
			else {
				total += 365;
			}
		}
		total += total2 - total1;
	}
	else if (year1 == year2) {
		if (total1 > total2) {
			total = total1 - total2;
		}
		else {
			total = total2 - total1;
		}
	}
	else {
		for (j = year1; j <= year2; j++) {
			if (j % 4 == 0 && j % 100 != 0 || j % 400 == 0) {
				total += 366;
			}
			else {
				total += 365;
			}
		}
		total += total1 - total2;
	}
	printf("两个日期间相差了:%d天", total);
	return 0;
}

(3)输入一个日期,输出该日期是星期几。公式: a. delt % 7 b. (7 – delt % 7) % 7

#include <stdio.h>
int main() {
	int i = 0, total = 0, j = 0, a = 0;
	int year1, mon1, day1, total1 = 0;
	int year2, mon2, day2, total2 = 0;
	int date[] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
	printf("以星期天为基准,请先选定一个基准日期:\n");
	scanf("%d%d%d", &year1, &mon1, &day1);
	for (i = 0; i < mon1 - 1; i++)
	{
		total1 += date[i];
	}
	total1 += day1;
	if (mon1 > 2)
	{
		total1 += (year1 % 4 == 0 && year1 % 100 != 0 || year1 % 400 == 0);
	}
	printf("该日期是当年的第:%d天\n", total1);
	printf("请输入你想要查询的日期:\n");
	scanf("%d%d%d", &year2, &mon2, &day2);
	for (i = 0; i < mon2 - 1; i++)
	{
		total2 += date[i];
	}
	total2 += day2;
	if (mon2 > 2)
	{
		total2 += (year2 % 4 == 0 && year2 % 100 != 0 || year2 % 400 == 0);
	}
	printf("所查询的日期是当年的第:%d天\n", total2);
	//printf("%4d-%02d-%02d is %dth days\n", year2, mon2, day2, total2);
	if (year1 > year2) {
		for (j = year2; j < year1; j++) {
			if (j % 4 == 0 && j % 100 != 0 || j % 400 == 0) {
				total += 366;
			}
			else {
				total += 365;
			}
		}
		total += total2 - total1;
	}
	else if (year1 == year2) {
		if (total1 > total2) {
			total = total1 - total2;
		}
		else {
			total = total2 - total1;
		}
	}
	else {
		for (j = year1; j <= year2; j++) {
			if (j % 4 == 0 && j % 100 != 0 || j % 400 == 0) {
				total += 366;
			}
			else {
				total += 365;
			}
		}
		total += total1 - total2;
	}
	printf("两个日期间相差了:%d天\n", total);
	if (year2 > year1) {
		a = total % 7;
	}
	else if (year2 == year1) {
		if (total2 > total1) {
			a = total % 7;
		}
		else {
			a = (7 - total % 7) % 7;
		}
	}
	else {
		a = (7 - total % 7) % 7;
	}
	printf("你所查询的星期是:");
	switch (a) {
		case 0:printf("星期天"); break;
		case 1:printf("星期一"); break;
		case 2:printf("星期二"); break;
		case 3:printf("星期三"); break;
		case 4:printf("星期四"); break;
		case 5:printf("星期五"); break;
		case 6:printf("星期六"); break;
	}
	return 0;
}

(4)输入 一个日期 和一个整数 n,输出从该日期起经过n天以后的日期。
-> date -> tomorrow of the date

/输入一个日期和一个整数 n,输出从该日期起经过n天以后的日期。
#include <stdio.h>
struct DATA {
	int year;
	int mon;
	int day;
};
//判断是否是闰年 
int isleap(int year) {
	if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
		return 1;
	else
		return 0;
}
//计算N天后的日期 
struct DATA cal_tomorrow(struct DATA, int num, int data[]);
int main()
{
	int i = 0, total = 0, j = 0, a = 0;
	struct DATA mydata, my_return;
	int n;
	int date[] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
	printf("请输入一个日期:\n");
	scanf("%d%d%d", &mydata.year, &mydata.mon, &mydata.day);
	printf("请输入天数:\n");
	scanf("%d", &n);
	my_return = cal_tomorrow(mydata, n, date);
	printf("%4d-%02d-%02d\n", my_return.year, my_return.mon, my_return.day);
	return 0;
}
struct DATA cal_tomorrow(struct DATA mydata, int num, int data[]) {
	int leap = isleap(mydata.day);
	int cnt = 0;
	while (cnt < num) {
		if (num > 365 + isleap(mydata.year)) {
			num = num - (365 + isleap(mydata.year));
			mydata.year++;
		}
		cnt++;
		mydata.day++;
		if ((mydata.day == data[mydata.mon - 1] + isleap(mydata.year) && mydata.mon == 2) || (mydata.day == data[mydata.mon - 1])) {
			if (mydata.mon == 12) {
				mydata.year++;
			}
			mydata.mon = mydata.mon++ % 12;
			mydata.day = 1;
		}
	}
	return mydata;
};

(5)输入一个年份,月份,输出该月份的日历。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int isleap(int year);        //判断是否为闰年
int month_day(int year, int month);    //返回某月的天数
int month_first_day_week(int year, int month);    //返回某月的第一天是星期几
void print_calendar(int year, int month);         //打印某年某月日历
int main() {
	int year, month;
	scanf("%d %d", &year, &month);
	print_calendar(year, month);
	return 0;
}
int isleap(int year) {
	if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
		return 1;
	else
		return 0;
}
int month_day(int year, int month) {
	switch (month)
	{
	case 2:
		if (isleap(year)) {
			return 29;
		}
		else {
			return 28;
		}
		break;
	case 4:
	case 6:
	case 9:
	case 11:
		return 30;
		break;
	case 1:
	case 3:
	case 5:
	case 7:
	case 8:
	case 10:
	case 12:
		return 31;
		break;
	default:
		break;
	}
}
int month_first_day_week(int year, int month) {

	int week = 1;
	for (int i = 1900; i < year; i++) {  
		++week;    //  365 % 7 = 1
		if (isleap(i)) {
			++week;
		}
	}
	for (int i = 1; i < month; i++) {

		week += month_day(year, i);
	}
	week %= 7;
	return week;
}
void print_calendar(int year, int month) {
	int days, day_week;
	int i = 1;
	int day = 1;
	printf("%4d-%02d\n", year, month);
	printf("Mon   Tue   Wed   Thu   Fri   Sat   sun\n\n");
	days = month_day(year, month);
	day_week = month_first_day_week(year, month);
	if (day_week == 0) {
		day_week = 7;
	}
	while (i < day_week) {
		printf("      ");
		i++;
	}
	while (day <= days) {
		printf("%-6d", day);
		day++;
		i = i % 7;
		if (i == 0) {
			printf("\n\n");
		}
		//i = i % 7;
		i++;
	}
	if (i != 0) {
		printf("\n");
	}
}

(6)打印任意一年的日历

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int whatday(int year, int mon, int day)
{
	int oyear = 1920;
	int omon = 1;
	int oday = 4;
	int days[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };

	int cnt = 0;
	while (oyear != year || omon != mon || oday != day)
	{
		if (oyear % 4 == 0 && oyear % 100 != 0 || oyear % 400 == 0)
		{
			days[2] = 29;
		}
		else
		{
			days[2] = 28;
		}
		++cnt;
		++oday;
		if (oday > days[omon])
		{
			++omon;
			oday = 1;
		}
		if (omon > 12)
		{
			++oyear;
			omon = 1;
		}
	}
	return cnt % 7;
}
int main()
{
	//int x = 4; //假设第一天星期四
	int days[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
	int year = 2004;
	int mon = 1;
	if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
	{
		days[2] = 29;
	}
	else
	{
		days[2] = 28;
	}
	/*int day = 1;
	for (int j = 0; day <= days[mon]; ++j)
	{
		if (j < x)
		{
			printf("   ");
		}
		else
		{
			printf("%3d", day);
			++day;
		}
		if (j % 7 == 6)
		{
			printf("\n");
		}
	}*/

	
	for (int mon = 1; mon <= 6; ++mon)
	{
		printf(" %2d ", mon);
		printf("SUN MON TUE WED THU FRI SAT");
		printf(" %2d ", mon +6);
		printf("SUN MON TUE WED THU FRI SAT\n");
		int day1 = 1;
		int x1 = whatday(year, mon, 1);
		int day2 = 1;
		int x2 = whatday(year, mon + 6, 1);
		for (int j = 0,k = 0; day1 <= days[mon] || day2 <= days[mon+6];)
		{
			while (1)
			{
				if (j % 7 == 0)
				{
					printf("   ");
				}
				if (j < x1 || day1 > days[mon])
				{
					printf("    ");
					++j;
				}
				else
				{
					printf("%4d", day1);
					++day1;
					++j;
				}
				if (j % 7 == 0)
				{
					break;
				}
			}
			

			while(1)
			{
				if (k % 7 == 0)
				{
					printf("   ");
				}
				if (k < x2 || day2 > days[mon+6])
				{
					printf("    ");
					++k;
				}
				else
				{
					printf("%4d", day2);
					++day2;
					++k;
				}
				
				if (k % 7 == 0)
				{
					printf("\n");
					break;
				}
			}
		}
	}
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值