C语言练习题

前言

这是博主在培训班培训时手敲的c语言基础练习题。全部都由博主个人手敲,没有参照网上任何参考资料,有一两个练习题当时确实没有思路借鉴了同班同学的想法后,自己再在编译器上手敲的,我认为编程就是多敲多练,没有捷径,虽然这些练习题网上资源很多,但都不是你的思想,同理我敲的这些代码你们也不要过多的借鉴。我发这篇文章的主要目的就是为了记录。

编程题

水仙花数

打印所有的水仙花数,

水仙花数:一个三位数,百位立方+十位立方+个位立方 = 原数 例如:153就是水仙花数

#include <stdio.h>
int main(int argc, char const *argv[])
{
    // 打印所有的水仙花数,
    // 水仙花数:一个三位数,百位立方+十位立方+个位立方 = 原数  例如:153就是水仙花数
    int NarcissisticNumber, hundred, tens, single, num; //Narcissistic number 水仙花数
    for (num = 100; num <= 999; num++)
    {
        hundred = num / 100;
        tens = num / 10 % 10;
        single = num % 10;
        NarcissisticNumber = hundred * hundred * hundred + tens * tens * tens + single * single * single;
        if (num == NarcissisticNumber) printf("%d\n",NarcissisticNumber);        
    }
    return 0;
}

输出1-20之间所有的偶数

#include <stdio.h>
int main(int argc, char const *argv[])
{
    // 输出1-20之间所有的偶数
    for(int num=1;num<=20;num++)
    {
        int EvenNum = num % 2;
        if(EvenNum == 0)
        {
            printf("%d ",num);
        }
    }
    return 0;
}

循环输出 26 个字母

#include <stdio.h>
int main(int argc, char const *argv[])
{
    //循环输出26个字母
    for(int i=97;i<=122;i++)
    {
        putchar(i-32);
        putchar(i);
        printf(" ");
    }
    printf("\n");
    return 0;
}

7行3列的星星

#include <stdio.h>
int main(int argc, char const *argv[])
{
    //7行3列星星
    for(int i = 1;i<=7;i++)
    {
        for(int j = 1;j<=3;j++)
        {
            printf("*");
        }
        printf("\n");
    }
    
    return 0;
}

打印n行n列的星星

#include <stdio.h>
int main(int argc, char const *argv[])
{
    // 打印n行n列的星星
    int n;
    scanf("%d", &n);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            printf("*");
        }
        printf("\n");
    }

        return 0;
}

打印三角形的星星

1.

& 第一行:1

&& 第二行:2

&&&第三行:3

&&&&

#include <stdio.h>
int main(int argc, char const *argv[])
{
    // 打印三角形的星星
    for(int i=1;i<=4;i++)
    {
        for(int j=1;j<=i;j++)
        {
            printf("*");
        }
        printf("\n");
    }
        return 0;
}

2.

&&&&

&&&

&&

&

#include <stdio.h>
int main(int argc, char const *argv[])
{
    // 打印三角形的星星
    for(int i=1;i<=4;i++)
    {
        for(int j=4;i<=j;j--)
        {
            printf("*");
        }
        printf("\n");
    }
        return 0;
}

 3.

#include <stdio.h>
int main(int argc, char const *argv[])
{
    // 打印三角形的星星
    for(int i=1;i<=5;i++)
    {
        for(int k = 1;k<i;k++)
        {
            printf(" ");
        }
        for(int j=5;i<=j;j--)
        {
            printf("*");
        }
        printf("\n");
    }
        return 0;
}

计算1-100的和

#include <stdio.h>
int main(int argc, char const *argv[])
{
    //计算1-100的和
    int sum=0,num=1;
    while (num<=100)
    {
        sum += num;
        num++;
    }
    printf("%d\n",sum);
        return 0;
}

从终端上输入一个字符并在终端上输出这个字符,当输入字符为‘q’时,程序结束。

#include <stdio.h>
int main(int argc, char const *argv[])
{
    //从终端上输入一个字符并在终端上输出
    while (1)
    {
        int ret = getchar();
        if (ret == 'q')
        {
            break;
        }
        putchar(ret);
    }

    return 0;
}

回文数

循环输入一个5位数,判断它是不是回文数。当输入0时循环结束。

即12321是回文数,个位与万位相同,十位与千位相同。

#include <stdio.h>
int main(int argc, char const *argv[])
{
    while (1)
    {
        int num, wan, single, tens, thousand;
        printf("请输入一个五位数:\n");
        scanf("%d", &num);
        wan = num / 10000;
        single = num % 10;
        tens = num / 10 % 10;
        thousand = num / 1000 % 10;
        if (num == 0)
        {
            break;
        }
        else if (wan == single && tens == thousand)
        {
            printf("%d是一个回文数\n",num);
        }
        else 
        {
            printf("%d不是一个回文数\n",num);
        }
    }
    return 0;
}

九九乘法表

#include <stdio.h>
int main(int argc, char const *argv[])
{
    for (int i = 1; i < 10; i++)
    {
        for (int j = 1; j <= i; j++)
        {
            int sum = i * j;
            printf("%d×%d=%2d ", j, i, sum);
        }
        printf("\n");
    }
    return 0;
}

数字炸弹游戏

#include <stdio.h>
int main(int argc, char const *argv[])
{
    printf("数字炸弹1-100\n");
    printf("输入666游戏结束\n");
    printf("请设置炸弹数字为:\n");
    int SetBombNum, BombNum, NewBombNum;
    scanf("%d", &SetBombNum);
    while (1)
    {
        if (SetBombNum == BombNum)
        {
            break;
        }
        else if (!(SetBombNum >= 1 && SetBombNum <= 100) && SetBombNum != 666)
        {
            printf("请重新输入:");
            scanf("%d", &SetBombNum);
            continue;
        }
        else if (BombNum == 666)
        {
            printf("游戏退出,炸弹是%d\n",SetBombNum);
            break;
        }
        
        else if (SetBombNum >= 1 && SetBombNum <= 100)
        {
            printf("游戏开始!\n");
            printf("目前范围1——%d **** 请输入你认为炸弹的数字:\n", 100);
            while (1)
            {
                scanf("%d", &BombNum);
                if (!(BombNum >= 1 && BombNum <= NewBombNum))
                {
                    printf("请重新输入:\n");
                    printf("目前范围1——%d **** 请输入你认为炸弹的数字:\n", NewBombNum);
                    continue;
                }
                else if (BombNum > SetBombNum && BombNum >= 1 && BombNum <= 100)
                {
                    printf("大了!\n");
                    NewBombNum = BombNum - 1;
                    printf("目前范围1——%d **** 请输入你认为炸弹的数字:\n", NewBombNum);
                    continue;
                }
                else if (BombNum < SetBombNum && BombNum >= 1 && BombNum <= 100)
                {
                    printf("小了!");
                    printf("目前范围%d——100 **** 请输入你以为炸弹的数字:\n", SetBombNum);
                    continue;
                }
                else if (BombNum == 666)
                {
                    break;
                }
                else if (BombNum == SetBombNum)
                {
                    printf("你输了!\n");
                    break;
                }
            }
        }
        else if (SetBombNum == 666)
        {
            printf("游戏退出\n");
            break;
        }
    }
    return 0;
}

打印100到200中能被三整除的数

#include <stdio.h>
int main(int argc, char const *argv[])
{
    for (int num = 100; num <= 200; num++)
    {
        int result = num % 3;
        if (result == 0)
        {
            printf("%d ", num);
        }
    }
    return 0;
}

2006年培养学员80000人,每年增长25%,请问按此增长速度,到哪一年学员人数将达到20万人?

#include<stdio.h>
int main(int argc, char const *argv[])
{
    int people;
    int i = 2006;
    for(people=80000;people<=200000;)
    {
        people = people*0.25+people;
        i++;
        printf("到%d年学员人数将达到%d万人\n",i,people);
    }
    return 0;
}

计算斐波那契数列前15项并逆序输出

1 1 2 3 5 8 13 21 .....

  1. 计算前15 ------for

循环体中逻辑代码 前两项的和等于第三项

     2.逆序输出

#include <stdio.h>
int main(int argc, char const *argv[])
{
    int a[15] = {1, 1};
    for (int i = 2; i < 15; i++)
    {
        a[i] = a[i - 1] + a[i - 2];
    }
    for (int i = 14; i >= 0; i--)
    {
        printf("%d ", a[i]);
    }
    return 0;
}

在终端输入大写字母、小写字母、空格、数字,分别在终端输出他们的个数

将一串字符串进行倒置char buf[32]=”hello”;//olleh

#include <stdio.h>
#include <string.h>
int main(int argc, char const *argv[])
{
    char buf[32] = {};
    scanf("%[^\n]",buf);
    int j= strlen(buf)-1;
    for (int i = 0; i<strlen(buf) / 2;i++)
    {
        int tem = buf[i];
        buf[i] = buf[j];
        buf[j] = tem;
        j--;
    }
    printf("%s",buf);
    return 0;
}

有一个3x4的矩阵(元素值不相同),要求输出其中最大值以及它的行号和列号

#include<stdio.h>
int main(int argc, char const *argv[])
{
    int max = 0;
    int line,col;
    int arr[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
    for (int i = 0;i < 3;i++)
    {
        for (int j = 0;j < 4;j++)
        {
            if ( max<arr[i][j])
            {
                max = arr[i][j];
                line=i+1;
                col=j+1;
            }
        }
    }
    printf("最大值: %d  行号:%d  列号:%d",max,line,col);
    return 0;
}

编写一个程序,找出1000以内所有的完数,所谓完数就是一个数恰好等于它的因子之和

例如6=1+2+3,6就是一个完数。28也是 28=1+2+4+7+14

#include <stdio.h>
int main(int argc, char const *argv[])
{

    for (int i = 2; i <= 1000; i++)
    {
        int num = 0;
        for (int j = 1 ; j<=i-1; j++)
        {
            if (i % j == 0)
            {
                num += j;
            }
        }
        if (num == i)
        {
            printf("%d\n", i);
        }
    }
}

循环输入一个5位数,判断它是不是回文数(指针完成)

#include <stdio.h>
#include <string.h>
int main(int argc, char const *argv[])
{
    char arr[5] = {};
    char *p = arr;
    while (1)
    {
        printf("请输入一个回文数:");
        scanf("%s", arr);
        char *q =arr + strlen(arr) - 1;
        if (*p == '0')
        {
            break;
        }
        else if (*q == *p && *(p + 1) == *(q - 1))
        {
            printf("%s是一个回文数\n", arr);
        }
        else
        {
            printf("%s不是一个回文数\n", arr);
        }
    }
    return 0;
}

将字符串转换成整型数字输出。用指针实现

要求:字符串为0-9组成,输出数据为一个整形数

Eg:char s[10]="123”; printf(“%d\n”,num); //num=123;

这是学完指针时老师出的题,感觉自己写的很烂,没有下面用函数写的好
#include <stdio.h>
#include <string.h>
int main(int argc, char const *argv[])
{
    char str[10] = "123456789";
    char *p = str;
    for (int i = 0; i < strlen(str); i++)
    {
        int num = *p - 48;
        p++;
        printf("%d", num);
    }
    printf("\n"); 
    return 0;
}

将字符串转换成整型数字输出。用函数实现

#include <stdio.h>
#include <string.h>
int fun(char *s)
{
    int num = 0;
    while (*s)
    {
        num = num*10 + *s - 48;
        s++;
    }
    return num;
}
int main(int argc, char const *argv[])
{
    char str[5] = "1234";
    fun(str);
    printf("%d\n", fun(str)); 
    return 0;
}

输入一个字符串获取字符串中a字符首次出现下标(指针做)

#include<stdio.h>
#include<string.h>
int main(int argc, char const *argv[])
{
    char str[32]={};
    char *p=str;
    scanf("%[^\n]",p);
    for (int i = 0; i < strlen(str); i++)
    {
        if (p[i] == 'a')
        {
            printf("a字符首次出现的下标%d\n",i);
             break;
        }
    }
    return 0;
}

字符串倒置(用指针实现)

#include <stdio.h>
#include <string.h>
int main(int argc, char const *argv[])
{
    char buf[32] = {};
    scanf("%[^\n]", buf);
    char *p=buf+strlen(buf)-1;
    for (int i = 0; i < strlen(buf); i++)
    {
        printf("%c", *p);
        p--;
    }
    printf("\n");
    return 0;
}

已知字符数组a[10]和b[10]中元素的值递增有序,用指针实现将两个数组中元素按照递增顺序输出

如:char a[10]=”acdgjmno” ; char b[10]=”befhil”;->”abcdefghijlmno”

#include<stdio.h>
#include<string.h>
int main(int argc, char const *argv[])
{
    char a[10]="acdgjmno";
    char b[10]="befhil";
    char *p=a;
    char *q=b;
    while ( *p && *q)
    {
        if (*p < *q)
        {
            printf("%c",*p++);
        }
        else if (*p > *q)
        {
            printf("%c", *q++);
        }
    }
    if (*p)
    {
        printf("%s]n",p);
    }
    else if (*q)
    {
        printf("%s\n",q);
    }   
    return 0;
}

计算字符串某个字符首次出现的位置

编写一个函数 返回字符串中某个字符的个数

实现strlen

#include<stdio.h>
int strlen_(char *p)
  {
    int i = 0;
    while(*p != '\0')
    {
      p++;
      i++;
    }
    return i;
  }
int main() {
  char str[15]="hello world";
  char *p = str;
  int ret = strlen_(p);
  printf("%d\n",ret);
  return 0;
}

实现strcpy

法一:
#include <stdio.h>
#include <string.h>
char *strcpy_(char *d, const char *s)
{
    char *p = d;
    while (*d=*s) //因为strcpy可以复制'\0',当*s把'\0'复制给*p时,因为'\0'是结束字符串的,所以执行*d=*s后就会跳出循环
    {
        d++;
        s++;
    }
    return p;
}
int main(int argc, char const *argv[])
{
    char d[32] = "ab";
    char s[32] = "hello";
    strcpy_(d, s);
    printf("%s",d);
    return 0;
}
法二:
#include <stdio.h>
#include <string.h>
char *strcpy_(char *d, const char *s)
{
    char *p = d;
    while (*s != '\0')
    {
        *d = *s;
        d++;
        s++;
    }
    *d = '\0';
    return p;
}
int main(int argc, char const *argv[])
{
    char d[32] = "ab";
    char s[32] = "hello";
    strcpy_(d, s);
    printf("%s", d);
    return 0;
}

实现strcat


#include <stdio.h>
char *fun(char *d, char *s)
{
    while (*d)
    {
        d++;
    }
    while (*s)
    {
        *d = *s;
        d++;
        s++;
    }
    return d;
}
int main(int argc, char const *argv[])
{
    char strdest[32] = "abc";
    char strsrc[32] = "hello";
    fun(strdest, strsrc);
    printf("%s", strdest);
    return 0;
}

C语言结课考试大题错题

写一个函数,统计一个int类型的值中有多少为1(例:5有2位为1)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int fun(int num)
{
    int i = 0;
    while (1)
    {
        int res = num % 2;
        if (res == 1)
        {
            i++;
        }
        else if (num / 2 == 0)
        {
            break;
        }
        num = num / 2;
    }
    return i;
}
int main(int argc, char const *argv[])
{
    int num;
    scanf("%d", &num);
    int ret = fun(num);
    printf("%d的值中有%d位为1\n", num,ret);
    return 0;
}

编写函数实现strcat函数功能
(不调用C的字符串库函数,编写函数 strcat

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char *strcat_(char *d, char *s)
{
    char *p = d;
    while (*d)
    {
        d++;
    }
    while (*s)
    {
        *d = *s;
        d++;
        s++;
    }
    return p;
}
int main(int argc, char const *argv[])
{
    char str1[32] = "abc";
    char str2[32] = "hello";
    char *d = str1;
    char *s = str2;
    strcat_(d, s);
    printf("%s", d);
    return 0;
}

(1)封装函数实现如下功能:

输入任意两个数,返回两数之间(包括这两个数)偶数之和

#include <stdio.h>
int fun(int a, int b)
{
    int sum = 0;
    while (a <= b)
    {
        if (a % 2 == 0)
        {
            sum += a;
    
        }
        a++;
    }
    return sum;
}
    int main(int argc, char const *argv[])
    {
        int a, b;
        printf("请输入两个数:\n");
        scanf("%d%d[^\n]", &a, &b);
        int ret = fun(a, b);
        printf("%d和%d之间偶数之和为%d\n", a, b, ret);
        return 0;
    }

(2)封装函数实现字符串的倒置。

比如:输入hello,倒置后字符串为olleh

第一个是我的方法:感觉很垃圾,没有下面两种方法好,下面两种是老师讲的以及班里大佬们用的方法
#include <stdio.h>
#include <string.h>
char *fun(char buf[])
{
    char *p = buf + strlen(buf) - 1;
    for (int i = 0; i < strlen(p); i++)
    {
        printf("%c", *p);
        p--;
    }
    return p;
}
int main(int argc, char const *argv[])
{
    char buf[32] = {};
    scanf("%[^\n]", buf);
    fun(buf);
    return 0;
}
--------------------------------------------------------
法二:
#include <stdio.h>
#include <string.h>
char *fun(char *p)
{
    int len = strlen(p);
    char *q = &p[len-1];
    while (p < q)
    {
        int tem = *p;
        *p = *q;
        *q = tem;
        p++;
        q--;
    }
    return p;
}
int main(int argc, char const *argv[])
{
    char str[32]={};
    gets(str);
    fun(str);
    puts(str);
    return 0;
}
--------------------------------------------------------
法三:

异或与字符串反转_异或和反转-CSDN博客

异或运算实现两个数的交换 - 小时候挺菜 - 博客园 (cnblogs.com)

Shell脚本

判断当前路径下是否存在目录aa,如果不存在创建;遍历当前路径下的文件,如果是普通文件,将文件复制到aa目录下,并计算文件的个数。

#!/bin/bash
if test -d "aa"
then
    echo "存在aa"
else
    mkdir aa
fi
NUM=0
for file in * 或者 for file in 'ls'
do
    if test -f "$file"
    then
    cp "$file" aa/
    ((NUM++))
    fi
done
echo $NUM

选题题

这部分选择题是博主在考试和做作业时做错的题

错题总结

语法错误:没有花括号,可以在编译器里看到else处有红色波浪线,加上花括号之后红色波浪线消失。

 

错题总结
当把字符串首地址传给形参char *x时,x就指向了字符串的首地址,y也指向了字符串的首地址,执行while(*y++);当*y='\0'时为循环结束条件,此时会再执行y++。如果y++再花括号里就不会执行了,比如hello这个字符串,当y++在花括号里长度就输出4,因为*y=‘\0’循环就结束了,不会再执行y++了。

 

错题总结

首先n=0,执行printf(“%d,”, f(++n))时,内存会开辟一个新的空间,实参++n为1之后传入形参int m中,在函数空间里m=1,程序在 f函数语句继续执行到static int n = 0;静态变量n为0,它不会随着函数的销毁而销毁,执行n+=m,n为1.执行到return n,n的值就返回到f(++n)了打印出来就是1.此时函数已经f销毁了。因为主函数还没有结束还没销毁,所以++n时n就已经为1了,当程序回到main主函数再执行printf(“%d\n”, f(n++))时,因为是后++,实参先传入1到形参int m中,再加1主函数的n就变为2了。同理n+=m就是n=n+m=1+1=2,return n返回到f(n++)所以值就为2,它的这个2是子函数f里n的值,不是主函数n的值。

错题总结
空串在计算机内部表示为没有任何数据,空格也表示一个字符。不能通过关系运算符来直接比较字符串,因为关系运算符比较的是字符串的内存地址而不是字符串内容。 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-Turbo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值