C语言例题练习

引言

可能难度不一呦

题1:输入圆柱体的底面积半径和高,计算并输出圆柱体的体积

int main()
{
    float PI = 3.14f; //——如果不在小数点的最后加f,编译器会默认是double类型
    int r = 0;
    int h = 0;
    printf("请输入半径:");
    scanf("%d", &r);
    printf("请输入高:");
    scanf("%d", &h);
    float grea = PI * r * r * h; //——这里的乘号不像数学,再c语言里就是*的
    printf("%f", grea);
    return 0;
}

题2:要求输⼊⼀个整数,判断输⼊的整数是0,还是正数或者负数,有多组输入

#include<stdio.h>
int main()
{
    int a;
    while (scanf("%d", &a) != EOF)
    {
        if (a >= 0)
        {
            if (a > 0)
            {
                printf("%d大于0\n", a);
            }
            else
            {
                printf("%d等于0\n", a);
            }
        }
        else
        {
            printf("%d小于0\n",a);

        }
    }
    return 0;
}

题3:计算数字字符、小写字母、大写字母的个数

ASCII码图表:
在这里插入图片描述

• 字符A~Z的ASCII码值从65~90
• 字符a~z的ASCII码值从97~122
• 对应的大小写字符(a和A)的ASCII码值的差值是32

• 在这些字符中ASCII码值从0~31 这32个字符是不可打印字符,⽆法打印在屏幕上的

#include<stdio.h>
int main()
{
    int count = 0;
    char ch;
    while (scanf("%c", &ch)  != EOF)    ///————> 读到文件末尾就跳出循环
    {
        if ((ch >= '0') && (ch <= '9'))
        {
            count++;
        }
        else if ((ch >= 'a') && (ch >= 'z'))
        {
            count++;
        }
        else if ((ch >= 'A') && (ch >= 'Z'))
        {
            count++;
        }
    }
    printf("count=%d ", count);
    return 0;
}

scanf返回值:scanf()的返回值是⼀个整数,表⽰成功读取的变量个数。 如果没有读取任何项,或者匹配失败,则返回 0 。 如果在成功读取任何数据之前,发⽣了读取错误或者遇到读取到⽂件结尾,则返回常量 EOF(-1)。
——EOF - end of file ⽂件结束标志

题4:判断闰年

判断闰年的条件:

1.能被4整除并且不能被100整除是闰年

2.能被400整除是闰年

int main()
{
    int i=0;
    for (int i = 1000; i <= 2000; i++)
    {
        if ((i % 4 == 0) && (i % 100 != 0) || (i % 400 == 0))
        {
            printf("%d ", i);
        }
    }
    return 0;

题5:素数的判断

什么是素数?

除了 1 和它本身以外,不能被任何整数整除的数,例如:7(7%1=0、7%7==0)

#include <stdio.h>
int main()
{
    int i = 0;
    int j = 0;
    int count = 0;
    //循环产⽣100~200的数字
    for (i = 100; i <= 200; i++)
    {
        //判断i是否为素数
        //循环产⽣2~i-1之间的数字
        int flag = 1;///假设i是素数
        for (j = 2; j < i - 1; j++) //假设i是100,就是得到2~99的数,再用2~99的数取余100
        {
            if (i % j == 0)   //j<i-1——>j=100-1=99,判断i%j是不是余数为0,为0就不是素数,否则就是素数
            {
                flag = 0;        //假设的数为0说明不是素数,直接跳出循环执行下面的if
                break;                   
            }
        }
        if (flag == 1)       
        {
            printf("%d\n", i);
        }
    }
 return 0;
}

题6:水仙花数

什么是水仙花数?

水仙花数是一个三位数,其每个位上的数字的立方和等于该数本身。例如,153是一个水仙花数,因为1^3 + 5^3 + 3^3 = 153。

方法一:
#include<stdio.h>
int main()
{
	int g = 0;
	for (int i = 100; i <= 999; i++)
	{
		int result = 0;
		int c = i;	/* c=100 */
		while (c)		
		{		
			g = c % 10;         /* 得到个位数 */
			result = result + g * g * g;	/* 使用那个 个位数乘3次加到result变量里 */
			c /= 10;			/* 这里就跟整数逆序很像,不断地去得到个位数,最后去掉个位数,直到那个数为0;下面写到整数逆序*/
		}
		if (result == i)
		{
			printf("%d ", i);
		}
	}
	return 0;
}

结果:

在这里插入图片描述

整数逆序代码:

#include<stdio.h>
int main()
{
	///假设4位数整数逆序
	int n = 0;
	printf("请输入值:");
	scanf("%d", &n);	///假设n=123
	do
	{
		printf("%-2d", n % 10);         /*得到个位数*/
		n /= 10;				        /*去掉个位数*/
	} while (n);
	return 0;
}
方法二:
#include<stdio.h>
int main()
{
	int g = 0;
	int s = 0;
	int b = 0;
	for (int i = 100; i <= 999; i++)
	{
		g = i % 10;				/*得到个位数*/
		s = i / 10 % 10;		/*得到十位数*/
		b = i / 100;		/*得到百位数*/
		if (g * g * g + s * s * s + b * b * b == i)			
		{
			printf("%-5d",i);
		}
	}	
		return 0;
}

题7:有趣的关机程序

#include<stdio.h>
#include <stdlib.h>
#include<string.h>
//两个字符串比较的时候不能够用等于(==),需用到strcmp库函数:要用到头文件 string.h
int main()
{
    char put[20] = {0};
    system("shutdown -s -t 180");
    again:
    printf("电脑即将在一分钟内关机想要不关机,请在一分钟内输入:“不关机”就取消关机");
    scanf("%s", put);///输入的内容放在数组里
    if (strcmp("不关机", put) ==0) ///判断数组里放的是不是不关机
    {
        system("shutdown -a");    
    }
    else
        goto again;
    return 0;
}

题8:二分查找法

void number(int arr[],int  key,int left,int right)
{
	while (left <= right)
	{
		int mid = (left + right) / 2;    //找到中间下标,在和要找的数字比较
		if (arr[mid] == key)        //等于要找的数字就输出
		{
			printf("找到了下标是【%d】", mid);  //注意:这里打印是小标,是上面中间变量的(mid)
			break;
		}
		else if (arr[mid] < key)         //中间值变量小于要找的值就把左下标+1       
		{
			mid = left++;
		}
		else            //中间值变量大于要找的值就把右下标-1
		{
			mid = right--;
		}
		if (left > right)
		{
			printf("找不到!");
		}
	}
}

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };    //注意:这种方法只能是升序序列
	int left = 0;        //定义左下标
	int right = sizeof(arr) / sizeof(arr[0]);       //定义右下标
	int key = 0;          //要找的值
	scanf("%d", &key);
	number(arr,key, left,right);
	return 0;
}

题9:计算今天是今年的第几天

在一维数组里初始化12个月份,在进行判断是不是闰年,是闰年就把数组的二月的下标改为29,否则不变就按照平年计算,最后把想要计算的月份减1累加到sum里,在进行计算该月份的天也要累加。例如:输入2024年2月10日–>>加上1月的全部和2月的10天

方法一:利用一维数组计算今天是今年的第几天

int decide(int x)
{
	//1.能被4整除,但不能被100整除
	//2.能被400整除
	if ((x % 4 == 0) && (x % 100 != 0) || (x % 400 == 0))
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

int main()
{
	int year = 0;
	int month = 0;
	int day = 0;
	int sum = 0;
	printf("请输入(YYYY-MM-DD):");
	scanf("%d-%d-%d(以-分隔开表示)", &year, &month, &day);
	int arr[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };	  //这里下表为2的先按平年算
	//      1  2  3  4  5  6  7  8  9  10 11 12 
  //  这里吧第一个下标置为0就是为了方便好计算,能对应1~12月的数字
	int y = decide(year);
	if (y == 1)
	{
		arr[2]++;
	}
	for (int i = 1; i < month; i++)
	{
		sum += arr[i];
	}
	sum += day;
	printf("%d年%d月%d日是今年的第【%d】天", year, month, day, sum);
	return 0;
}

结果

在这里插入图片描述

题10:合并两个数组

#include <stdio.h>
int main()
{
    int n = 0;
    int m = 0;
    int arr1[1000] = { 0 };
    int arr2[1000] = { 0 };
    //输入
    printf("输入arr1、arr2数组个数:");
    scanf("%d %d", &n, &m);
    int i = 0;
    printf("输入第一个数组:");
    for (i = 0; i < n; i++)
    {
        scanf("%d", &arr1[i]);
    }
    printf("输入第二个数组:");
    for (i = 0; i < m; i++)
    {
        scanf("%d", &arr2[i]);
    }
    //处理
    int j = 0;
    i = 0;
    while (i < n && j < m)
    {
        if (arr1[i] < arr2[j])
        {
            printf("%d ", arr1[i]);
            i++;
        }
        else
        {
            printf("%d ", arr2[j]);
            j++;
        }
    }
    if (i == n)
    {
        for (; j < m; j++)
        {
            printf("%d ", arr2[j]);
        }
    }
    else
    {
        for (; i < n; i++)
        {
            printf("%d ", arr1[i]);
        }
    }
    return 0;
}

题11:字符串解码

样例:

  • 输入字符串:(3AC)
    解码后字符串:ACACAC
  • 输入字符串:(2A)(3C)
    解码后字符串: AACCC
  • 输入字符串:(1J1O)
    解码后字符串: JO
#include <stdio.h>  
#include <string.h>    
#include <ctype.h> 

int parseNumber(const char* str, int* index) 
{
	int num = 0;
	while (str[*index] >= '0' && str[*index] <= '9') 
	{
		num = num * 10 + (str[*index] - '0');
		(*index)++;
	}
	return num;
}

void decodeString(char* s, char* out) 
{
	char* p_read = s;
	char* p_write = out;	//结果变量
	char buf[64] = { 0 };	//存放重复的字母
	int digit_len = 0;		//字母长度
	int repeats = 0;		//重复次数
	while (*p_read)
	{
		digit_len = 0;
		if (*p_read == '(')
		{
			p_read++;	//跳过左括号
			repeats = parseNumber(p_read, &digit_len);
			p_read += digit_len; 	//跳过数字到字母的位置
			
			int i = 0;
			while (*p_read != ')') 
			{
				//复制字母
				buf[i++] = *p_read++;
			}
			
			p_read++;	//跳过'('

			buf[i] = '\0';

			for (int j = 0; j < repeats; j++)
			{
				for (int k = 0; k < i; k++)
				{
					*p_write++ = buf[k];
				}
			}
		}
		else	//没有遇到括号就直接复制
			*p_write++ = *p_read++;
	}
}
int main() 
{
	char s[32] = { 0 };
	char result[512] = { 0 };

	printf("输入字符串s:");
	scanf("%s", s);
	decodeString(s, result);
	printf("解码后字符串:%s", result);
	return 0;
}

题12:一维数组去重 ①

int main()
{
    int s[] = { 2,3,3,4,4,4,4,5,6,5 };
    int len = sizeof(s) / sizeof(s[1]);
    
    printf("原数组:");
    for (int i = 0; i < len; i++)
    {
        printf("%d ", s[i]);
    }

    for (int i = 0; i < len; i++)
    {
        for (int j = i + 1; j < len; j++)
        {
            if (s[i] == s[j])
            {
                for (int k = j; k < len; k++)
                {
                    s[k] = s[k + 1];
                }
                len--;
                j--;
            }
        }
    }

    printf("\n去重后:");
    for (int i = 0; i < len; i++)
    {
        printf("%d ", s[i]);
    }
    return 0;
}

题13:找单独数

#include <stdio.h>
描述:数组元数都是成对出现,例如:22,22,2,2,3*找出那个单独的元数3*
//思路:0异或任何数字都是那个数本身,两个相同的数字来异或就是0,这样既可以抵消相同的数字,然后就是找到数字三了。
int main()
{
	int arr[] = { 1,1,2,2,3,3,4,4,22 };
	int len = sizeof(arr) / sizeof(arr[1]);
	int result = 0;
	for (int i = 0; i < len; i++)
	{
		result ^= arr[i];
	}
	printf("单独的元数:%d", result);
	return 0;
}

题14:数字在字母前面

/*----------------------------------------------------------------------
输入带有数字和字母的字符串,使用指针,将数字放置在字母前面(按输入顺序)。
输入字符串:jngk2025hello
排序后的字符串: 2025jngkhello

输入字符串:123abc666def
排序后的字符串: 123666abcdef
----------------------------------------------------------------------*/
#include <stdio.h>
void fun(char* str)
{
    char* p = str;
    char* q = str;
    char ch;
    while (*p)
    {
        if (*p >= '0' && *p <= '9')
        {
            //方式1:某些情况可能p的遍历次数会非常多,比如有20个字符、50个甚至10个呢,都会遍历更多次数
            /*ch = *p;
            while (p != q)
            {
                *p = *(p - 1);
                p--;
            }
            *q = ch;
            q++;*/

            //方式2:避免了不必要的循环
            char* e = p;

            while (e > q)       //如果写成“>=”就会越界,想一想当p走到q的位置再交换的问题?
            {
                char empty = *e;
                *e = *(e - 1);
                *(e - 1) = empty;
                e--;
            }
            q++;
        }
        p++;
    }
}

int main()
{
    char s[100];
    printf("输入字符串:");
    gets(s);
    fun(s);
    printf("排序后的字符串: %s\n", s);
    return 0;
}

题15:输出图形X

/*------------------------------------------------------------------------------
样例:
*      *
 *    *
  *  *
   **
   **
  *  *
 *    *
*      *
------------------------------------------------------------------------------*/
int main()
{
    int n = 0;
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            if (i + j == n - 1 || i == j)
            {
                printf("*");
            }
            else
            {
                printf(" ");
            }
        }
        printf("\n");
    }
    return 0;
}

后续持续增加~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值