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;
}
}
}
}
}