C语言基础练习题总结(嵌入式基础学习2)

阅读: 评论:0

C语言基础练习题总结(嵌入式基础学习2)

C语言基础练习题总结(嵌入式基础学习2)

(本篇是基于嵌入式基础学习1中笔记进行的实战练习,代码存在疑问,还望大家多多指正)


作业1:

1、把456转换成8进制
456是十进制:十进制转换为8进制,需先转换成2进制
​
456转2进制:456=256+125+64+8=2^8+2^7+2^6+2^3
​=111001000
​
转换为8进制:111=7     001=1    000=0  (三者为一组)
结果为0710
2、把0456转换成16进制
0456为8进制,则要转换为16进制,需先转换为2进制
​
0456转2进制:(因2进制转换为8进制为三个为一组)
​0456=100  101110
​
转换为16进制:(从右到左,四个为一组)
​结果0x12e
3、把0x456转换成8进制
0X456为十六进制,则要转换为8进制,需要先转换为2进制
0X456转换为2进制:0100 0101 0110
2进制转换为8进制:(三个为一组)结果为:0212
4、char a = 456,输出结果是printf("%d",a)?
//注意关键字:char 字符型 有1个字节,占8位,
456为十进制,转换为二进制:456=256+125+64+8=2^8+2^7+2^6+2^3=111001000(这是补码)
补码-1=反码:  111000111
反码取反=原码:  100111000     //第一位1位符号位,不进行改变转换为十进制:=-56

作业2:

1、int a = 1, b = 2, c = 0, d;d = a++ || c++ && ++b;a、b、c、d分别是?
a=2 ;b=2; c=0 ;d=1
2、char a = -1, c; c = a >> 1;printf("%d %dn", a, c);输出结果是?
//数据在类型中进行存储时,一定要按二进制形式进行存储,负数是按照补码进行存储的
​
-1: 10000001(补码)11111110(反码)11111111(原码=反码+1)
右移:  11(这里缺位,看前面符号位,如果为-1,即补1,如果为0,即为0)111111  
a=-1;c=-1
3、int a = 0x20a1;将a的第4到7位清0,写出表达式
a=a& (~(0xf<<4));
a& (~(00000000000000000000000011110000  ))
a& (11111111111111111111111100001111)
4、short a = 32767; a++; printf("%dn", a);输出结果是?
-32768        
//2^15 - 1,有符号short类型最大的正数,最大正数加1,符号位变为1,其他变为0=最小负数再减一:-32767-1=-32768
5、编写程序实现如下功能:pleaes input Y|N:输入'Y'打印字符"OK",输入'N'打印字符"NO".
char a;
printf("please input Y|N:n");
a=getchar();
if(a=='Y')
puts("ok");
if(a=='N')
puts("NO");
6.有如下程序
 int main(){char a = 1;while(a++);}该程序是不是死循环?不是
7.int i = 10;printf("%d %d %d %dn", i, ++i, i++,++i);输出结果是?
从右向左计算!!!13 13 11 13

作业3:(C基础)

1.编写程序实现输入一个年份,判断是否是闰年.能被4整除,但不能被100整除的年份;能被100整除,又能被400整除的年份;
#include <stdio.h>
​
int main(int argc, char*argv[])
{ int y;printf("please input year: ");scanf("%d", &y);
​if(y%4==0&&y%100!=0){puts("闰年");}elseif(y%100==0&&y%400==0){puts("闰年");}else{puts("不是闰年");}return 0;
} 
2、打印100以内的偶数.
#include <stdio.h>
​
int main(int argc, char*argv[])
{ for(inti=0; i<=100; i++){if(i%2==0)printf("%d ", i);}puts("");return 0;
} 
3、打印所有的水仙花数。

一个三位数,它的个位十位百位的立方和等于它本身

#include <stdio.h>
​
int main(int argc, char*argv[])
{ int a, b, c;for(int i=100; i<1000; i++){a=i/100;b=i/10%10;c=i%10;if(i==a*a*a+b*b*b+c*c*c){printf("%d ", i);}}puts("");
​int i=100;while(i<1000){a=i/100;b=i/10%10;c=i%10;if(i==a*a*a+b*b*b+c*c*c){printf("%d ", i);}i++; }puts("");return 0;
} 
4、打印99乘法表。
#include <stdio.h>
​
int main(int argc, char*argv[])
{ for(int i=1; i<10; i++){for(int j=1; j<=i; j++){printf("%d * %d = %-3d", i, j, i*j);}puts("");}
​return 0;
} 
5、打印如下图形

*

***

*****

********

**********

#include <stdio.h>
​
int main(int argc, char*argv[])
{ int N, i, j, z;printf("please input num: ");scanf("%d", &N);
​for(i=1; i<=N; i++){for(z=1; z<=N-i; z++)printf(" ");for(j=1; j<=2*i-1; j++)printf("*");puts("");} 
​return 0;
} 
6、 打印100以内所有的质数.
#include <stdio.h>
​
int main(int argc, char*argv[])
{ int j;for(int i=2; i<1001; i++){for(j=2; j<i; j++){if(i%j==0)break;}if(j==i){printf("%d ", i);}}puts("");return 0;
} 
7、用while循环实现第2、3题
第2题:
#include <stdio.h>int main(int argc, char*argv[])
{int a;while(a<=100){if(a%2==0);printf("%-3d",a);a++;continue;}puts("");return 0;
}
第3题:
#include <stdio.h>
​
int main(int argc, char*argv[])
{ int a, b, c;int i=100;while(i<1000){a=i/100;b=i/10%10;c=i%10;if(i==a*a*a+b*b*b+c*c*c){printf("%d ", i);}i++; }puts("");return 0;
}
8、不使用for和while实现求1-100的累加求和.(goto)
#include <stdio.h>
​
int main(int argc, char*argv[])
{ int i=1, sum=0;
loop:sum+=i;i++;if(i<=100)gotoloop;printf("sum = %dn", sum);return 0;
} 
9、有如下程序:
int a=0;
for(int n=0; n<4; n+=2){switch(n){case0:a+=3;case1:a*=2;break;case2:a-=3; //第二次,当n=2时,上次循环a=6,需带到这一个循环中case3:a+=2;default:a=0;}   printf("%dn", a);
}输出结果是?       60

作业4:(数组)

1、编写程序计算一个数组中所有元素的和.(遍历数组)
#include <stdio.h>
​
int main(int argc, char*argv[])
{ int n;printf("please input num: ");scanf("%d", &n);int a[n];for(int i=0; i<n; i++) //{printf("please input arr[%d]: ", i);scanf("%d", &a[i]);}
​int sum=0; //避免有新元素干扰,进行初始化,如果是乘法,初始化应该为1for(int i=0; i<n; i++) //遍历数组{sum+=a[i];  //元素求和公式}
​printf("%dn", sum);return 0;
} 
2、编写程序找出数组中最大的元素,并且打印它的下标。
#include <stdio.h>
​
int main(int argc, char*argv[])
{//x记录最大元素的下标int a[5] = {11, -7, 9, 3, 10}, max=a[1], x=1; //如果max初始化为0时,不会引用新的数据,不严谨for(int i=0; i<5; i++)         //{if(max<a[i]){max=a[i];x=i;}}printf("max:%d  pos:%dn", max, x);return 0;
} 
3、编写程序,从键盘录入字符串,然后字母字符将大写转小写,小写转大写输出,其它字符原样输出.
#include <stdio.h>
​
int main(int argc, char*argv[])
{ char buf[20] = {0};   //定义一个字符数组puts("input string:");   //键盘输入gets(buf);
​for(int i=0; buf[i] !=''; i++)    //数组遍历,buf[i] != '' = buf[i] 表示任意地址字符只要不是斜杠0就能执行循环{if('A'<=buf[i] &&buf[i] <='Z'){  //进行判断,当在A-Z之间的字符,即转为小写,+32buf[i] +=32;}elseif('a'<=buf[i] &&buf[i] <='z'){  //当在a-z之间的字符时,转为大写,即-32buf[i] -=32;}}puts(buf);return 0;
} 
4、编写程序实现数组的循环移动,输入一个数m,当m > 0则数组向右循环移动m位,当m < 0则数组向左循环移动m位.
#include <stdio.h>
​
int main(int argc, char*argv[])
{ int a[5] = {1,2,3,4,5}, m, tmp;printf("please input move num: ");scanf("%d", &m);m%=5;     //取余是为了确保当m取值超过时,依旧保持在规定位数以内,确保不会超额if(m<0){m*=-1;  //m = -m;while(m--){//向左循环移动1位tmp=a[0];for(int i=0; i<4; i++)a[i] =a[i+1];a[4] =tmp;}}else{while(m--){//向右循环移动1位tmp=a[4];for(int i=4; i>0; i--)a[i] =a[i-1];a[0] =tmp;}}
​for(int i=0; i<5; i++){printf("%d ", a[i]);}puts("");return 0;
} 
5、将一个数字字符串转化成十进制整数如:"12345" -> 12345 或 "-123456" -> -123456
#include <stdio.h>
​
int main(int argc, char*argv[])
{ char buf[30] = {0};int num=0;printf("please input num: ");gets(buf);if(buf[0] =='-') //{for(int i=1; buf[i]; i++){if(buf[i] <'0'||buf[i] >'9'){    break;}num=buf[i]-'0'+num*10;}num*=-1;}else{for(int i=0; buf[i] !=''; i++){if(buf[i] <'0'||buf[i] >'9')break;num=buf[i]-'0'+num*10;}}printf("%dn", num);return 0;
} 
6、删除指定字符串中的空格,如"hello world"删除后变为"helloworld"
#include <stdio.h>
​
int main(int argc, char*argv[])
{ char buf[20] = {0};puts("input string: ");gets(buf);
​int i=0, j;while(buf[i]) //while(buf[i]!=''){if(' '==buf[i])   //删除指定字符,将空格改成字符即可{j=i;  //记录空格的下标//依次左移while(buf[j]) //循环j的位置{buf[j] =buf[j+1];j++;}i--; //空格未删完,跳过了当下空格,故i--}i++;  //不然会在原地走}puts(buf);
​return 0;
} 

作业5:(字符)

1、编写程序实现strlen的功能.
#include <stdio.h>
​
int main(int argc, char*argv[])
{ char str[100];   //定义字符数组printf("input string: ");gets(str);  //键盘输入int n=0;   int i=0;/*for(i; str[i]; i++){n++;}*/
​while(str[i])  //str[i] != ''{i++;n++;}
​printf("input string len: %dn", n);return 0;
} 
2、编写程序实现strcat的功能.//拼接
#include <stdio.h>
​
int main(int argc, char*argv[])
{ char str[100], dst[100];printf("input str sting: ");gets(str);printf("input dst sting: ");gets(dst);
​int i=0, j=0;while(str[i++]);i--;/*while(dst[j]){str[i++] = dst[j++]; //str[i] = dst[j]; i++, j++;}str[i] = 0;*/while(str[i++] =dst[j++]);
​puts(str);return 0;
} 
3、编写程序实现strcmp的功能.//比较
#include <stdio.h>
​
int main(int argc, char*argv[])
{ char str[100],dst[100];printf("input str string: ");gets(str);printf("input dst string: ");gets(dst);int cmp=0, i;for(i=0; str[i]; i++){/*if(0 == str[i]-dst[i])continue;elsebreak;*/if(0!=str[i] -dst[i]) //str[i] != dst[i]break;}cmp=str[i] -dst[i];printf("cmp: %dn", cmp);return 0;
} 
4、编写程序实现strncat的功能.

scanf用于数值

gets用于字符

#include <stdio.h>
​
int main(int argc, char*argv[])
{ char str[100], dst[100];printf("input str sting: ");gets(str);printf("input dst sting: ");gets(dst);int n;printf("input copy num: ");scanf("%d", &n);int i=0, j=0;while(str[i++]);i--;for(j; dst[j] &&j<n; j++,i++)str[i] =dst[j];str[i] ='';puts(str);return 0;
} 
5、编写程序实现字符串的循环移位
#include <stdio.h>
#include <string.h>
​
int main(int argc, char*argv[])
{ char str[100];puts("input string: ");gets(str);int m;puts("input move num:");scanf("%d", &m);int n=strlen(str);char ch;while(m--){ch=str[n-1];for(int i=n-1; i>0; i--)str[i] =str[i-1];str[0] =ch;}puts(str);return 0;
} 
6、编写程序实现删除字符串中指定的字符.
#include <stdio.h>
​
int main(int argc, char*argv[])
{ char str[100], ch;printf("input string: ");gets(str);printf("input delete char: ");scanf("%c", &ch);int i, j;
​for(i=0; str[i]; i++){if(ch==str[i]){j=i;while(str[j]){str[j] =str[j+1];j++;}i--;}}
​puts(str);return 0;
} 
7、编写程序实现将整型数据转换成字符串的功能 1234 -> "1234"
num%10+'0'  :取个位num/=10;    
for(intj=0;j<i/2;j++)
代码如下:
#include <stdio.h>
​
int main(int argc, char*argv[])
{ int num, i;char str[100] = {0};printf("input num: ");scanf("%d", &num);for(i=0; num;i++){str[i] =num%10+'0';num/=10;  // num = num / 10;}
​for(int j=0; j<i/2; j++){str[j] ^=str[i-j-1];str[i-j-1] ^=str[j];str[j] ^=str[i-j-1];} puts(str);return 0;
} 
8、删除目标字符串中指定的字符串 如"abcdefg" 删除"cde" -> "abfg"
#include <stdio.h>
​
int main(int argc, char*argv[])
{ char str[100],dst[20];printf("input str string: ");gets(str);printf("input dst string: ");gets(dst);
​int i=0, j, k, n, m;while(str[i]){if(str[i] ==dst[0]){j=i+1;k=1;while(dst[k]){if(str[j++] !=dst[k])break;k++;}if(dst[k] ==''){n=k;m=i;while(k--){str[m] =str[m+n];m++;}i--;}}i++;}puts(str);return 0;
} 
9、删除字符串中所有重复的字符如:"abacdbec" -> "abcde"
#include <stdio.h>
​
int main(int argc, char*argv[])
{ char str[100], ch;puts("input string:");gets(str);int i=0, j, k;while(str[i]){ch=str[i];j=i+1;while(str[j]){if(ch==str[j]){k=j;while(str[k]){str[k] =str[k+1];k++;}j--;}j++;}i++;}puts(str);return 0;
} 
10、从键盘输入若干个整数,其值在0-4范围内,输入-1表示结束输入,统计各个数字的个数
#include <stdio.h>
​
int main(int argc, char*argv[])
{ int num, count[5] = {0};while(1){printf("please input 0-4: ");scanf("%d", &num);if(-1==num)break;count[num]++;}
​for(int i=0; i<5; i++)printf("%d input num = %dn", i, count[i]);return 0;
} 
11、输入一行字符,统计大写字母、小写字母、数字、空格以及其它字符个数。
#include <stdio.h>
​
int main(int argc, char*argv[])
{ char str[100];int num[5] = {0};puts("input string: ");gets(str);
​for(int i=0; str[i]; i++){if(str[i] >='A'&&str[i] <='Z'){num[0]++;}elseif(str[i] >='a'&&str[i] <='z'){num[1]++;}}return 0;
} 

作业6:(二维数组)

1、计算二维数组所有元素的和
#include <stdio.h>int main(int argc,char*argv[])
{int n,m;printf("input n:"); scannf("%d",&n);    //键盘输入数组行printf("input m:"); scanf("%d",&m);//键盘输入数组列inta[i][j];for(int i=0;i<n;i++){for(int j=0;j<m;j++){printf("please input a[%d][%d}: ",i,j);scanf("%d",&a[i][j];}}int num=0;for(int i=0;i<n;i++){for(int j=0;j<m;j++){num+=a[i][j];}}printf("%dn",num);return 0;
}       
2、把一个二维数组每一行都按从大到小排列.
#include <stdio.h>int main(int argc, char*argv[])
{int n,m;printf("input n:");scannf("%d",&n);printf("input m:");scanf("%d",&m);int a[i][j];for(int i=0;i<n;i++){for(int j=0;j<m;j++){printf("please input a[%d][%d}: ",i,j);scanf("%d",&a[i][j];}}for(int i=0;i<n;i++){for(int j=0;j<m;j++){for(int j=o; j<m-1;j++){if(a[i][j] <a[i][j+1]){a[i][j] ^=a[i][j+2];a[i][j+1] ^=a[i][j];a[i][j] ^=a[i][j+1];}}}}for(int i=0;i<n;i++){for(int j=0;j<m;j++){printf("%d",a[i][j]);}puts("");}return 0;
}
3、删除二维字符数组中指定的字符.
#include <stdio.h>int main(int argc, char*argv[])
{int n;printf("input n:");scannf("%d",&n);char ch,a[n][1000];for(int i=0;i<n;i++){printf("please input a[%d][1000}: ",i);gets(a[i]);}printf("input delete char: ");scanf("%c",&ch);for(int i=0;i<n;i++){for(int j=0; a[i][j];j++){if(a[i][j] ==ch){k=j;while(a[i][j]){a[i][k] =a[i][k+1];k++;}j--;}}}for(int i=0;i<n;i++){printf("%s",a[i]);puts("");}return 0;
}

作业7:用指针实现如下题目:

1、编写程序实现strcmp的功能
#include <stdio.h>
​
int main(int argc, char*argv[])
{ int op=0;char str[100], dst[100];printf("input str sting: ");gets(str);printf("input dst sting: ");gets(dst);char*ps=str, *pd=dst;
​while(*ps){if(*ps!=*pd)break;ps++;pd++;}op=*ps-*pd;
​printf("op: %dn", op);
​return 0;
} 
2、编写程序实现strncat的功能.
#include <stdio.h>
​
int main(int argc, char*argv[])
{ int op=0;char str[100], dst[100];printf("input str sting: ");gets(str);printf("input dst sting: ");gets(dst);printf("input num: ");scanf("%d", &op);
​char*ps=str, *pd=dst;while(*ps++);ps--;
​while(op--){*ps++=*pd++;}
​*ps=0;puts(str);    
​return 0;
} 
3、编写程序实现字符串的循环移位
#include <stdio.h>
​
int main(int argc, char*argv[])
{ int op=0;char str[100];printf("input str sting: ");gets(str);printf("input num: ");scanf("%d", &op);
​char*ps=str, ch, *pt;while(*ps++);ps-=2;pt=ps;while(op--){ps=pt;ch=*ps;while(ps!=str){*ps=*(ps-1);ps--;}*ps=ch;}puts(str);    
​return 0;
}
4、编写程序实现删除字符串中指定的字符.
#include <stdio.h>int main(int argc, char*argv[])
{ char str[100], ch;printf("input str sting: ");gets(str);printf("input delete char: ");scanf("%c", &ch);
​char*ps=str, *q;while(*ps){if(ch==*ps){q=ps;while(*q){*q=*(q+1);q++;}ps--;}ps++;}puts(str);    return 0;
} 
5、编写程序实现将整型数据转换成字符串的功能 1234 -> "1234"
#include <stdio.h>
​
int main(int argc, char*argv[])
{ int num;char str[100] = {0}, *ps=str;puts("input num: ");scanf("%d", &num);while(num){*ps++=num%10+'0';num/=10;}*ps--=0;char*q=str;while(q<ps){*q^=*ps;*ps^=*q;*q^=*ps;q++, ps--;}puts(str);return 0;
} 
6、删除字符串中所有重复的字符如:"abacdbec" -> "abcde"
#include <stdio.h>
​
int main(int argc, char*argv[])
{ char str[100], *p=str, *q, *t;puts("input string: ");gets(str);
​while(*p){q=p+1;while(*q){if(*p==*q){t=q;while(*t){*t=*(t+1);t++;}q--;}q++;}p++;}
​puts(str);
​return 0;
} 

作业8:(字符指针、函数)

1、根据字符指针数组里每个字符串的长度进行排序.
#include <stdio.h>
#include <string.h>int main(int argc,char*argv[])
{char*s[3] = {"hello","welcome","world"}char*p=s[0];for(int i=0; i<2;i++){for(int j=0;j<2;j++){if(strlen(s[j]) >strlen(s[j+1]))p=s[j];s[j] =s[j+1];s[j+1] =p;}}for(int i=0;i<3;i++){puts(s[i]);}return 0;
}
2、实现一个整型的算术计算器
#include <stdio.h>int add(int a,int b);
int sub(int a,int b);
int mul(int a,int b);
int div(int a,int b);
int mod(int a,int b);int main(int argc, char*argv[])
{int a,b;char op;while(1){scanf("%d %c %d", &a, &op, &b);switch(op){case '+':printf("%d %c %d = %dn", a, op, b, add(a,b));break;case '-':printf("%d %c %d = %dn", a, op, b, sub(a,b));break;case '*':printf("%d %c %d = %dn", a, op, b, mul(a,b));break;case '/':printf("%d %c %d = %dn", a, op, b, div(a,b));break;case '%':printf("%d %c %d = %dn", a, op, b, mod(a,b));break;}}return 0;
} int add(int a,int b)
{return a+b;
}
int sub(int a,int b)
{return a-b;
}
int mul(int a,int b)
{return a*b;
}
int div(int a,int b)
{return a/b;
}
int mod(int a,int b)
{return a%b;
}
3、封装函数mystrcmp实现strcmp的功能
#include <stdio.h>
​
int mystrmp(char art[],char dst[])
{while(*str==*dst){if(!*str)return 0;str++;dst++;}return *str-*dst;
}
​
int main(int argc,char*argv[])
{char art[100],dst[100];printf("input str string: ");gets(str);printf("input dst string: ");gets(dst);printf("cmp: %dn", mystrcmp(str, dst));//调用函数mystrcmpreturn 0;
}
4、封装函数myatoi实现atoi函数的功能.//将整数型转换为字符型
#include <stdio.h>
int myatoi(char*str)
{int op=1, num=0;if('-'==*str){op=-1;str++;}while(*str){if(*str<'0'||*str>'9')break;num= (*str-'0') +num*10;str++;}return num*op;
}
intmain(int argc,char*argv[])
{ char str[100];while(1){printf("input string: ");gets(str);printf("myatoi: %dn", myatoi(str));}return 0;
}   
5、封装一个函数,实现对任意int型数组冒泡排序.//两个数组,通过冒泡法进行排序
#include <stdio.h>
​
void maopao(int a[], int n)
{//sizeof(a)/sizeof(a[0]); //err a是数组的地址for(int i=0; i<n-1; i++){for(int j=0; j<n-1-i; j++){if(a[j] >a[j+1]){a[j] ^=a[j+1];a[j+1] ^=a[j];a[j] ^=a[j+1];}}}/** 验证a是否是一个变量int c = 10;a = &c;*/
}
​
void arr_ptr(int*a, int n)
{for(int i=0; i<n; i++)printf("%d ", a[i]);puts("");
}
​
int main(int argc, char*argv[])
{int a[5] = {-7, 9, 2, 3, 6};int b[7] = {1, -5, -9, 3, 9, 7, 0};
​puts("a:");arr_ptr(a, 5);puts("maopao a:");maopao(a, 5);arr_ptr(a, 5);puts("b:");arr_ptr(b, 7);puts("maopao b:");maopao(b, 7);arr_ptr(b, 7);return 0;
}   
​
//第二种
#include <stdio.h>
void maopao(int*a,int n)
{for(int i=0;i<n;i++){for(int j=0;j<n-1-i;j++){if(*(a+j) >*(a+j+1)){*(a+j) ^=*(a+j+1);*(a+j+1) ^=*(a+j);*(a+j) ^=*(a+j+1);}}}
}
​
int main(int argc, char*argv[])
{ int a[5] = {9,5,7,8,6},n=5;maopao(a,n);for(int i=0;i<n;i++)printf("%d",a[i]);puts("");
}

本文发布于:2024-02-02 12:49:55,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170684939343911.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:基础   练习题   嵌入式   语言
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23