文章目录
前言
一、易混知识点
1.结构体:
stu 是结构体变量,类型是struct student
struct student
{
int num;
char name[32];
float score;
} stu;
stu 是结构体变量的
用了typedef时,Stu 是类型。
typedef struct Student
{
int num;
char name[32];
float score;
} Stu;
//Stu 是类型
int main()
{
Stu s1;
return 0;
}
2.指针数组与数组指针
指针数组:存放指针的数组。如:int *arr[10]
数组指针:存放数组的指针。如:int ( *arr)[10]
3.正确的解引用
在结构体中,结构体变量a,结构体指针*p=&a;要取结构体中成员c。
可用:a.c;p->c;( *p).c。
不可:*p.c。
4.Debug和Release
1)Release被称为发布版本,测试人员测试的就是Release版本
2)Release版本也可以调试,只是往往会优化,程序大小和运行速度上效果最优
5.递归问题
8
7 6
6 5 5 4
5 4 4 3 4 3 3 2
4 3 3 2 3 2 2 1 3 2 2 1 2 1 1 0
3 2 2 1 2 1 1 0 2 1 1 0 1 0 2 1 1 0 1 0 1 0
2 1 1 0 1 0 …然后依次数出有多少个数。
6.指针
二、编程题
1.喝汽水问题
喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以多少汽水(编程实现)。
思路:(!!!一定要画思维导图)
汽水–>空瓶
20 —>20
10---->5
5------>2…1
3------>1…1
2---->1
把以上相加,就是汽水量
方一:
#include<stdio.h>
int main()
{
int money = 0;
int total = 0;
int empty = 0;
scanf("%d", &money);//20
total += money;//买
empty = money;
//置换
while (empty >= 2)
{
total += (empty / 2);
empty = empty / 2 + empty%2;
}
printf("%d\n", total);
return 0;
}
方二:(根据结果观察得知)(非常简易)(数学推导)
if(money > 0)
total = 2 * money - 1;
2.上三角矩阵判定
方法一:直接判断下山角中有没有不为0的,如果有,就跳出。
利用goto跳出可以直接跳出几个循环,break只能一次跳出一个循环。
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
//int arr[n][n];//C99 变长数组
int arr[10][10];
int i = 0;
//输入
for (i = 0; i < n; i++)
{
int j = 0;
for (j = 0; j < n; j++)
{
scanf("%d", &arr[i][j]);
}
}
//判断
int flag = 1;//默认是上三角矩阵
for (i = 0; i < n; i++)
{
int j = 0;
for (j = 0; j < i; j++)
{
if (arr[i][j] != 0)
{
flag = 0;
goto end;
}
}
}
end:
if (flag == 1)
printf("YES\n");
else
printf("NO\n");
return 0;
}
方法二:判定下三角有多少个0;如果累加的0数与本应改计数得出的0数相等,则下三角全是0.
#include<stdio.h>
#define N 10000
int main() {
int n;
scanf("%d", &n);
int arr[N][N];
int i = 0, j = 0;
int count = 0;
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
scanf("%d", &arr[i][j]);
}
}
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
if (i > j)
{
if (arr[i][j] == 0)
{
count++;
}
}
}
}
if (count == n * (n - 1) / 2)
printf("YES\n");
else
printf("NO\n");
}
3.调整奇数偶数顺序
输入一个整数数组,实现一个函数,来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分。
void move(int arr[], int sz)
{
int left = 0;
int right = sz - 1;
while (left<right)
{
//找偶数的过程
while ((left<right) && (arr[left] % 2 == 1))
{
left++;
}
//找奇数的过程
while ((left < right) && (arr[right] % 2 == 0))
{
right--;
}
if (left < right)
{
int tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
left++;
right--;
}
}
}
int main()
{
int arr[10] = { 0 };
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
//输入
for (i = 0; i < sz; i++)
{
scanf("%d", &arr[i]);
}
//调整
move(arr, sz);
//输出
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
4.有序序列合并
输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。
数据范围:1≤n,m≤1000 , 序列中的值满足 0≤val≤30000
方法一:
int main() {
// int arr1[1000];
// int arr2[1000];
// int arr3[2000];
int n = 0;
int m = 0;
//输入
scanf("%d %d", &n, &m);
int arr1[n];
int arr2[m];
int arr3[n + m];
//arr1的输入
int i = 0;
for (i = 0; i < n; i++)
{
scanf("%d", &arr1[i]);
}
//arr2的输入
for (i = 0; i < m; i++)
{
scanf("%d", &arr2[i]);
}
//合并数组
i = 0;
int j = 0;
int k = 0;
while (i < n && j < m)
{
if (arr1[i] < arr2[j])
{
arr3[k] = arr1[i];
i++;
k++;
}
else
{
arr3[k] = arr2[j];
j++;
k++;
}
}
if (i == n)
{
//把arr2中剩余的元素放在arr3中
while (j < m)
{
arr3[k] = arr2[j];
j++;
k++;
}
}
else
{
//把arr1中剩余的元素放在arr3中
while (i < n)
{
arr3[k] = arr1[i];
i++;
k++;
}
}
//输出
for (k = 0; k < n + m; k++)
{
printf("%d ", arr3[k]);
}
return 0;
}
方法二,直接输出,不用另外一个数组
int main() {
// int arr1[1000];
// int arr2[1000];
// int arr3[2000];
int n = 0;
int m = 0;
//输入
scanf("%d %d", &n, &m);
int arr1[n];
int arr2[m];
int arr3[n + m];
//arr1的输入
int i = 0;
for (i = 0; i < n; i++)
{
scanf("%d", &arr1[i]);
}
//arr2的输入
for (i = 0; i < m; i++)
{
scanf("%d", &arr2[i]);
}
//合并数组
i = 0;
int j = 0;
int k = 0;
while (i < n && j < m)
{
if (arr1[i] < arr2[j])
{
printf("%d ", arr1[i]);
i++;
}
else
{
printf("%d ", arr2[j]);
j++;
}
}
if (i == n)
{
//把arr2中剩余的元素放在arr3中
while (j < m)
{
printf("%d ", arr2[j]);
j++;
}
}
else
{
//把arr1中剩余的元素放在arr3中
while (i < n)
{
printf("%d ", arr1[i]);
i++;
}
}
return 0;
}
5.倒置字符串
将一句话的单词进行倒置,标点不倒置。
比如 I like beijing. 经过函数后变为:beijing. like I
思路:1.逆序整个字符串
2.逆序每个单词
3.逆序每个单词也要找左边和右边,如何找要注意。
#include <stdio.h>
#include <string.h>
#include <assert.h>
void reverse(char* left, char* right)
{
assert(left && right);
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
int main() {
char arr[100] = { 0 };
//输入
gets(arr);
int len = strlen(arr);
//完成这个逆序
//1. 逆序整个字符串
reverse(arr, arr + len - 1);
//逆序每个单词
char* cur = arr;
while (*cur)
{
char* start = cur;
while (*cur != ' ' && *cur != '\0')
{
cur++;
}
reverse(start, cur - 1);
if (*cur != '\0')
cur++;
}
//打印
printf("%s\n", arr);
return 0;
}