前言
这是博主在培训班培训时手敲的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 .....
- 计算前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;
}
--------------------------------------------------------
法三:
异或运算实现两个数的交换 - 小时候挺菜 - 博客园 (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的值。
错题总结
空串在计算机内部表示为没有任何数据,空格也表示一个字符。不能通过关系运算符来直接比较字符串,因为关系运算符比较的是字符串的内存地址而不是字符串内容。