指针
#include<stdio.h>
#define PR(ar) printf("%d ",ar);
int main()
{
int j, a[] = {1, 3, 5, 7, 9, 11, 13, 15};
int* p = a + 5;
for (j = 3; j; --j)
{
switch(j)
{
case 1:
case 2: PR(*p++); break;
case 3: PR(*(--p));
}
}
return 0;
}
解析:后置++的优先级顺序大于解引用操作符*
j = 3,进入case 3,PR(*(a+4)) = 9(注:p = a + 4)
j = 2, 进入case 2,PR(*(a+4)) = 9(注:之后p = a + 5)
j = 1,进入case 1,case 2, PR(*(a+5)) = 11(注:之后p = a + 6)
编程题
题一
代码一:
#define N 7
void matrix(int(*a)[N]) {
int i = 0, j = 0, k = 1;
for (i = 0; i <= (N - 1) / 2; ++i) {
for (j = i; j < N - i; ++j) {
a[i][j] = a[N - 1 - i][j] = k;
a[j][i] = a[j][N - 1 - i] = k;
}
++k;
}
}
代码二:
# define 7
void matrix(int (*a)[N]){
int i, j;
for (i = 0; i <= (N - 1) / 2; ++i){
//第 i 行
for (j = i; j < N - i; ++j){
a[i][j] = a[N - 1 - i][j] = i + 1;
}
//第 i 列
for (k = i; k < N - i; ++k){
a[k][i] = a[k][N - 1 - i] = i + 1;
}
}
}
题二
代码一:
//冒泡排序思想
void sort(int array1[3][3]) {
int i, j, k;
//行升序
for (i = 0; i < 3; ++i) {
for (j = 0; j < 3; ++j) {
for (k = 0; k < 2 - j; ++k) {
if (array1[i][k] > array1[i][k + 1]) {
//交换
int temp = array1[i][k];
array1[i][k] = array1[i][k + 1];
array1[i][k + 1] = temp;
}
}
}
}
//列降序
for (j = 0; j < 3; ++j) {
for (i = 0; i < 3; ++i) {
for (k = 0; k < 2 - i; ++k) {
if (array1[k][j] < array1[k + 1][j]) {
//交换
int temp = array1[k][j];
array1[k][j] = array1[k + 1][j];
array1[k + 1][j] = temp;
}
}
}
}
}
代码二:
//选择排序思想
void sort(int array1[3][3]) {
int i, j, k;
//行升序
for (i = 0; i < 3; ++i) {
for (j = 0; j < 3; ++j) {
for (k = j + 1; k < 3; ++k) {
if (array1[i][j] > array1[i][k]) {
//交换
int temp = array1[i][k];
array1[i][k] = array1[i][j];
array1[i][j] = temp;
}
}
}
}
//列降序
for (j = 0; j < 3; ++j) {
for (i = 0; i < 3; ++i) {
for (k = i + 1; k < 3; ++k) {
if (array1[k][j] > array1[i][j]) {
//交换
int temp = array1[k][j];
array1[k][j] = array1[i][j];
array1[i][j] = temp;
}
}
}
}
}
题三
代码一:
int search(int a[][3]) {
int n, i, j, k = 0, cnt = 0;
int b[150] = { 0 };//以空间换时间
for (n = 1; n < 150; n += 4) {//H数
for (i = n - 4; i > 1; i -= 4) {
if (n % i == 0) {
break;//不是H素数
}
}
//是H素数
if (i == 1) {
b[k++] = n;
}
}
for (i = 0; i < k; ++i) {
for (j = i; j < k; ++j) {
int p = b[i] * b[j];
if (p <= 150 && p % 4 == 1) {
a[cnt][0] = p;
a[cnt][1] = b[i];
a[cnt][2] = b[j];
++cnt;
}
if (p > 150) {
break;
}
}
}
return cnt;
}
代码二:
int Hprime(int n) {
int i;
for (i = n - 4; i > 1; i -= 4) {
if (n % i == 0) {
break;
}
}
if (i == 1) {
return 1;
}
return 0;
}
int search(int a[][3]) {
int n, i, k, cnt = 0;
for (n = 1; n < 150; n += 4) {//H数
//找H半素数
for (i = 5; i < n; i += 4) {
if (n % i == 0 && Hprime(i)) {
break;
}
}
//判断H半素数另一因子(仍为H素数)
k = n / i;
if (Hprime(k)) {
a[cnt][0] = n;
a[cnt][1] = i;
a[cnt][2] = k;
++cnt;
}
}
return cnt;
}
题四
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<conio.h>
int allZeroOnes(int x) {
while (x) {
if (x % 10 != 0 && x % 10 != 1) {
return 0;
}
x /= 10;
}
return 1;
}
long find_m(int n) {
int temp = 1, m = -1;
int i = 1;
for (;; ++i) {
temp = n * i;
if (allZeroOnes(temp)) {
m = temp;
break;
}
}
return m;
}
int main() {
FILE* fp = fopen("myf2.out", "w+");
int n = 0;
long m = 0;
if (fp == NULL) {
printf("error");
return 0;
}
printf("n = ");
scanf("%d", &n);//fscanf("
m = find_m(n);
printf("\nn = %d\tm = %ld ", n, m);
fprintf(fp, "\nn = %d\tm = %ld ", n, m);
fprintf(fp, "\nMy exam is 99999");
fclose(fp);
fp = NULL;
_getch();
return 0;
}
题五
代码一:
void insert(char* p) {
int i, j = 0;
int flag = 0;//哨兵
char s[50];//以空间换取时间
for (i = 0; p[i] != '\0'; ++i) {
if (0 == flag && (p[i] >= '0' && p[i] <= '9')) {
s[j++] = '-';
flag = 1;
}
else if (1 == flag && (p[i] <'0' || p[i] > '9')) {
flag = 0;
}
s[j++] = p[i];
}
s[j] = 0;//注意添加终止字符'\0' = 0;
//还原到字符串p中去
for (i = 0; i < strlen(s); ++i) {
p[i] = s[i];
}
p[i] = '\0';
return;
}
代码二:
void insert(char* p) {
int i;
int flag = 0;
for (i = 0; i < strlen(p); ++i) {
if (isdigit(p[i])) {
int cnt = 0, k = i;
while (isdigit(p[k++])) ++cnt;
int j = strlen(p);
for (; j > i; --j) {
p[j] = p[j - 1];
}
p[i] = '-';
p[strlen(p)] = '\0';
i += cnt;
}
}
return;
}
题六
代码一:
#include<stdio.h>
#include<string.h>
void squeeze(char* s1, char* s2)
{
int i, j, k = 0;
char temp[25];
for (i = 0; i < strlen(s1); ++i)
{
for (j = 0; j < strlen(s2); ++j)
{
if (s1[i] == s2[j])
{
break;
}
}
if (j == strlen(s2))
{
temp[k++] = s1[i];
}
}
temp[k] = '\0';//注意字符串结束标志!!!
for (i = 0; i <= k; ++i)//注意这边的k 可以取到
{
s1[i] = temp[i];
}
}
int main()
{
FILE* fp;
char s1[25] = "abbcdefgghiijk1", s2[25] = "bdglk";
if (NULL != (fp = fopen("myf2.out", "w+")))
{
squeeze(s1, s2);
printf("s1:%s\n", s1);
fprintf(fp, "s1:%s\n", s1);
fprintf(fp, "\nmy exam is 9999");
fclose(fp);
fp = NULL;
}
return 0;
}
题七
代码一:
#include<stdio.h>
#include<conio.h>
#include<string.h>
int MakeNum(char a[], char b[][6], int k)
{
int i, j, m = 0;
for (i = 0; i < strlen(a); i += k)
{
for (j = i; j < strlen(a) && j < i + k; ++j)
{
b[m][j - i] = a[j];
}
b[m++][j - i] = '\0';
}
return m;
}
int main()
{
FILE* fp;
int k, cnt, i;
char a[30] = "0112400123", b[6][6];
if (NULL != (fp = fopen("myf2.out", "w+")))
{
scanf("%d", &k);
cnt = MakeNum(a, b, k);
for (i = 0; i < cnt; ++i)
{
printf("%s ", b[i]);
fprintf(fp, "%s ", b[i]);
}
fprintf(fp, "\nMy exam is 9999");
fclose(fp);
fp = NULL;
}
_getch();//VS2019平台要加上下划线,不然跑过不去
return 0;
}