文章目录
一、数据
1.1、数据课后习题
- int占用4个字节空间, float占用4个字节空间, char占用1个字节空间 √
- scanf读取标准输入,%d用来匹配int整型,%f 匹配float类型%c 匹配字符√
- scanf““%d”,&i),当我们输人 10 回车后,i读取到了10,那么标准缓冲区中已经空了
解释:这时标准缓冲区中并没有空,里边还有n字符 - int i,char c;float f,scanf(“%d %c%f” ,&i,&c,&f);当混合读取时,因为%c不能忽略空格和n,所以需要在期前面加一个空格√
- 十进制是0-9,八进制是0-8,十六进制是0-9,A-F,请问是否正确A正确B错误
答案: B
解释八进制是0-7,总计8种变化情况,并不是0-8 - 整型数124对应的十六进制值是Ox7c
解释:把一个10转为16进制,只要不断除16即可,124除16,商是7,余数是12,而12就是c,因此是Ox7c - int i=5;float f=i/2;那么f的值为2.5
答案:B
解释:因为i是整型,所以除2是整除,得到的值是2,如果要得到2.5
是(float)i/2 - printf的 format参数中含有%c代表要输出字符,%d代表整型,%f代表浮点, %s代表字符串 √
- printf的输出默认是右对齐,不是左对齐。如果需要左对齐,那么加入负号。
1.2、数据OJ代码
1.2.1、题目1
正确代码:
#include <stdio.h>
int main()
{
int a;
int b;
scanf("%d%d",&a,&b);
int c=a+b;
printf("%d\n",c);
return 0;
}
错误代码:
#include <stdio.h>
int main()
{
int a;
int b;
int c=a+b;
scanf("%d%d",&a,&b);
printf("%d\n",c);
return 0;
//输出结果为任意数
}
解释:因为scanf先输入a和b,此时就不再执行int c=a+b的语句,此时会赋值任意数。
1.2.2、题目2
#include <stdio.h>
int main()
{
int a;
scanf("%d",&a);
printf("%c\n",a);
return 0;
}
在ASCLL码表中,97对应的就是a,所以直接用%c读取就行。
二、运算符与表达式
2.1、课后习题
2.2、OJ代码
2.2.1、题目1
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a;
scanf("%d",&a);
if(a%4==0 && a%100!=0 || a%400==0)
{
printf("yes");
}
else{
printf("no");
}
return 0;
}
2.2.2、题目2
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i,m;
char j;
float k;
scanf("%d %c%f",&i,&j,&k);
printf("%5.2f",i+j+k);
}
三、选择、循环
3.1、课后习题
3.2、OJ代码
3.2.1、题目1
#include <stdio.h>
#include <stdlib.h>
//对称数
int main()
{
int a;//定义一个整型变量a
int b=0,backup_a; //定义一个整型变量b和临时存放backup_a
scanf("%d",&a);//从键盘读取a,一1定要记得加&
backup_a=a;//把a的值备份一下
while(a) //12321 当取到最左边的1的时候,取余是为0
{
b=b*10+a%10;//b把原有的值乘以10,然后再加余数
//此时a%10就为1
a=a/10; //下一次循环不需要个位了,则除以10 剩下的就是1232 12321除以10=1232,这样就去掉了最后面的值
}
if(b==backup_a){
printf("yes\n");
}
else{
printf("no\n");
}
return 0;
}
3.2.2、题目2
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i,n,result=1;
scanf("%d",&n);
for(i=1;i<=n;i++){
result=result*i;//i用来遍历 n用来控制边界
//result用来保存结果
}
printf("%d\n",result);
}
3.2.3、题目3
#include <stdio.h>
#include <stdlib.h>
//换钞票
int main()
{
int a,b,c,d,count=0;//分别代码10 5 2 1元
for(a=1;a<=10;a++)//a为10块,换成100最多只能换10张
{
for(b=1;b<=20;b++){
for(c=1;c<=40;c++)//本来2块可以有50张,但是题目要求,总和不能超过40张,所以写成c<=40
{
for(d=1;d<=40;d++)//本来1块可以有100张,但是题目要求,总和不能超过40张,所以写成c<=40
{
if(a+b+c+d==40 && a*10+b*5+c*2+d*1==100)
{
count+=1;//count++
}
}
}
}
}
printf("%d",count);
return 0;
}
四、一维数组与字符数组
4.1、课后习题
4.2、OJ代码
4.2.1、题目1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
int a[100];//整型数组
int count;//元素个数
scanf("%d\n",&count);//读取元素个数
int i;
for(int i=0;i<count;i++){
scanf("%d",&a[i]);//循环读取多个整型元素
}
//判断整型数组中2出现的次数
int acount=0;//记录2出现的次数
for(int i=0;i<count;i++)
{
if(a[i]==2)
{acount++;}
}
printf("%d\n",acount);
return 0;
}
4.2.2、题目2
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
char c[100];//定义字符串数组
char ct[100]={0};//逆转后的字符串数组,初始化的目的是为了让ct有结束符
gets(c);//输入字符串
int i,g;//i是原字符串的游标 g是反转后的字符串的游标
int count;//计算输入字符串的长度大小
count=strlen(c);
for(int i=0,g=count-1;i<count;i++,g--)
{
ct[g]=c[i];
}
int result = strcmp(c, ct);
if (result < 0)
{
printf("%d\n",-1);
}
else if (result > 0)
{
printf("%d\n", 1);
}
else {
printf("%d\n", 0);
}
return 0;
}
五、指针
5.1、指针课后习题
5.2、OJ课后习题
5.2.1、题目1
#include <stdio.h>
void change(int *j)//j=&i;
{
*j=*j/2;
}
int main()
{
int i;
scanf("%d",&i);
//printf("%d\n",i);//查看i是否读取正确
change(&i);
printf("%d\n",i);
return 0;
}
5.2.2、题目2
#include <stdio.h>
int main()
{
int n;//代表申请的空间的大小
scanf("%d",&n);//读取
char c;
scanf("%c",&c);//清除标准缓冲区的\n
char *p;
p=(char *)malloc(n);//申请n个字节大小的空间,强制转换为cahr*
gets(p);//可以使用fgets(p,stdin)
puts(p);
return 0;
}
六、函数
6.1、函数题目
函数递归的核心:1.找公式 2.找结束条件
6.2、OJ题目
#include <stdio.h>
//上台阶问题
int step(int n)
{
if(1==n||2==n)
{
return n;
}
return step(n-1)+step(n-2);//递归的公式放在这里
}
int main()
{
int n,result;
scanf("%d",&n);//n不可以太大
result=step(n);
printf("%d\n",result);
return 0;
}
七、结构体指针
7.1、相关知识点