第六章利用数组处理数据
6.1打印输出杨辉三角形(输出10行)
void main(){
int i,j,k;
int a[10][10];
for(i=0,k=9;i<10;i++,k--){
for(j=0;j<10-k;j++){
if(j==0||i==j){
a[i][j]=1;
}else{
a[i][j]=a[i-1][j-1] + a[i-1][j];
}
printf("%4d",a[i][j]);
}
printf("\n");
}
}
6.2改变一组数据的顺序
void main(){
int a[8];
int i,j,temp;
for(i=0;i<8;i++){
scanf("%d",&a[i]);
getchar();
}
for(i=0;i<4;i++){
temp=a[i];
a[i]=a[7-i];
a[7-i]=temp;
}
for(j=0;j<8;j++){
printf("%5d",a[j]);
}
}
6.3排序好的数组,插入一个数,插入到对应的位置,保持数组的顺序
#include<stdio.h>
void main(){
int arr[8] = {2,5,39,89,123,147};
int number;
int temp,temp2,i,j;
for(int i=0;i<6;i++){
printf("%5d",arr[i]);
}
printf("please put a number:\n");
scanf("%d",&number);
if(number>arr[5]){
arr[6]=number;
for(int i=0;i<7;i++){
printf("%5d",arr[i]);
}
}else{
for(i=0;i<6;i++){
if(arr[i]>number){
temp=arr[i];
arr[i]=number;
for(j=i+1;j<7;j++){
temp2=arr[j];
arr[j]= temp;
temp=temp2;
}
break;
}
}
}
for(i=0;i<7;i++){
printf("%5d",arr[i]);
}
}
6.4打印一个魔方阵(限制单数阶层3~15)
void main(){
int number;
int hang=0;
int lie=0;
printf("put a number beteen the one to fity:");
scanf("%d",&number);
int a[number][number];
for(int i=0;i<number;i++){
for(int j=0;j<number;j++){
a[i][j]=0;
printf("%5d",a[i][j]);
}
printf("\n");
}
lie=number/2;
a[hang][lie]=1;
for(int i=2;i<=number*number;i++){
if(hang!=0 && lie!=number-1){
if(a[hang-1][lie+1]==0 ){
a[hang-1][lie+1]=i;
hang--;
lie++;
}else{
a[hang+1][lie]=i;
hang++;
}
}else if(hang==0&&lie!=number-1){
if(a[number-1][lie+1]==0){
a[number-1][lie+1]=i;
hang=number-1;
lie++;
}else{
a[hang+1][lie];
hang++;
}
}else if(hang!=0&&lie==number-1){
if(a[hang-1][0]==0){
a[hang-1][0]=i;
hang--;
lie=0;
}else{
a[hang+1][lie];
hang++;
}
}else if(hang==0&&lie==number-1){
a[hang+1][number-1]=i;
hang++;
}
}
printf("----------\n");
for(int i=0;i<number;i++){
for(int j=0;j<number;j++){
printf("%5d",a[i][j]);
}
printf("\n");
}
}
6.5定义一个形参数组调用函数
void main(){
int num=5;
float sum,avar;
float score1[3]={5,10,15};
float score2[2]={20,10};
float avg(float arry[],int n);
// printf("put ten numbers:");
// for(int i=0;i<num;i++){
// scanf("%f",&score[i]);
// }
printf("%5.2f\n",avg(score1,3));
printf("%5.2f",avg(score2,2));
}
float avg(float arry[],int n){
// float arry[num];
float sum,ary;
for(int i=0;i<n;i++){
sum += arry[i];
}
ary =sum/n;
return ary;
}
注意:在定义二维数组时,必须指定列数,行数可以不指定
形参数组的第1维可以与实参数组长度不同
6.6数组相关问题
//假设有N盏灯(N为不大于5000的正整数),从1到N按顺序依次编号,初始时全部处于开启状态;有M个人(M为不大于N的正整数)也从1到M依次编号。
//第一个人(1号)将灯全部关闭,第二个人(2号)将编号为2的倍数的灯打开,第三个人(3号)将编号为3的倍数的灯做相反处理(即,将打开的灯关闭,将关闭的灯打开)。依照编号递增顺序,以后的人都和3号一样,将凡是自己编号倍数的灯做相反处理。
//请问:当第M个人操作之后,哪几盏灯是关闭的,按从小到大输出其编号,其间用逗号间隔。
int main()
{
int n,m;
scanf("%d%d",&n,&m);
int led[n];
for(int i=0;i<n;i++){
led[i]=-1;//设-1为关闭状态
}
for(int i=2;i<=m;i++){//第一个人把灯全部关闭了,从第二个人开始算
for(int j=2;j<=n;j++){
if(j%i==0){
led[j-1] = -led[j-1];
}
}
}
for(int a=0;a<n;a++){
if(led[a]==-1){
printf("%4d",(a+1));//把关闭状态的下标加1输出
}
}
return 0;
}
第七章 函数的使用
7.1利用函数转置一个3*3的二维数组
void main(){
int arr[3][3]={{11,21,31},{12,13,14},{21,22,23}};
int i,j;
void zhuan(int str[3][3]);
for(i=0;i<3;i++){
for(j=0;j<3;j++){
printf("%4d",arr[i][j]);
}
printf("\n");
}
zhuan(arr);
printf("after zhuan is:\n");
for(i=0;i<3;i++){
for(j=0;j<3;j++){
printf("%4d",arr[i][j]);
}
printf("\n");
}
}
void zhuan(int str[3][3]){
int i,j,temp;
for(i=0;i<3;i++){
for(j=i+1;j<3;j++){
temp=str[i][j];
str[i][j]=str[j][i];
str[j][i]=temp;
}
}
}
7.2利用函数存储字符串
void main()
{
void str_input(char arr[]);
void str_deleate(char arr[],char ch);
void str_out(char arr[]);
char str[20],c;
str_input(str);
//printf("%c",str);
printf("%s\n",str);
printf("put what you want deleate:");
scanf("%c",&c);
printf("%c\n",c);
str_deleate(str,c);
str_out(str);
}
void str_input(char arr[])
{
gets(arr);
}
void str_deleate(char arr[],char ch)
{
int i=0;
int j=0;
for(i=0;arr[i]!='\0';i++){
if(arr[i]!=ch){
arr[j]=arr[i];
j++;
}
}
arr[j]='\0';
}
void str_out(char arr[])
{
printf("%s\n",arr);
}
7.3 输入一个字符串,然后空格输出
void main(){
char arr[10];
void kongge(char str[]);
printf("please input a number:");
scanf("%s",arr);
kongge(arr);
}
void kongge(char str[]){
int i,j;
for(i=strlen(str);i>0;i--){
str[2*i]=str[i];
str[2*i-1]=' ';
}
printf("%s",str);
}
第八章指针使用
- 利用指针从大到小排序输出
void main(){
int a,b,c;
int *p1,*p2,*p3;
scanf("%d%d%d",&a,&b,&c);
p1=&a;
p2=&b;
p3=&c;
void max_min(int *p1,int *p2,int *p3);
// void swap(int *p1,int *p2);
max_min(p1,p2,p3);
printf("%4d%4d%4d\n",a,b,c);
}
void swap(int *p1,int *p2){
int temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}
void max_min(int *p1,int *p2,int *p3){
void swap(int *p1,int *p2);
if(p1<p2)swap(p1,p2);
if(*p1<*p3)swap(p1,p3);
if(*p2<*p3)swap(p2,p3);
}
第八章 指针与结构体
8.1基础预备知识
定义指针是可以先赋予初值int *p=NULL;相当于0,有利于程序不出错
1)全局变量--内存中的静态存储区
2)非静态的局部变量--内存中的动态存储区--stack栈
3)临时使用的
4)动态存储区--堆区
Int *p=NULL;定义指针时先初始化,这是一个好习惯
获取当前时间的函数
#include<time.h>
void main()
{
time_t curtime;
time(&curtime);
printf("shijian=%s",ctime(&curtime));
}
8.2结构体变量(自定义的变量)
完整的结构体声明:struct 结构体名称{//名称可以不写,匿名结构体
成员列表1;
成员列表2;
成员列表3;
...}变量名列表;
void main(){
struct Cat{
char *name;//不一定要指针类型
int age;
char *color;
};
struct Cat cat1={"white",3,"little white"};//此方法也行,Cat是一个结构体数据类型,
//cat1是一个Cat
struct Cat cat2;//每一个变量有三个成员
//赋值相当于变量初始化,没有初始化的结构体变量是不能使用的
cat2.name="小花";
cat2.age=100;
cat2.color="花色";
printf("%s %d %s",cat1.name,cat1.age,cat1.color);
}
内存布局-->分配一块存储三个数据的内存
不同的结构体变量是相互独立的,更改cat1不会影响cat2,这两个变量的属性的地址三个都不一样
结构体可以直接赋值-->但是需要在定义完就赋值,按顺序赋值
如:cat1={“小白”,3,”白色”},cat2={“小花”,100,”花色”};
结构体变量默认是值传递
8.3结构体指针(指针类型的结构体变量)
#include<stdio.h>
#include<string.h>
struct Person
{ char name[20];
int count;
};
struct Person leader[3]={"li",0,"zhang",0,"wang",0};//结构体数组初始化
int main()
{
struct Person *p;
p=leader;
printf("%s%5d\n",p->name,p->count);//输出结构体数组元素1
p++;
printf("%s%5d\n",p->name,p->count);//输出结构体数组元素2
return 0;
}
8.4共用体
共用一个内存,大的类型更改会影响更小的变量的全部字节,占用内存小的变量更改会改变其他变量的一部分低位字节
定义格式为
Union 共用体名{
成员列表//跟结构体一样
};
8.5 C标准文件输入输出
文件输入流:存储文件
文件输出流:把内容读取出来
Gets /puts:输入和输出字符串
格式:int a[ ];
Gets(a);
Puts(a);
Getchar/putchar:得到一个字符和输出一个字符
格式:int a;
A=Getchar();
Putchar(a);
Printf/scanf:标准输入/标准输出
写入文件
void main()
{
FILE *fp=NULL; //创建一个文件指针
fp=fopen("d:/test100.txt","w+"); //打开该文件“w+”指令如果没有该文件,就创建一个,如果有,原先的内容会丢失
//“a+”可以叠加原先的内容
fprintf(fp,"/nhaobeijing\n"); //将内容写到文件中
fputs("hello,shanghai\n",fp);
fclose(fp); //关闭文件,必须要这一步,不然保存不了
printf("complate");
getchar();
}
void main()
{
FILE *fp=NULL;
char buff[1024];
//打开一个文件
fp = fopen("d:/test100.txt","r");
//把文件的一行写入到buff中
fscanf(fp,"%s",buff);
//输出这行 的内容
printf("%s",buff);
fclose(fp);
}
fgets(buff,1024,fp);//输出一行
//读取整个文件
//while(fgets(buff,1024,fp)!=NULL);//输出一行
//{
// printf("%s",buff);
// }