(c语言进阶)作业讲解
例一:
题目:
答案:
#include<stdio.h>
#include<math.h>
int main()
{
int x;
double sum=0; int g = 0; int i = 0;
scanf("%d",&x);
while (x > 0)
{
g = x % 10;
if (g % 2 == 0)
{
g = 0;
}
else
{
g = 1;
}
sum += g*pow(10,i); //pow函数的返回值为double类型
i++;
x /= 10;
}
printf("%.0lf",sum);
return 0;
}
例二:
题目:
答案:
#include<stdio.h>
#include<math.h>
int main()
{
int x,i,j,n;
scanf("%d",&x);
n = x;
while (n--)
{
for (i = 0; i < n; i++)
{
printf(" ");
}
for (j = n+1; j <= x; j++)
{
printf("* ");
}
printf("\n");
}
return 0;
}
例三:
题目:
答案:
#include<stdio.h>
int main()
{
double value;
int m, d, h;
scanf("%lf %d %d %d", &value, &m, &d, &h);
if (m == 11 && d == 11)
{
value *= 0.7;
if (h == 1)
{
value -= 50.0;
}
}
if (m == 12 && d == 12)
{
value *= 0.8;
if (h == 1)
{
value -= 50;
}
}
printf("%.2lf",value);
}
例四:
题目:
答案:
D
原码、反码、补码的最高位是0表示正数,1表示负数
例五:
题目:
答案:
C
#include<stdio.h>
int main()
{
unsigned char a = 200;
unsigned char b = 100;
unsigned char c = 0;
//无符号字符型可存储数据大小为0~255,故不存在数据溢出和截断
//0000 0000 0000 0000 0000 0000 1100 1000——(int)200
//1100 1000——(unsigned char)200
//0000 0000 0000 0000 0000 0000 0110 0100——(int)100
//0110 0100——(unsigned char)100
c = a + b;
//0000 0000 0000 0000 0000 0001 0010 1100——(int)300
//0010 1100——(unsigned char)200 ==44 发生截断
printf("%d %d",a+b,c);
//故a+b=300,c=44
}
例六:
题目:
答案:
A
大端存储:低位数据放在高位,高位数据放在低位
小端存储:低位数据放在低位,高位数据放在高位
a大端存储:00 00 12 34
a小端存储:34 12 00 00
变为字符型往后读取一个字节 00
例七:
题目:
答案:
C
#include<stdio.h>
#include<string.h>
int main()
{
char a[1000] = {0};
//字符型的数据存储范围为-127~128
int i = 0;
for (i = 0; i < 1000; i++)
{
a[i] = -1 - i; //当数据超过存储范围时就不会执行赋值
}
printf("%d",strlen(a));
//故最后数组里的元素只会有-127~128,也就是255个
return 0;
}
例八:
题目:
答案:
D
大端存储:低位数据放在高位,高位数据放在低位
小端存储:低位数据放在低位,高位数据放在高位
在计算机领域,大小端(Endianness)是指字节序的排列顺序。
字节序,就是 大于一个字节类型的数据在内存中的存放顺序。
例九:
题目:
答案:
#include<stdio.h>
//将所有的可能性都穷举出来,然后符合条件的返回值为1,相加为1说明两个中只有一个是对的
//不能用||判断,这样不能排除两个条件都为真的情况
int main()
{
int a, b, c, d,e;
for (a = 1; a <= 5; a++)
{
for (b = 1; b <= 5; b++)
{
for (c = 1; c <= 5; c++)
{
for (d = 1; d <= 5; d++)
{
for (e = 1; e <= 5; e++)
{
if (((b==2)+(a==3)==1)&&((b==2)+(e==4)==1)&&((c==1)+(d==2)==1)&&((c==5)+(d==3)==1)&&((e==4)+(a==1)==1))
{
if (a*b*c*d*e==120)
{
printf("a=%d b=%d c=%d d=%d e=%d\n", a, b, c, d, e);
}
}
}
}
}
}
}
return 0;
}
例十:
题目:
答案:
#include<stdio.h>
int main()
{
char killer;
for (killer = 'a'; killer <= 'd'; killer++) //穷举法
{
if ((killer != 'a') + (killer == 'c') + (killer == 'd') + (killer != 'd') == 3)
{
printf("killer为%c",killer);
}
}
return 0;
}
例十一:
题目:
答案:
#include<stdio.h> //杨辉三角
int main()
{
int i, j;
int z = 11;
int arr[10][10] = {0};
for (i = 0; i < 10; i++)
{
for (j = 0; j < 10; j++)
{
arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1]; //观察其规律即可
if (j == 0 || i == j)
{
arr[i][j] = 1;
}
}
}
for (i = 0; i < 10; i++)
{
int u = z;
for (z; z > 0; z--)
{
printf(" ");
}
z = u - 1;
for (j = 0; j <= i; j++)
{
printf(" %d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
例十二:
题目:
答案:
A
free释放掉指针内容后,指针变量的值不会进行处理
例十三:
题目:
答案:
C
字符串赋值时,赋值的是其首元素的地址
例十四:
题目:
答案:
C
数组指针是指向数组的指针
指针数组是存放指针的数组
例十五:
题目:
答案:
C
例十六:
题目:
答案:
C
例十七:
题目:
答案:
A
例十八:
题目:
答案:
B
例十九:
题目:
答案:
D
例二十:
题目:
答案:
A
例二十一:
题目:
答案:
C
例二十一:
题目:
答案:
C
str1和str2是在不同存储空间内字符串的首地址,所以不相同
str3和str4都是字符串的首元素地址,故相等
例二十二:
题目:
答案:
B
例二十三:
题目:
答案:
解法1:
#include<stdio.h> //左旋函数
#include<math.h>
void left_turn(char arr[], int x)
{
int i;
int lenth = strlen(arr);
x %= lenth; //简化循环次数
for(i=0;i<x;i++)
{
char c = arr[0]; //将首元素取出来
for(int j=0;j<lenth-1;j++)
{
arr[j] = arr[j + 1]; //之后的元素向前移
}
arr[lenth-1] = c; //第一个元素放在最后
}
}
int main()
{
char arr[] = "ABCD";
int x;
scanf("%d", &x);//左旋的次数
left_turn(arr, x);
printf("%s", arr);
return 0;
}
解法2:
#include<stdio.h> //左旋函数
#include<math.h>
void reverse(char* left, char* right) //交换函数
{
while (left < right)
{
char t = *left;
*left = *right;
*right = t;
left++;
right--;
}
}
void left_turn(char arr[], int x)
{
int len = strlen(arr);
x %= len;
reverse(arr,arr+x-1); //交换前一部分
reverse(arr+x,arr+len-1); //交换后一部分
reverse(arr,arr+len-1); //交换整体
}
int main()
{
char arr[] = "ABCD";
int x;
scanf("%d", &x);//左旋的次数
left_turn(arr, x);
printf("%s", arr);
return 0;
}
例二十四:
题目:
答案:
#include<stdio.h>
int find_num(int arr[3][3], int r, int c, int k) //r为矩阵的行数,c为矩阵的列数
{
int x = 0;
int y = c - 1;
while (x<=r-1&&y>=0)
{
if (k > arr[x][y]) //如果查找的数大于一行的最大数,则比较下一行的最大数
{
x++;
}
else if (k < arr[x][y])//如果查找的数小于一行的最大数,则比较后一列的数
{
y--;
}
else
{
printf("行:%d 列:%d",x+1,y+1);
return 1; //如果相等则说明找到了,返回1
}
}
return 0; //没找到返回0
}
int main()
{
int arr[3][3] = {1,2,3,4,5,6,7,8,9};
int k = 0;
scanf("%d",&k); //需要查找的数
int ret = find_num(arr,3,3,k);
if (ret==1)
{
printf("查找的数存在\n");
}
else
{
printf("查找的数不存在\n");
}
return 0;
}
例二十五:
题目:
答案:
C
例二十六:
题目:
答案:
D
回调函数就是一个通过函数指针调用的函数。
如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。
回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
例二十七:
题目:
答案:
#include<stdio.h>
#include<string.h>
int PanDuan_string(char arr1[10], char arr2[10])
{
int len = (int)strlen(arr1);
int count = 0;
for (int j = 0; j < len; j++)
{
char c = arr1[0]; //将第一个元素存放在c中
for (int i = 0; i < len - 1; i++)
{
arr1[i] = arr1[i + 1];
}
arr1[len - 1] = c;
if (strcmp(arr1,arr2)==0) //如果相等则返回1
{
return 1;
}
}
return 0; //遍历结束没有相等的说明没找到,返回0
}
int main()
{
char arr1[10]="ABCDE";
char arr2[10] = "CDEAB";
int p=PanDuan_string(arr1,arr2);
if (p == 1)
{
printf("是由旋转得到\n");
}
else
{
printf("不是由旋转得到\n");
}
return 0;
}
例二十八:
题目:
答案:
B
数组名为数组的首元素地址,该数组的元素为字符串,字符串赋值的为字符串的首元素地址,故该数组的数组名为二维指针。
例二十九:
题目:
答案:
C
二维数组的元素为一维数组,故二维数组的元素名为数组指针。
例三十:
题目:
答案:
B
例三十一:
题目:
答案:
#include<stdio.h>
int main()
{
int m, n,i,j;
int arr[10][10];
scanf("%d %d",&m,&n);
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
scanf("%d",&arr[i][j]);
}
}
printf("\n");
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
printf("%d ", arr[j][i]);
}
printf("\n");
}
return 0;
}
例三十二:
题目:
答案:
#include<stdio.h>
int main()
{
int m,i,j;
int z = 0;
int arr[10][10];
scanf("%d",&m);
for (i = 0; i < m; i++)
{
for (j = 0; j < m; j++)
{
scanf("%d",&arr[i][j]);
}
}
for (i = 0; i < m; i++)
{
for (j = 0; j < m; j++)
{
if (i > j && arr[i][j] != 0)
{
z = 1;
}
}
}
if (z == 1)
{
printf("NO\n");
}
else
{
printf("YES\n");
}
return 0;
}
例三十三:
题目:
答案:
#include<stdio.h>
int main()
{
int i,k;
int a = 0, b = 0;
int arr[50];
scanf("%d",&k);
if (k < 3)
{
printf("输入数据较少\n");
return 0;
}
for (i = 0; i < k; i++)
{
scanf("%d",&arr[i]);
}
for (i = 0; i <k-1; i++)
{
if (arr[i] >=arr[i + 1])
{
a = 1;
}
else if (arr[i] < arr[i + 1])
{
b = 1;
}
}
if ((a+b)<=1)
{
printf("sorted\n");
}
else
{
printf("unsorted\n");
}
return 0;
}