1. 一個C函數的問題
這個涉及到一個局部變數和全局變數重名覆蓋的問題,就是說你開始有一個全局變數int x,後來在main函數中又定義了一個int x,這就出現了一個變數重名問題,c語言中規定,如果全局變數和某個函數中的變數重名,例如程序中的那兩個x,那麼在該函數中局部變數會屏蔽掉全局變數,比如說在main函數中,你定義的 int x=10這個x會屏蔽掉你的全局變數x(就是第一行的那個int x;)
所以說在main函數中對x的所有操作,只是對局部變數x的操作。相反的在changevalue函數和modifyvalue()函數中,因為不存在和全局變數重名的局部變數,所以changevalue函數和modifyvalue函數中對x的操作,都是對全局變數x的操作。
希望你能看懂~~
2. c語言小問題
#include<stdio.h>
void func(int x)
{
x=20;
}
int main()
{
int x=10;
func(x);
printf("%d",x);
return 0;
}
-------
x沒有改變,所以是10;
如果要返回20;可以這樣寫;你對比一下;
#include<stdio.h>
int func(int x) //這里x的作用域只在這個函數內,這個x和主函數的x並不是同一個x;你可以試著改一下,將這里的x改成其他變數,結果還是一樣。
{
x=20;
return x; //這樣函數調用後,這個函數返回值為20;
}
int main()
{
int x=10;
int y;
y=func(x);
printf("%d\n",y); //x作為實參傳入func()後,不用指針的話是不能改變x的值;所以,如果這里用x的話,還是是10;
return 0;
}
3. 在應用結構體的程序中,用del()、add()、modify實現對學生成績記錄的刪除、添加和修改。程序的開頭如下:
#include <time.h>
#include<stdio.h>
#include<conio.h>
#include <stdlib.h>
#include<string.h>
#define MAX 80
void input();
void sort();
void display();
void insert();
void del();
void average();
void find();
void save();
void read();
void del_file();
void average();
void modify();
int now_no=0;
struct student
{
int no;
char name[20];
char sex[4];
float score1;
float score2;
float score3;
float sort;
float ave;
float sum;
};
struct student stu[MAX],*p;
main()/*主函數*/
{
int as;
start: printf(" 歡迎使用學生成績管理系統 ");
/*一下為功能選擇模塊*/
do
{
printf(" 1.錄入學員信息 2.顯示學員信息 3.成績排序信息 4.添加學員信息 5.刪除學員信息 6.修改學員信息 7.查詢學員信息 8.從文件讀入學員信息 9.刪除文件中學員信息 10.保存學員信息 11.退出 ");
printf(" 選擇功能選項:");
fflush(stdin);
scanf("%d",&as);
switch(as)
{
case 1:system("cls");input();break;
case 2:system("cls");display();break;
case 3:system("cls");sort();break;
case 4:system("cls");insert();break;
case 5:system("cls");del();break;
case 6:system("cls");modify();break;
case 7:system("cls");find();break;
case 8:system("cls");read();break;
case 9:system("cls");del_file();break;
case 10:system("cls");save();break;
case 11:system("exit");exit(0);
default:system("cls");goto start;
}
}while(1);
/*至此功能選擇結束*/
void del(void)
{
FILE *fp;
char a[10];
char ch;
int i,j,k;
system("cls");
printf("請輸入要刪除的學生姓名:");
scanf("%s",a);
system("cls");
fp=fopen("F:\x.txt","r");
for(i=0;i<count;i++)//找到刪除人所在的位置
{
fscanf(fp,"%s %d %d %d %d ",s[i].name,&s[i].no,&s[i].score1,&s[i].score2,&s[i].score3);
if(!strcmp(s[i].name ,a))
{
printf(" 姓名 %s 學號 %d 成績1 %d 成績2 %d 成績3 %d ",s[i].name ,s[i].no ,s[i].score1 ,s[i].score2 ,s[i].score3 );
printf(" 該同學的信息已成功刪除! ");
printf(" ");
break;
}
}
fclose(fp);
if(i==count)
{
printf(" 很抱歉,沒有您所要查找的同學記錄! ");
printf(" ");
}
else
{
for(j=i;j<count-1;j++)
{
for(k=0;k<10;k++)
{
s[j].name[k]=s[j+1].name[k];
}
s[j].no=s[j+1].no;
s[j].score1=s[j+1].score1;s[j].score2=s[j+1].score2;s[j].score3=s[j+1].score3;
}
fp=fopen("F:\x.txt","w");
fclose(fp);
fp=fopen("F:\x.txt","a");
for(j=0;j<2;j++)
{
fprintf(fp,"%s %d %d %d %d ",s[j].name,s[j].no,s[j].score1,s[j].score2,s[j].score3);
}
fclose(fp);
}
count=count-1;
}
(3)c語言modify函數功能擴展閱讀:
在C語言中,結構體(struct)指的是一種數據結構,是C語言中聚合數據類型(aggregate data type)的一類。結構體可以被聲明為變數、指針或數組等,用以實現較復雜的數據結構。結構體同時也是一些元素的集合,這些元素稱為結構體的成員(member),且這些成員可以為不同的類型,成員一般用名字訪問。
C++提供了許多種基本的數據類型(如int、float、double、char等)供用戶使用。但是由於程序需要處理的問題往往比較復雜,而且呈多樣化,已有的數據類型顯得不能滿足使用要求。因此C++允許用戶根據需要自己聲明一些類型,用戶可以自己聲明的類型還有結構體類型(structure)、共用體類型(union)、枚舉類型(enumeration)、類類型(class )等,這些統稱為用戶自定義類型(user-defined type,UDT)。
4. 跪求一道C語言題目~~~通過定義並賦初值的方式,利用結構體變數存儲2名學生的學號,姓名和三門課的成
#include<stdio.h>
constintN=2;
typedefstructStu{
charname[20];
doublechinese;
doublemath;
doubleenglish;
}Stu;
Stustu[N];
voidshow(Stus){
printf("%s %.1lf %.1lf %.1lf ",s.name,s.chinese,s.math,s.english);
}
voidmodify(Stu*s,floata){
for(inti=0;i<N;i++){
s[i].english*=a;
s[i].chinese*=a;
s[i].math*=a;
}
}
intmain(intargc,char**argv){
for(inti=0;i<N;i++){
scanf("%s%lf%lf%lf",stu[i].name,&stu[i].chinese,&stu[i].english,&stu[i].math);
}
modify(stu,0.6);
for(inti=0;i<N;i++){
show(stu[i]);
}
return0;
}
5. 求助一個C語言程序
這個程序太復雜了,不是一會就能寫完的,一會就能調試好的。復雜的程序可以外發讓熟悉的人來編寫調試,也可以找熟人編一個程序。可以的
6. c語言中,定義modify(修改)函數,出現的問題,這是其中一段:
請注意變數 m
也就是記錄總數為 m
在查不到時,循環結束時,i==m,後面的信息都存在 stu[m]中,這樣就有了 m+1條了
在存到文件中時,還是只保存了 m 條,所以,增加的一條並沒有保存到文件中
7. C語言如何在子函數中對主函數中的二維數組值進行修改 二維數組已經在主函數中用動態數組分配了空間。
用指針做函數參數可以實現!
8. c語言中dele( ),destroy( ),setEd( ),modify( )函數的功能是什麼
刪除
銷毀
創建
修改
9. C語言常用詞彙及函數有那些
常用詞彙:
1、short:修飾int,短整型數據,可省略被修飾的int。
2、long:修飾int,長整型數據,可省略被修飾的int。
3、long long:修飾int,超長整型數據,可省略被修飾的int。
4、signed:修飾整型數據,有符號數據類型。
5、unsigned:修飾整型數據,無符號數據類型。
6、restrict:用於限定和約束指針,並表明指針是訪問一個數據對象的唯一且初始的方式。
7、return:用在函數體中,返回特定值(如果是void類型,則不返回函數值)。
8、continue:結束當前循環,開始下一輪循環。
9、break:跳出當前循環或switch結構。
10、goto:無條件跳轉語句。
11、if:條件語句,後面不需要放分號。
12、else:條件語句否定分支(與if連用)。
13、switch:開關語句(多重分支語句)。
14、case:開關語句中的分支標記,與switch連用。
15、default:開關語句中的「其他」分支,可選。
常用函數:
1、int isalpha(int ch) 若ch是字母('A'-'Z','a'-'z'),返回非0值,否則返回0。
2、int isalnum(int ch) 若ch是字母('A'-'Z','a'-'z')或數字('0'-'9'),返回非0值,否則返回0。
3、int abs(int i) 返回整型參數i的絕對值。
4、double cabs(struct complex znum) 返回復數znum的絕對值。
5、double fabs(double x) 返回雙精度參數x的絕對值。
6、long labs(long n) 返回長整型參數n的絕對值。
10. C語言 指針做函數參數 的優點
首先你要認識函數傳參是怎麼進行的
函數傳參是復制形的,舉個例子說:
void modify(int a)
{
a++;
}
void main()
{
int a=5;
modify(a);
printf("%d",a);
}
這個程序的答案還是5。為什麼?
因為當調用modify(a)時,在執行modify函數時,是另外開辟了一個內存空間,將main中a的值復制過來,modify函數中所有的操作都是相對於這個新開辟的內存空間而言的,對原來的a沒有任何改變。
現在就來說說指針,如果用指針傳參的話那就完全不一樣了,指針(pointer),說白了即是指向變數內存地址。同樣上面的例子:
void modify(int * a)
{
(*a)++;
}
void main()
{
int a=5;
modify(&a);
printf("%d",a);
}
這個答案當然是6
因為你傳進去的是a的地址,所以在modify函數中的操作都是對a地址上的內容進行操作,即是操作a所以modify函數不用返回這個數,main中a的值也會改變。因為大家都是操作同一個內存空間,而上面不用指針,modify操作的是另一個新開辟的內存空間,只是這個內存空間初始值和a一樣。
現在來說說傳參,其實你「為什麼函數參數是字元串的多用指針?」 那句我不是很明白,C中的字元串傳參好像就指針一種形式(除非用結構體)。
何時用指針,何時用拷貝。當傳的參數是一個結構體,而這個結構體比較大,這時最好用指針,因為如果用拷貝的話,單單花在拷貝的時間就要浪費很多,而如果這個函數經常被調用,那麼這效率問題就出現了。
你在子函數中要對你的主調用函數中變數進行操作時也可以用指針做參數,這樣子函數就可以不用return 如果不是用指針的話,就要再子函數的未尾加上一條return x;把這個數返回當返回值。
多看點書,多寫點程序,剛開始學都會對指針比較迷茫。寫多了,自然而然就懂了。