//我告诉自己,是时候好好弄一下C语言了,因为不懂C,真的就不懂底层的东西,所有的
//都要在熟练运用C以后,这是非常重要的
//什么是质数,只能被1和自身整除的数就是质数
//1既不是质数也不是合数
int is_zhi(int num)//1.判断基准
{
if(num <= 1)
return 0; //不是
else if(num ==2 || num ==3)
return 1;
else //从2一次相加,如果又一次可以整除,就说明不是质数
{ int flag = 1;
for(int i=2;i<num;i++)
{
if(num%i == 0)
{
flag = 0;
break;
}
}
return flag;
}
}
1 #include <stdio.h>
2 #include <stdlib.h>
//获取斐波那契数列的同乡
4 int get_item(int item)
5 {
6 if(item == 0 || item == 1)
7 return 1;
8 else
9 {
10 return get_item(item-1) + get_item(item-2);
11 }
12 }
13
14 int main()
15 {
16 int ret;
17 scanf("%d",&ret);
18 ret = get_item(ret);
19 printf("ret=%d \n",ret);
20 return 1;
21 }
#include <stdio.h>
#include <stdlib.h>
#define N 10
int main()
{
//我们需要搞定一个什么样的事情呢,需要打印一个N行和N列的矩阵
int arr[N][N];
int i,j;
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
arr[i][j] = i*N+j+1;
printf("%-5d",arr[i][j]);
}
printf("\n");
}
//打印出对角线的数字,看起来真的很美
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
arr[i][j] = i*N+j+1;
if(i == j)
printf("%-5d",arr[i][j]);
else
printf("%-5d",0);
}
printf("\n");
}
}
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
31 32 33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48 49 50
51 52 53 54 55 56 57 58 59 60
61 62 63 64 65 66 67 68 69 70
71 72 73 74 75 76 77 78 79 80
81 82 83 84 85 86 87 88 89 90
91 92 93 94 95 96 97 98 99 100
1 0 0 0 0 0 0 0 0 0
0 12 0 0 0 0 0 0 0 0
0 0 23 0 0 0 0 0 0 0
0 0 0 34 0 0 0 0 0 0
0 0 0 0 45 0 0 0 0 0
0 0 0 0 0 56 0 0 0 0
0 0 0 0 0 0 67 0 0 0
0 0 0 0 0 0 0 78 0 0
0 0 0 0 0 0 0 0 89 0
0 0 0 0 0 0 0 0 0 100
#include <stdio.h>
#include <stdlib.h>
#define I 2
#define J 3
int main()
{
//我们需要搞定一个什么样的事情呢,需要打印一个N行和N列的矩阵
int arr[I][J];
int i,j;
for(i=0;i<I;i++)
{
for(j=0;j<J;j++)
{
arr[i][j] = i*2+j+1;
printf("%5d",arr[i][j]);
}
printf("\n");
}
int ret[J][I];
for(i=0;i<J;i++)
{
for(j=0;j<I;j++)
{
//这一句是矩阵转置的精髓
ret[i][j] = arr[j][i];
printf("%5d",ret[i][j]);
}
printf("\n");
}
}
1 2 3
3 4 5
1 3
2 4
3 5
3 5
int main() //注意指针的类型,int* *p这样就好理解这样一个二级指针了 char* *二级指针准确来说应该这样写
{
int num = 100; //数字100
int *p = # //p=num的地址, *p = 100
int **pp = &p; //定义一个int *类型的变量来指向p的地址,注意指针的类型
printf("p=%p \n",p);
int *pointer = *pp;//*pp是p的地址,将pointer指针赋值p
printf("pointer=%p\t*pointer=%d \n",pointer,*pointer);
return 0;
}
int main()
{
int arr[7] = {1,2,3,4,5,6,4}; //这里说明了一个问题,arr,和 &arr地址都是0x7fff5fbff840
//但是它们的大小确不一样,原理是一个指针地址虽然首地址虽然相同,但是到什么地方结尾是要看你指向的类型的
printf("%p,%p \n",arr,&arr);
printf("%d,%d \n",sizeof(*arr),sizeof(*(&arr)));
int *p = arr;
int (*pp)[5] = &arr; //申明一个指针数组
printf("%d",(*pp)[1]);
return 0;
}
int maina() //从这里可以看出指针的大小都是相同的,不同是指向的数据的大小不同
{
char ch = 'A';
int num = 100;
double db = 10.8;
char *p1 = &ch;
int *p2 = #
double *p3 = &db;
int **pp2 = &p2;
printf("%d,%d,%d,%d \n",sizeof(p1),sizeof(p2),sizeof(p3),sizeof(pp2));
return 0;
}
//需要搞定一个什么样的事情呢,我需要搞定用malloc函数来动态的创建函数
int num;
scanf("%d",&num);
int *p = malloc(sizeof(int)*num);
for(int i=0;i<num;i++)
{
p[i] = i;
printf("%p,%d \n",&p[i],p[i]);
}
//数组是有大小限制的在C语言当中,所以我们这样动态分配就可以满足了
//这里总结指针的使用
//指针的概念
//首地址和步长值,步长值是有指针将解析成什么地址决定的
//char,int,double,unsinged int,float,array(),pointer,function
//指针的申明,直接用变量 int *p,数组本身就是指针,数组时连续的内存单元,所以可以用malloc动态分配
//二级指针保存的事一级指针的地址,作用是来改变一级指针的指向
//动态分配内存时必须要指定指针的类型,之后一定要free掉内存
//memset,strcpy
下面都是结构体的知识
int main()
{
//需要搞定一个什么样的事情呢,我需要搞定用malloc函数来动态的创建函数
int num;
scanf("%d",&num);
int *p = malloc(sizeof(int)*num);
for(int i=0;i<num;i++)
{
p[i] = i;
printf("%p,%d \n",&p[i],p[i]);
}
//数组是有大小限制的在C语言当中,所以我们这样动态分配就可以满足了
return 0;
}
//这里总结指针的使用
//指针的概念
//首地址和步长值,步长值是有指针将解析成什么地址决定的
//char,int,double,unsinged int,float,array(),pointer,function
//指针的申明,直接用变量 int *p,数组本身就是指针,数组时连续的内存单元,所以可以用malloc动态分配
//二级指针保存的事一级指针的地址,作用是来改变一级指针的指向
//动态分配内存时必须要指定指针的类型,之后一定要free掉内存
//memset,strcpy
#define DD struct nameinfo
struct nameinfo
{
char name[50];
char phone[12];
int num;
};
//需要搞定一个什么问题呢,就是无名结构体的用处,一般无名结构不能被别人使用,只有在定义的时候赋值给几个变量
struct //这里就是无名结构体
{
char name[50];
char addr[50];
}N1,N2;
int maindfs()
{
DD d1;
strcpy(d1.name,"hurong");
printf("%s\n",d1.name);
return 0;
}
int maina() {
// struct nameinfo myinfo = { //这里时结构题初始化的第一种方式,非常的简单,这个必须要学会
// "baixiaoshi",
// "121312121",
// 200
// };
//printf("name=%s\nphone=%s\n",myinfo.name,myinfo.phone);
return 0;
}
结构体的嵌套
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct baseinfo{
char name[50];
char addr[50];
int age;
}; //基本信息
struct extend_info
{
char hobby[30];
char lovegirl[40];
struct baseinfo base;
}; //拓展信息的结构题
int main()
{
//我们需要搞定一个什么样的问题呢,我们需要搞定一个结构题嵌套后如何赋值的问题
struct extend_info e1;
strcpy(e1.hobby,"my hobby");
strcpy(e1.lovegirl,"hu rong");
strcpy(e1.base.name,"baixiaoshi");
strcpy(e1.base.addr,"江西省贵溪市塘湾镇上祝村");
printf("%s \n",e1.base.addr);
return 0;
}
struct node //字节对齐已经时一个老生长谈的问题了,原理:结构体中的每一个成员变量的字节数都要时最宽那个成员的倍数
{
char ch;//4
int num;//4
char str[10]; //12
};
struct node
{ //这里的最宽成员就是double 占8个字节
char ch; 8
short num; 8
double age; 8
char str[10];16
};